理解为什么SQL查询花了这么长时间

时间:2015-05-28 16:20:28

标签: sql sql-server database join

我写了一个相当大的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%的时间

1 个答案:

答案 0 :(得分:0)

计划中显示的百分比(估计值和实际值)均为基于假设估计行数正确的估计值。在不良情况下,百分比可能完全错误,即使1%实际上可能是95%。

要弄清楚实际发生了什么,请启用“statistics io”。这将告诉你每个表的逻辑I / O数量 - 并且通常意味着时间也会下降。

您还可以查看实际计划,并且有许多可能导致缓慢的事情,如扫描,排序,键查找,假脱机等。如果包括统计I / O和执行计划(最好是实际的xml) ,而不仅仅是图片)弄清楚出了什么问题要容易得多。