【问题标题】:Understanding why SQL query is taking so long了解为什么 SQL 查询需要这么长时间
【发布时间】: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


【解决方案1】:

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

要弄清楚实际发生了什么,请打开“statistics io”。这将告诉您每个表的逻辑 I/O 计数——降低该计数通常意味着时间也减少了。

您还可以查看实际计划,有很多事情会导致缓慢,例如扫描、排序、键查找、假脱机等。如果您同时包含统计信息 I/O 和执行计划(最好是实际的 xml ,而不仅仅是图片)更容易找出问题所在。

【讨论】:

    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多