【发布时间】:2015-08-11 06:52:04
【问题描述】:
我编写了一个相当大的 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 大约有 300k 行。
上面的查询运行大约需要 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% 的时间
【问题讨论】:
-
@dan08,是Sql Server
-
请。错过了。有没有类似于 EXPLAIN 的东西?
-
@CathalMF,那就没办法了,等10分钟
-
@CathalMF,因为 TransBeginTime 上有索引
-
@HingeSight 这不正确。 JOIN 与 INNER JOIN 相同。
标签: sql sql-server database join