我在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秒!
有什么想法问题在哪里?
答案 0 :(得分:1)
我认为索引是问题,但不是o.DocumentStationId
,而是使用字段o.DocumentStationId连接的所有字段。
通过检查执行计划来尝试查看内部查询的工作方式。 这需要一些性能调整。
另外,请尝试使用ToStationId
和DateSend
的索引。还看看你是否可以修改内部查询。
除了这些,我没有看到任何建议。
还发布执行计划
答案 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)