我写了一个相当大的SQL查询。以下是我所看到的问题的简化。
SELECT *
FROM dbo.MyTransactionDetails TDTL
JOIN dbo.MyTransactions TRANS
on TDTL.ID = TRANS.ID
JOIN dbo.Customer CUST
on TRANS.CustID = CUST.CustID
WHERE TDTL.DetailPostTime > CONVERT(datetime, '2015-05-04 10:25:53', 120)
AND TDTL.DetailPostTime < CONVERT(datetime, '2015-05-04 19:25:53', 120)
MyTransactionDetails包含大约700万行,MyTransactions包含大约300,000行。
以上查询大约需要10分钟才能运行,这是疯狂的。所有索引都已重新编制索引,并且所有ID列都有索引。
现在,如果我将以下行添加到WHERE子句中,则查询查询大约需要1秒。
AND TRANS.TransBeginTime > CONVERT(datetime, '2015-05-05 10:25:53', 120)
AND TRANS.TransBeginTime < CONVERT(datetime, '2015-05-04 19:25:53', 120)
我知道数据库的内容和TransBeginTime几乎与DetailPostTime相同所以这些额外的where子句不应该比JOIN过滤得多。
为什么加快这些速度呢?
问题是我无法在TransBeginTime上使用过滤器,因为无法保证交易详细信息将在同一天发布。
编辑:我还应该补充一点,执行计划表明,MyTransactionDetails占用了50%的时间
答案 0 :(得分:0)
计划中显示的百分比(估计值和实际值)均为基于假设估计行数正确的估计值。在不良情况下,百分比可能完全错误,即使1%实际上可能是95%。
要弄清楚实际发生了什么,请启用“statistics io”。这将告诉你每个表的逻辑I / O数量 - 并且通常意味着时间也会下降。
您还可以查看实际计划,并且有许多可能导致缓慢的事情,如扫描,排序,键查找,假脱机等。如果包括统计I / O和执行计划(最好是实际的xml) ,而不仅仅是图片)弄清楚出了什么问题要容易得多。