具有包含性列的索引

2021-09-07 07:50:46 字數 2184 閱讀 5915

在 sql server 2005 中,可以通過將非鍵列新增到非聚集索引的葉級別來擴充套件非聚集索引的功能。通過包含非鍵列,可以建立覆蓋更多查詢的非聚集索引。這是因為非鍵列具有下列優點:

當查詢中的所有列都作為鍵列或非鍵列包含在索引中時,帶有包含性非鍵列的索引可以顯著提高查詢效能。這樣可以實現效能提公升,因為查詢優化器可以在索引中找到所有列值;不訪問表或聚集索引資料,從而減少磁碟 i/o 操作。

當索引包含查詢引用的所有列時,它通常稱為「覆蓋查詢」。

鍵列儲存在索引的所有級別中,而非鍵列僅儲存在葉級別中。有關索引級別的詳細資訊,請參閱表組織和索引組織。

使用包含性列以避免大小限制

可以將非鍵列包含在非聚集索引中,以避免超過當前索引大小的限制(最大鍵列數為 16,最大索引鍵大小為 900 位元組)。資料庫引擎計算索引鍵列數或索引鍵大小時,不考慮非鍵列。

例如,假設要為adventureworks示例資料庫的document表中的以下列建立索引:

title nvarchar(50)

revision nchar(5)

filename nvarchar(400)

因為ncharnvarchar資料型別的每個字元需要 2 個位元組,所以包含這三列的索引將超出 900 位元組的大小限制 10 個位元組 (455 * 2)。使用create index語句的include子句,可以將索引鍵定義為 (title, revision),將filename定義為非鍵列。這樣,索引鍵大小將為 110 個位元組 (55 * 2),並且索引仍將包含所需的所有列。下面的語句就建立了這樣的索引。

use adventureworks;

gocreate index ix_document_title

on production.document (title, revision)

include (filename);

帶有包含性列的索引準則

設計帶有包含性列的非聚集索引時,請考慮下列準則:

列大小準則

列修改準則

修改已定義為包含性列的表列時,要受下列限制:

設計建議

重新設計索引鍵大小較大的非聚集索引,以便只有用於搜尋和查詢的列為鍵列。將覆蓋查詢的所有其他列設定為包含性非鍵列。這樣,將具有覆蓋查詢所需的所有列,但索引鍵本身較小,而且效率高。

例如,假設要設計覆蓋下列查詢的索引。

use adventureworks;

goselect addressline1, addressline2, city, stateprovinceid, postalcode

from person.address

where postalcode between n'98000' and n'99999';

若要覆蓋查詢,必須在索引中定義每列。儘管可以將所有列定義為鍵列,但鍵大小為 334 位元組。因為實際上用作搜尋條件的唯一列是postalcode列(長度為 30 位元組),所以更好的索引設計應該將postalcode定義為鍵列幷包含作為非鍵列的所有其他列。

下面的語句建立了乙個覆蓋查詢的帶有包含性列的索引。

use adventureworks;

gocreate index ix_address_postalcode

on person.address (postalcode)

include (addressline1, addressline2, city, stateprovinceid);

效能注意事項

避免新增不必要的列。新增過多的索引列(鍵列或非鍵列)會對效能產生下列影響:

您應該確定修改資料時在查詢效能上的提公升是否超過了對效能的影響,以及是否需要額外的磁碟空間要求。有關評估查詢效能的詳細資訊,請參閱查詢優化。

請參閱

概念建立索引(資料庫引擎)

建立帶有包含性列的索引

常規索引設計指南

索引設計基礎知識

索引鍵的最大大小

檢視索引資訊

索引鍵列和包含性列

1 主鍵必須是唯一性的,不一定就是聚集索引,我們在建立主鍵時預設是設主鍵為聚集索引。可通過手動刪除後重新建聚集索引。2 sql語句是where先執行,然後再執行order by,所以我們在建非聚集索引時要注意順序並且where與order by裡面的列都要在索引鍵列裡面。select部份可以放在包含...

Mysql的列索引和多列索引(聯合索引)

建立乙個多列索引 create table test id int not null,last name char 30 not null,first name char 30 not null,primary key id index name last name,first name 建立多個索...

Mysql的列索引和多列索引(聯合索引)

建立乙個多列索引 create table test id int not null,last name char 30 not null,first name char 30 not null,primary key id index name last name,first name 建立多個索...