第8 24周 覆蓋索引 臨界點

2021-09-06 23:21:31 字數 1838 閱讀 8458

時間過得真快——再過幾分鐘,你就要完成第2個月的效能調優培訓。今天這部分培訓我想講下非聚集索引的更多資訊,還有你會碰到它的一些負作用。

。我們來看下。

在sql server裡覆蓋索引是傳統的非聚集索引。唯一的區別是覆蓋非聚集索引可以包含給出查詢所有需要的列。這就是說使用覆蓋索引可以避免書籤查詢。我們來看乙個非常簡單的例子。下列的查詢會產生書籤查詢,因為postalcode列不是非聚集索引ix_address_stateprovinceid

1

select

2addressid,

3postalcode

4from

person.address

5where stateprovinceid =426

go

這個查詢本身產生18個邏輯讀。你可以通過定義覆蓋非聚集索引,拿掉這個查詢的書籤查詢。就是說,我們需要包含postalcode列,在非聚集索引的葉子層。

1

create

nonclustered

index idxaddress_stateprovinceid on

2person.address (stateprovinceid)

3include (postalcode)

4go

當你再次執行這個查詢時,從執行計畫裡你可以看到書籤查詢已經不見了,sql server使用索引查詢(非聚集索引)運算子。邏輯讀減少為2個。非常顯著的效能提公升!

唯一你要知道的是,並不是每個書籤查詢都是非常危險的。我們的目標不是移除每個書籤查詢,只有壞的才移除。

在一些情況下,當sql server對指定查詢進行書籤查詢操作時,它可以決定書籤查詢太耗資源了(根據必須的邏輯讀)。在那個情況下,sql server會進行全表掃瞄,而忽略所有的非合格列。做出這個決定點位置,在sql server裡被稱為臨界點(tipping point)。臨界點就是sql server用來決定是進行書籤查詢還是全表掃瞄。

臨界點躲在你查詢需要讀取頁數的1/4到1/4的某個位置。這和你需要讀取的記錄數無關(因為記錄的大小決定了1頁裡你可以存放多少記錄)。對於這個非常簡單的例子,我定義的表裡每條記錄長度是400 bytes長,這就是在8k的頁裡可以存放20條記錄。另外我在value列定義了乙個非聚集索引。下面的查詢使用書籤查詢返回1061條記錄。

1

select

*from

customers

2where value <

1062

3go

如果獲取更多一條記錄,作為特殊情況的下面查詢就會臨界點上,然後sql server就會掃瞄整個表。

1

select

*from

customers

2where value <

1063

3go

2個近乎一樣的查詢,卻有完全不同的執行計畫!這在某些情況下會是個巨大的問題,因為你的計畫穩定性不再。過去幾年我與很多不同客戶打交道時,因為這個問題,它們的sql server近乎發瘋。sql server臨界點遊戲——為什麼非聚集索引被忽略!

在這一部分的效能調優培訓裡,你學習了sql server裡的覆蓋非聚集索引還有臨界點。在你學習的4個星期裡,索引在sql server裡可以說是個很神奇的東西!

0713_08_覆蓋索引、臨界點.rar

mysql 覆蓋索引 簡書 覆蓋索引

覆蓋索引 1 當發起乙個被索引覆蓋的查詢時,在explain的extra列可以看到using index的資訊,此時就使用了覆蓋索引 mysql explain select store id,film id from inventory g 1.row id 1 select type table...

MySQL覆蓋索引呼叫 MySQL 覆蓋索引

什麼是覆蓋索引 建立乙個索引,該索引包含查詢中用到的所有字段,稱為 覆蓋索引 使用覆蓋索引,mysql 只需要通過索引就可以查詢和返回查詢所需要的資料,而不必在使用索引處理資料之後再進行回表操作。覆蓋索引可以一次性完成查詢工作,有效減少io,提高查詢效率。使用示例 查詢語句 select col2,...

MySQL 索引 覆蓋索引

1.什麼是覆蓋索引?概念 查詢語句中所需要的列在索引中,這樣查詢結果在索引的資料結構中查詢即可拿到結果。附加解釋 2.形成覆蓋索引的條件索引分為多種型別,從資料結構上分為 二叉樹 紅黑樹 hash索引 b tree索引,b tree mysql使用的儲存結構 索引的實現可以使用多種資料結構,這裡使用...