三 索引優化(6)篩選索引

2021-09-03 06:31:13 字數 3119 閱讀 5521

一、概念

篩選索引是一種經過優化的非聚集索引,尤其適用於涵蓋從定義完善的資料子集中選擇資料的查詢。篩選索引使用篩選謂詞對錶中的部分行進行索引。

二、優勢

篩選索引與全表索引相比具有以下優點:

(1)提高了查詢效能和計畫質量

設計良好的篩選索引可以提高查詢效能和執行計畫質量,因為它比全表非聚集索引小並且具有經過篩選的統計資訊。與全表統計資訊相比,經過篩選的統計資訊更加準確,因為它們只涵蓋篩選索引中的行。

(2)減少了索引維護開銷

僅在資料操作語言 (dml) 語句對索引中的資料產生影響時,才對索引進行維護。與全表非聚集索引相比,篩選索引減少了索引維護開銷,因為它更小並且僅在對索引中的資料產生影響時才進行維護。篩選索引的數量可以非常多,特別是在其中包含很少受影響的資料時。同樣,如果篩選索引只包含頻繁受影響的資料,則索引大小較小時可以減少更新統計資訊的開銷。

(3)減少了索引儲存開銷

在沒必要建立全表索引時,建立篩選索引可以減少非聚集索引的磁碟儲存開銷。可以使用多個篩選索引替換乙個全表非聚集索引而不會明顯增加儲存需要。

三、設計注意事項

為了設計有效的篩選索引,必須了解應用程式使用哪些查詢以及這些查詢與您的資料子集有何關聯。例如,所含值中大部分為 null 的列、含異類類別的值的列以及含不同範圍的值的列都屬於具有定義完善的子集的資料。以下設計注意事項提供了篩選索引優於全表索引的各種情況。

1. 資料子集的篩選索引

在列中只有少量相關值需要查詢時,可以針對值的子集建立篩選索引。例如,當列中的值大部分為 null 並且查詢只從非 null 值中進行選擇時,可以為非 null 資料行建立篩選索引。由此得到的索引與對相同鍵列定義的全表非聚集索引相比,前者更小且維護開銷更低。

例如,adventureworks2008r2 資料庫中有乙個包含 2679 行的 production.billofmaterials 表。enddate 列只有 199 行包含非 null 值,其餘 2480 行均包含 null。下面的篩選索引將涵蓋這樣的查詢:返回在此索引中定義的列的查詢,以及只選擇 enddate 值不為 null 的行的查詢。

use adventureworks2008r2;

goif exists (select name from sys.indexes

where name = n'fibillofmaterialswithenddate'

and object_id = object_id (n'production.billofmaterials'))

drop index fibillofmaterialswithenddate

on production.billofmaterials

gocreate nonclustered index fibillofmaterialswithenddate

on production.billofmaterials (componentid, startdate)

where enddate is not null ;

goselect productassemblyid, componentid, startdate 

from production.billofmaterials

where enddate is not null 

and componentid = 5 

and startdate > '01/01/2008' ;

go2. 異類資料的篩選索引

表中含有異類資料行時,可以為一種或多種類別的資料建立篩選索引。

例如,production.product 表中列出的每種產品均分配到乙個 productsubcategoryid,後者又與 bikes、components、clothing 或 accessories 產品類別關聯。這些類別為異類類別,因為它們在 production.product 表中的列值並不是緊密相關的。例如,對於每種產品類別,color、reorderpoint、listprice、weight、class 和 style 均具有唯一特徵。假設會經常查詢具有子類別 27-36 的 accessories。通過對 accessories 子類別建立篩選索引,可以提高對 accessories 的查詢的效能。

use adventureworks2008r2;

goif exists (select name from sys.indexes

where name = n'fiproductaccessories'

and object_id = object_id ('production.product'))

drop index fiproductaccessories

on production.product;

gocreate nonclustered index fiproductaccessories

on production.product (productsubcategoryid, listprice) 

include (name)

where productsubcategoryid >= 27 and productsubcategoryid <= 36;

goselect name, productsubcategoryid, listprice

from production.product

where productsubcategoryid = 33 and listprice > 25.00 ;

go 篩選索引 fiproductaccessories 涵蓋上面的查詢,因為查詢結果包含在該索引中,並且查詢計畫不包括基表查詢。例如,查詢謂詞表示式 productsubcategoryid = 33 是篩選索引謂詞 productsubcategoryid >= 27 和 productsubcategoryid <= 36 的子集,查詢謂詞中的 productsubcategoryid 和 listprice 列全都是索引中的鍵列,並且名稱作為包含列儲存在索引的葉級別。

篩選索引提高了查詢效能和計畫質量,減少了索引維護開銷,還可以減少非聚集索引的磁碟儲存開銷。

三 索引優化(6)篩選索引

一 概念 篩選索引是一種經過優化的非聚集索引,尤其適用於涵蓋從定義完善的資料子集中選擇資料的查詢。篩選索引使用篩選謂詞對錶中的部分行進行索引。二 優勢 篩選索引與全表索引相比具有以下優點 1 提高了查詢效能和計畫質量 設計良好的篩選索引可以提高查詢效能和執行計畫質量,因為它比全表非聚集索引小並且具有...

三 索引優化(6)篩選索引

一 概念 篩選索引是一種經過優化的非聚集索引,尤其適用於涵蓋從定義完善的資料子集中選擇資料的查詢。篩選索引使用篩選謂詞對錶中的部分行進行索引。二 優勢 篩選索引與全表索引相比具有以下優點 1 提高了查詢效能和計畫質量 設計良好的篩選索引可以提高查詢效能和執行計畫質量,因為它比全表非聚集索引小並且具有...

MySQL優化(三) 索引原理及索引優化

b tree索引,它是目前關係型資料庫中查詢資料最為常用和有效的索引,大多數儲存引擎都支援這種索引。使用b tree這個術語,是因為mysql在create table或其它語句中使用了這個關鍵字,但實際上不同的儲存引擎可能使用不同的資料結構,比如innodb就是使用的b tree。中的b是指bal...