降低SQL查询的CPU成本

时间:2013-03-25 14:47:24

标签: sql sql-server-2008 query-optimization

我有一个如下查询,其中table150k有150k记录,table3m有3m记录。在我们的生产服务器上,我们必须非常频繁地为单个记录运行此查询。这会耗费大量的CPU功率。

select t.id, t1.field1 as f1, t2.field1 as f2, t3.field1 as f3, ..., t12.field1 as f12
from table150k t
inner join table3m t1 on t1.fk = t.id and t1.[type] = 1
inner join table3m t2 on t2.fk = t.id and t2.[type] = 2
inner join table3m t3 on t3.fk = t.id and t3.[type] = 3
...
inner join table3m t12 on t12.fk = t.id and t12.[type] = 12
where t.id = @id

当我从此查询中删除内部联接时,它可以正常工作。当它们被包含在内时,我们的服务器会受到cpu的影响。

我应该如何优化此查询,数据结构或方案,以便频繁提取数据不会使cpu成本过高?

4 个答案:

答案 0 :(得分:2)

您有table3m(fk)的索引吗?

那应该解决你的问题。

另一种表述是:

select t.id,
       max(case when m.[type] = 1 then field end) as field1,
       max(case when m.[type] = 2 then field end) as field2,
       . . .
       max(case when m.[type] = 12 then field end) as field12
from table150k t join
     table3m m
     on m.fk = t.id and m.[type] in (1,2,3,4,5,6,7,8,9,10,11,12)
where t.id = @id
group by t.id

此结构的所有数据都来自“3m”表中的同一列。

答案 1 :(得分:0)

如果两个表中的数据不经常更改,我会按照另一种方法创建一个缓存表(只是另一个表),它只保存上述查询的结果。

答案 2 :(得分:0)

试试这个:

select *
from table150k t
inner join table3m t1 on t1.fk = t.id and t1.[type] in (1,2,3,4,5,6,7,8,9,10,11,12)
where t.id = @id

答案 3 :(得分:0)

select t.id, t1.type, t1.field1
from table150k as t
inner join table3m as t1 on t1.fk = t.id 
where t.id = @id and t1.[type] in (1,2,3,4,5,6,7,8,9,10,11,12)

这将带回12条记录(假设它们都存在)。

这里的优点是服务器端的速度,缺点是你必须根据类型值将每个记录映射到数据表中的相应列或对象上的值一旦进入应用程序。