-1

一个聚集索引已经在两个dw_assesment_detailsdw_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 

但上面的选择查询使用索引扫描生成 - 没有索引查找。如何使用索引查找呢?

任何性能调整专家的建议?

enter image description here

+2

您正在读取所有数据,并且这两个表具有以相同顺序显示数据的索引。你**不要**索引寻求 – Caleth

+2

你可能想阅读[RBarry Young对此问题的回答](https://stackoverflow.com/questions/6528906/why-is-this-an-index-scan - 和 - 不一个索引,搜索) –

回答

1

在SQL Server中,集群或者非聚集索引表搜索改变索引扫描,直到我们没有添加条件Where子句。

Where子句将索引作为执行计划。 没有Where子句它充当索引扫描来搜索整个表格数据。 这就是为什么索引扫描总是很慢。

2

如何使用索引查找呢?

如果您想尝试并取代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 
相关问题