我有一个关于对于超过30分钟,运行一个很简单的查询性能问题:聚集JOIN性能问题(SQL SERVER)
SELECT P.pID
,COUNT(T1.ID) AS NB1
,COUNT(T2.ID) AS NB2
,COUNT(T3.ID) AS NB3
,COUNT(T4.ID) AS NB4
,COUNT(T5.ID) AS NB5
FROM MainTable P
LEFT OUTER JOIN Table1 T1 ON P.pID = T1.pID
LEFT OUTER JOIN Table2 T2 ON P.pID = T2.pID
LEFT OUTER JOIN Table3 T3 ON P.pID = T3.pID
LEFT OUTER JOIN Table4 T4 ON P.pID = T4.pID
LEFT OUTER JOIN Table5 T5 ON P.pID = T5.pID
GROUP BY P.pID
凡为每个查询会在几毫秒回复:
ex。
SELECT P.pID
,COUNT(T1.ID) AS NB1
FROM MainTable P
LEFT OUTER JOIN Table1 T1 ON P.pID = T1.pID
GROUP BY P.pID
如果我不使用任何聚合(COUNT或其他任何东西)查询运行在几毫秒: 前。 SELECT P.pID
FROM MainTable P
LEFT OUTER JOIN Table1 T1 ON P.pID = T1.pID
LEFT OUTER JOIN Table2 T2 ON P.pID = T2.pID
LEFT OUTER JOIN Table3 T3 ON P.pID = T3.pID
LEFT OUTER JOIN Table4 T4 ON P.pID = T4.pID
LEFT OUTER JOIN Table5 T5 ON P.pID = T5.pID
GROUP BY P.pID
显然,所有指标都设置等等 唯一的“放缓”元素是pid是一个varchar(50),但我不能改变它,在我看来这这里不是主要问题。
我使用了一个解决方法,包括所有工作正常的工会,但我真的想知道为什么这些是如此之久,我怎么可以优化这一点作为聚合多个左连接是真正常见的报告项目的东西,不应该这么慢。
谢谢你的帮助。
[编辑] thx到ARION我有一个很好的查询工作真的很好。
但我主要关心的是了解在用多个左连接编写查询的sql引擎中出现了什么问题。
表DESCR是:在social.msdn.microsoft.com
Table P (500 rows)
pID varchar(50) NOT NULL as primary key
p.* doesn't matter
Table Tn (between 2000 and 8000 rows)
Tn.ID int NOT NULL as primary key
pID varchar(50) NOT NULL as Foreign key
[编辑]由于厄兰Sommarskog指向我,我的分析误差。 - 详细介绍一下答案
请记住:
LEFT JOIN表笛卡尔乘积
我错了假设笛卡尔乘积可能已被过滤,因为我总是参考,以相同的表。
感谢
我们需要查看一些数据样本和表格统计信息 – cctan 2012-02-13 10:23:50
原始查询的问题不是(仅)缓慢。如果'Tx'表中的行具有普通的'pID',它也可能给出错误的结果。 – 2012-02-13 14:46:26