1

我有一个如下查询,其中 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

4 回答 4

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”表中的同一列。

于 2013-03-25T14:50:14.233 回答
0

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

于 2013-03-25T14:51:06.773 回答
0

Try this:

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
于 2013-03-25T14:51:47.613 回答
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 条记录(假设它们都存在)。

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

于 2013-03-25T15:06:07.617 回答