2012-08-06 68 views
17

減少聚集索引掃描成本如何降低下面提到查詢如何通過使用SQL查詢

DECLARE @PARAMVAL varchar(3) 

set @PARAMVAL = 'CTD' 
select * from MASTER_RECORD_TYPE where [email protected] 

的聚集索引掃描的成本,如果我運行上面的查詢它顯示索引掃描99%

這裏

enter image description here

下面我貼我的索引表:

請在這裏找到我下面的表特殊性

CREATE TABLE [dbo].[MASTER_RECORD_TYPE] ADD CONSTRAINT [PK_MASTER_REPORD_TYPE] PRIMARY KEY CLUSTERED 
(
    [Record_Type_Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY] 
GO 

請告訴我如何降低索引掃描成本?

回答

23

首先 - 如果搜索RECORD_TYPE_CODE你應該確保有在該列的索引。

除此之外主要有兩點:

  • 使用SELECT * - 那會總是要回去的聚集索引,以獲得完整的數據頁;使用SELECT明確指定使用

  • 如果有可能,儘量找到一種方法,有一個覆蓋非聚集索引,例如其列包含滿足查詢

所需的所有列。如果你有這樣的覆蓋非聚簇索引的索引,那麼查詢優化器將最有可能使用覆蓋索引(而不是它是完整的實際聚集索引表中的數據),以獲取結果

+0

感謝您的及時回覆,你可以請指導我創建一個覆蓋非聚集索引,被列入該指數是什麼鍵你能幫助我的隊友對這個 – user1494292 2012-08-06 10:35:59

+1

創建非聚集索引[MST_IDX_FOR_REC_TYPE ] ON [dbo]。[MASTER_RECORD_TYPE] ( \t [Record_Type_Code] ASC )WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,SORT_IN_TEMPDB = OFF,IGNORE_DUP_KEY = OFF,DROP_EXISTING = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY ] GO現在索引掃描已經變成索引查找的100% – user1494292 2012-08-06 10:59:03

+1

@ user1494292:好的 - 所以現在你有**索引尋找** - 這是最有效(最快)的方式來獲取(幾行的)數據 – 2012-08-06 11:04:55

0

你需要嘗試和使用覆蓋索引。但是你將遇到的問題是你正在使用SELECT *。你真的需要整個記錄嗎?

無論哪種方式,增加RECORD_TYPE_CODE到另一個指標,它會與查詢幫助,因爲至少該字段可以讀出一個索引頁。

+0

喜隊友,感謝您的及時答覆,即使如果我使用從Master_record_type選擇1然後也相同的索引掃描成本它投擲 – user1494292 2012-08-06 10:33:20

0

在您的查詢中,您使用的列不是clustered index的一部分,也未包含在non-clustered index中。因此,SQL Optimizer將決定掃描聚集索引來比較where子句謂詞。

Why is there a scan on my clustered index?

+0

嗯,是它是聚集索引=表的一部分。沒有其他索引。 – Suncat2000 2017-08-16 18:12:26