【发布时间】:2011-10-04 15:23:17
【问题描述】:
我对包含数百万行的表进行了数据透视查询。正常运行查询,运行2秒,返回2983行。如果我将 TOP 1000 添加到查询中,则需要 10 秒才能运行。
这可能是什么原因造成的?
SELECT *
FROM (SELECT l.PatientID,
l.LabID,
l.Result
FROM dbo.Labs l
JOIN (SELECT MAX(LabDate) maxDate,
PatientID,
LabID
FROM dbo.Labs
GROUP BY PatientID, LabID) s ON l.PatientID = s.PatientID
AND l.LabID = s.LabID
AND l.LabDate = s.maxDate) A
PIVOT(MIN(A.Result) FOR A.LabID IN ([1],[2],[3],[4],[5],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17])) p
执行计划:
这个替代公式有同样的问题:
select
*
FROM (
SELECT
l.PatientID,
l.LabID,
l.Result
FROM dbo.Labs l
where l.LabDate = (
select
MAX(LabDate)
from Labs l2
where l2.PatientID = l.PatientID
and l2.LabID = l.LabID
)
) A
PIVOT(MIN(A.Result) FOR A.LabID IN ([1],[2],[3],[4],[5],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17])) p
【问题讨论】:
-
您查看过每个查询版本的查询计划吗?
-
你在哪里添加
TOP 1000? -
TOP 版本有两个聚集索引扫描,普通版本有一个。我不知道这意味着什么。
-
@Quassnoi 在第一个 SELECT @OMG Ponies 2008R2 之后
-
您将
TOP放在查询中的什么位置?
标签: sql sql-server tsql sql-server-2008 pivot