我有一个相当大的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表只有约30万行。
以上查询大约需要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进行筛选,因为不能保证交易明细将在同一日期发布。
编辑:我还应该补充的是,执行计划显示50%的时间被MyTransactionDetails占用。