同一查询的执行时间不同 - SQL Server 2008 R2

时间:2014-04-09 08:07:00

标签: sql sql-server performance

我在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秒!

有什么想法问题在哪里?

3 个答案:

答案 0 :(得分:1)

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

通过检查执行计划来尝试查看内部查询的工作方式。 这需要一些性能调整。

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

除了这些,我没有看到任何建议。

还发布执行计划

答案 1 :(得分:1)

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

答案 2 :(得分:0)

尝试以下查询。还要检查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)