-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 
相關問題