為您的聚簇索引尋找更好的候選人

2021-08-29 18:44:23 字數 2135 閱讀 4581

為了描述這個技巧,我們將使用adventureworks資料庫的一張表並查詢這張表。我使用的這張表是person.address。下面的螢幕截圖顯示了這張表當前的結構。我們可以看到在這張表有四個索引。

圖一為了蒐集一些索引使用資料,我將在adventureworks資料庫中執行下面的查詢5次。

select addressline1, addressline2 from person.address

where stateprovinceid = 1

圖二這個索引查詢掃瞄乙個非聚簇索引來查詢與提供值匹配的記錄。

關鍵查詢用於查詢聚簇索引中的實際資料。

要看這些索引實際上是如何使用的,我們可以執行下面的查詢。

select object_name(s.[object_id]) as [object name], i.[name] as [index name],

user_seeks,

user_scans,

user_lookups,

user_updates

from sys.dm_db_index_usage_stats as s

inner join sys.indexes as i

on i.[object_id] = s.[object_id]

and i.index_id = s.index_id

where object_name(s.[object_id]) = 'address'

由於我在執行這些測試之前就重啟了sql server,所以我的數字應該匹配我執行的5個查詢執行。我們可以看到sql server 在索引ix_address_stateprovinceid(非聚簇索引)上做user_seek達5次,也在索引pk_address_addressid(聚簇索引)上做user_lookup達5次。這符合上面我們第一次進行的執行計畫然後我們做乙個關鍵查詢來獲得另外的資料的情況。

圖三既然我們知道了自己想把stateprovinceid當作聚簇索引來使用,因此我們需要進行下面一些步驟。我們需要刪除現有的主鍵/聚簇索引,但是由於外碼參照了這張表,因此我們也需要刪除它們。下面的查詢教你怎樣刪除外碼、主碼並建立新的聚簇索引。在乙個實際情況下,你可能想重新建立這個主碼,也想輸出這些外碼的建立,因此在你做了這些更改之後,你可能會重新建立它們。

alter table [humanresources].[employeeaddress] drop constraint [fk_employeeaddress_address_addressid] alter table [sales].[customeraddress] drop constraint [fk_customeraddress_address_addressid]

alter table [purchasing].[vendoraddress] drop constraint [fk_vendoraddress_address_addressid]

alter table [sales].[salesorderheader] drop constraint [fk_salesorderheader_address_shiptoaddressid]

alter table [sales].[salesorderheader] drop constraint [fk_salesorderheader_address_billtoaddressid]

alter table person.address drop constraint pk_address_addressid

create clustered index ix_stateprovinceid on person.address(stateprovinceid)

現在既然我們建立了新的聚簇索引,那麼我們可以重新查詢這張表並看到新的執行計畫是什麼樣的。

select addressline1, addressline2 from person.address

where stateprovinceid = 1

下面顯示現在我們有乙個聚簇索引,不再有關鍵查詢。

圖四如果我們查詢這個索引使用統計資料,我們也可以看到它們的差異。現在我們只有user_seeks,而不再有user_lookups。要注意的一點是當你更改一張表上的索引時,這些統計資料將重置為0。所以看起來這些改變對於我們的表來說是一種成功。

圖五

聚簇索引與非聚簇索引的區別

聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣。聚集索引對於那些經常要搜尋範圍值的列特別有效。使用聚集索引找到包含第乙個值的行後,便可...

聚簇索引與非聚簇索引的區別

通常情況下,建立索引是加快查詢速度的有效手段。但索引不是萬能的,靠索引並不能實現對所有資料的快速訪問。事實上,如果索引策略和資料檢索需求嚴重不符的話,建立索引反而會降低查詢效能。因此在實際使用當中,應該充分考慮到索引的開銷,包括磁碟空間的開銷及處理開銷 如資源競爭和加鎖 例如,如果資料頻繁的更新或刪...

聚簇索引和非聚簇索引的區別

聚簇索引和非聚簇索引 1 定義 聚簇索引的順序就是資料的物理儲存順序 非聚簇索引的解釋是 索引順序與資料物理排列順序無關。2 索引底層實現結構是b 樹,二叉樹的一種 聚簇索引 索引的葉節點就是資料節點 索引值 而非聚簇索引的葉節點仍然是索引節點 告訴你怎麼在表中查詢這一記錄 只不過有乙個指標指向對應...