我有两张大桌子
- 主表A:1.4百万行
- 详细表B:900万行
B有A的外键。
基本上我需要表A +中的所有25个细节字段,在这种情况下是B的计数。
现在我有以下伪查询:
Select
A.field1,
A.field2,
...
A.field25,
Count(b.id)
from
A left outer join B on B.fkAid = A.id
Group by
A.id,
A.field1,
A.field2,
...
A.field25
Order by A.field1
查询计划显示分组需要花费大量时间(毫不奇怪)。
有没有更有效的方法来做这种选择?
答案 0 :(得分:3)
如何使用公用表表达式(您将其标记为SQL Server 2008?)
WITH CountB AS
(
SELECT A.aId, value= Count(*)
FROM A left outer join B on B.fkAid = A.id
GROUP BY A.id
)
Select
A.field1,
A.field2,
...
A.field25,
CountB.value
from
A left outer join CountB on A.id = CountB.aId
Order by A.field1
答案 1 :(得分:2)
您可以尝试使用相关子查询 - 但效率可能更低:
Select
A.field1,
A.field2,
...
A.field25,
(select Count(*) from B where B.fkAid = A.id)
from
A
Order by A.field1
如果没有WHERE子句,我实际上期望左连接和分组更有效,除非表A中的列非常宽。
另一种可能性是:
Select
A.field1,
A.field2,
...
A.field25,
Coalesce(b.Cnt,0)
from
A left join
(select fkAid,COUNT(*) from B group by fkAId) b (ID,Cnt)
on A.ID = b.ID
Order by A.field1
在没有涉及where子句的情况下,这可能是最好的。
答案 2 :(得分:0)
您可以尝试使用OUTER APPLY
:
Select
A.field1,
A.field2,
...
A.field25,
C.Quant
from
A OUTER APPLY (SELECT COUNT(*) Quant FROM B WHERE A.id = B.fkAid) AS C
Order by A.field1