为什么这是一个索引扫描而不是一个索引查找
问题描述:
一个聚集索引已经在两个dw_assesment_details
和dw_assesment_details_id
表为什么这是一个索引扫描而不是一个索引查找
/* 6 minutes */
CREATE CLUSTERED INDEX [Ix_DW_ASSESSMENT_DETAILS_qid_QNO_TmpverName]
ON [dbo].[DW_ASSESSMENT_DETAILS_QUESTION_ID]
(
[TEMPLATENAME] ASC,
[TEMPLATEVERSION] ASC,
[QUESTION_NO] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
/* 9 minutes */
CREATE CLUSTERED INDEX [Ix_DW_ASSESSMENT_DETAILS_QNO_TmpverName]
ON [dbo].[DW_ASSESSMENT_DETAILS]
(
[TEMPLATENAME] ASC,
[TEMPLATEVERSION] ASC,
[QUESTION_NO] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
SELECT
[GETQUESTIONID],
dw.[TEMPLATENAME], dw.[TEMPLATEVERSION],
dw.[QUESTION_NO]
FROM
[QIS_DW].[dbo].[DW_ASSESSMENT_DETAILS] dw
INNER JOIN
[QIS_DW].[dbo].[DW_ASSESSMENT_DETAILS_QUESTION_ID] id ON dw.TEMPLATENAME = id.TEMPLATENAME
AND dw.TEMPLATEVERSION = id.TEMPLATEVERSION
AND dw.QUESTION_NO = id.QUESTION_NO
但上面的选择查询使用索引扫描生成 - 没有索引查找。如何使用索引查找呢?
任何性能调整专家的建议?
答
在SQL Server中,集群或者非聚集索引表搜索改变索引扫描,直到我们没有添加条件Where子句。
Where子句将索引作为执行计划。 没有Where子句它充当索引扫描来搜索整个表格数据。 这就是为什么索引扫描总是很慢。
答
如何使用索引查找呢?
如果您想尝试并取代SQL Server优化器,则可以指定LOOP JOIN
查询提示。我希望与MERGE JOIN
的计划在许多行上表现更好。
请注意,存储引擎也可能在大型扫描期间执行异步预读,以便将数据预取到内存中,以便它可用于查询而无需等待从存储中读取数据。对于返回少量行的查找,不会发生预读。
请尝试下面的查询,看看您的环境中是否属于这种情况。
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
GO
SELECT
[GETQUESTIONID],
dw.[TEMPLATENAME], dw.[TEMPLATEVERSION],
dw.[QUESTION_NO]
FROM
[QIS_DW].[dbo].[DW_ASSESSMENT_DETAILS] dw
INNER JOIN
[QIS_DW].[dbo].[DW_ASSESSMENT_DETAILS_QUESTION_ID] id ON dw.TEMPLATENAME = id.TEMPLATENAME
AND dw.TEMPLATEVERSION = id.TEMPLATEVERSION
AND dw.QUESTION_NO = id.QUESTION_NO;
GO
SELECT
[GETQUESTIONID],
dw.[TEMPLATENAME], dw.[TEMPLATEVERSION],
dw.[QUESTION_NO]
FROM
[QIS_DW].[dbo].[DW_ASSESSMENT_DETAILS] dw
INNER JOIN
[QIS_DW].[dbo].[DW_ASSESSMENT_DETAILS_QUESTION_ID] id ON dw.TEMPLATENAME = id.TEMPLATENAME
AND dw.TEMPLATEVERSION = id.TEMPLATEVERSION
AND dw.QUESTION_NO = id.QUESTION_NO
OPTION(LOOP JOIN);
GO
您正在读取所有数据,并且这两个表具有以相同顺序显示数据的索引。你**不要**索引寻求 – Caleth
你可能想阅读[RBarry Young对此问题的回答](https://stackoverflow.com/questions/6528906/why-is-this-an-index-scan - 和 - 不一个索引,搜索) –