【发布时间】:2011-11-29 08:44:47
【问题描述】:
我在表 A 上有两个非聚集索引:
-
detected_utc索引
键列:DETECTED_UTC ASC
包含的列:APPROVAL_STATUS、IS_ROOT、AGENTGUID
-
agentguid索引
键列:agentguid
现在查询正在使用agentguid 索引,耗时 1 分 17 秒。
但是如果我指定一个查询提示,比如
option (table hint(A, index(DETECTED_UTC)))
需要 4 秒。
为什么 SQL Server 没有在查询计划中考虑 detected_utc。可以修改查询以使其使用detected_utc 索引。我不想在我的查询中指定查询提示。
SELECT
AUTO_ID
FROM
(
SELECT
ROW_NUMBER() OVER ( ORDER BY A.DETECTED_UTC DESC ) AS ROWNUM
, A.AUTO_ID
, A.DETECTED_UTC
FROM
A
INNER JOIN B
ON A.AGENTGUID = B.AgentGUID
LEFT JOIN C
ON B.ParentID = C.AutoID
WHERE
( DETECTED_UTC > DATEADD(day, -7, GETUTCDATE()) )
AND ( APPROVAL_STATUS = '0' )
AND IS_ROOT = '1'
AND EXISTS ( SELECT
1
FROM
B epf
WHERE
epf.AgentGUID IS NOT NULL
AND epf.AgentGUID = A.AGENTGUID
AND epf.ParentID IN (
SELECT
AutoID
FROM
C
WHERE
AutoID IN ( SELECT
NodeID
FROM
D
WHERE
D.GroupID IN ( 42 ) ) ) )
) AS TEMP
WHERE
ROWNUM >= 1000
AND ROWNUM < 1041
ORDER BY
DETECTED_UTC DESC
【问题讨论】:
-
您是否尝试过更新统计信息? (sp_updatestats)
-
可能是您的统计信息已过时。尝试使用
UPDATE STATISTICS A WITH FULLSCAN更新统计信息 -
我正在使用 sqlserver2008,我尝试使用全扫描选项更新统计信息,但仍然没有使用检测到的_utc 索引
标签: sql sql-server indexing