【问题标题】:Different execution time for same query - SQL Server 2008 R2同一查询的不同执行时间 - SQL Server 2008 R2
【发布时间】:2014-04-12 11:10:45
【问题描述】:

我在 SqlServer 2008 R2 中运行此查询,大约需要 6 秒并返回大约 8000 条记录。 OrderItemView 是视图,DocumentStationHistory 是表。

SELECT  o.Number, dsh.DateSend AS Expr1
FROM    OrderItemView AS o INNER JOIN
        DocumentStationHistory AS dsh ON dsh.DocumentStationHistoryId =
            (SELECT TOP (1) DocumentStationHistoryId
             FROM         DocumentStationHistory AS  dsh2
             WHERE     (o.DocumentStationId = ToStationId) AND 
             (DocumentId =   o.id)
             ORDER BY DateSend DESC)
WHERE     (o.DocumentStationId = 10)   

但是当我使用 o.DocumentStationId = 8 where 子句运行相同的查询时,它会返回大约 200 条记录,但需要大约 90 秒!

你知道问题出在哪里吗?

【问题讨论】:

  • 查看查询计划了解详情。我假设,优化器会根据您的更改选择不同的计划。
  • o.DocumentStationId 上有索引吗?
  • 或者它可能使用相同的缓存计划并产生相同的后果。比较两个查询的实际执行计划并报告。

标签: sql sql-server performance


【解决方案1】:

我认为索引是问题,但不是o.DocumentStationId,而是使用字段o.DocumentStationId 连接的所有字段。

尝试通过检查执行计划来了解您的内部查询是如何工作的。 这将需要一些性能调整。

另外,尝试使用ToStationIdDateSend 的索引。也看看你是否可以修改内部查询。

除此之外,我没有看到任何建议。

同时发布你的执行计划

【讨论】:

    【解决方案2】:

    我在o.DocumentStationId 上重建了索引,问题解决了。

    【讨论】:

      【解决方案3】:

      尝试以下查询。还要检查 DocumentStationId、ToStationId 和 DocumentId 上是否有任何索引。如果不创建它们

      SELECT o.Number, dsh.DateSend AS Expr1
      FROM OrderItemView AS o 
      OUTER APPLY
          (SELECT TOP (1) DateSend 
              FROM DocumentStationHistory
              WHERE (o.DocumentStationId = ToStationId) AND (DocumentId = o.id) 
              ORDER BY DateSend DESC) AS dsh
      WHERE (o.DocumentStationId = 10) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多