MSSQL聚集索引與非技術索引設計指南

2021-05-23 07:34:37 字數 3303 閱讀 8853

-->title:generating test data

-->author:wufeng4552

-->date :2009-09-25 09:41:15

(一)聚集索引設計指南

聚集索引基於資料行的鍵值在表內排序和儲存這些資料行.每個表只能有乙個聚集索引,因為資料行本身只能按乙個順序儲存.

定義聚集索引來實現下列功能:

1:可用於經常使用的查詢

提供高度唯一性.

注意:

建立 primary key 約束時,將在列上自動建立唯一索引.

預設情況下,此索引是聚集索引,但是在建立約束時,可以指定建立非聚集索引.

2:可用於範圍查詢

如果未使用 unique 屬性建立聚集索引,資料庫引擎將向表自動新增乙個 4 位元組的 uniqueifier 列.

必要時,資料庫引擎將向行自動新增乙個 uniqueifier 值以使每個鍵唯一。此列和列值供內部使用,使用者不能檢視或訪問.

**查詢注意事項 **

在建立聚集索引之前,應先了解資料是如何被訪問的,考慮對具有以下特點的查詢使用聚集索引:

(1)使用運算子(如 between、>、>=、 < 和 <=)返回一系列值。

使用聚集索引找到包含第乙個值的行後,便可以確保包含後續索引值的行物理相鄰.

例如,如果某個查詢在一系列銷售訂單號間檢索記錄,salesordernumber 列的聚集索引可快速定位包含起始銷售訂單號的行,然後檢索表中所有連續的行,直到檢索到最後的銷售訂單號.

(2)返回大型結果集。

使用 join 子句;一般情況下,使用該子句的是外來鍵列.

(3)使用 order by 或 group by 子句.

在 order by 或 group by 子句中指定的列的索引,可以使資料庫引擎不必對資料進行排序,因為這些行已經排序.這樣可以提高查詢效能.

**列注意事項**

一般情況下,定義聚集索引鍵時使用的列越少越好.考慮具有下列乙個或多個屬性的列:

唯一或包含許多不重複的值

(1)唯一或包含許多不重複的值

例如,雇員 id 唯一地標識雇員.

employeeid 列的聚集索引或 primary key 約束將改善基於雇員 id 號搜尋雇員資訊的查詢的效能.

另外,可對 lastname、firstname、middlename 列建立聚集索引,

因為經常以這種方式分組和查詢雇員記錄,而且這些列的組合還可提供高區分度.

(2)按順序被訪問

(3)經常用於對錶中檢索到的資料進行排序。

按該列對錶進行聚集(即物理排序)是乙個好方法,它可以在每次查詢該列時節省排序操作的成本.

**聚集索引不適用於具有下列屬性的列:**

(1)頻繁更改的列

這將導致整行移動,因為資料庫引擎必須按物理順序保留行中的資料值.

這一點要特別注意,因為在大容量事務處理系統中資料通常是可變的.

(2)寬鍵

寬鍵是若干列或若干大型列的組合.

所有非聚集索引將聚集索引中的鍵值用作查詢鍵.

為同一表定義的任何非聚集索引都將增大許多,這是因為非聚集索引項包含聚集鍵,同時也包含為此非聚集索引定義的鍵列.

(二)非聚集索引設計指南

非聚集索引包含索引鍵值和指向表資料儲存位置的行定位器

可以對錶或索引檢視建立多個非聚集索引.通常,設計非聚集索引是為改善經常使用的、沒有建立聚集索引的查詢的效能.

與使用書中索引的方式相似,查詢優化器在搜尋資料值時,先搜尋非聚集索引以找到資料值在表中的位置,然後直接從該位置檢索資料.

這使非聚集索引成為完全匹配查詢的最佳選擇,因為索引包含說明查詢所搜尋的資料值在表中的精確位置的項.

例如,為了從 humanresources.employee 表中查詢向特定經理負責的所有雇員,查詢優化器可能使用非聚集索引 ix_employee_managerid,它以 managerid 作為其鍵列.查詢優化器能快速找出索引中與指定 managerid 匹配的所有項.

每個索引項都指向表或聚集索引中準確的頁和行,其中可以找到相應的資料.

在查詢優化器在索引中找到所有項之後,它可以直接轉到準確的頁和行進行資料檢索.

**資料庫注意事項 **

(1)更新要求較低但包含大量資料的資料庫或表可以從許多非聚集索引中獲益從而改善查詢效能.

與全表非聚集索引相比,考慮為定義完善的資料子集建立篩選索引可以提高查詢效能、降低索引儲存開銷並減少索引維護開銷.

(2)決策支援系統應用程式和主要包含唯讀資料的資料庫可以從許多非聚集索引中獲益.

查詢優化器具有更多可供選擇的索引用來確定最快的訪問方法,並且資料庫的低更新特徵意味著索引維護不會降低效能.

(3) 聯機事務處理應用程式和包含大量更新表的資料庫應避免使用過多的索引.此外,索引應該是窄的,即列越少越好.

對錶編制大量索引會影響 insert、update、delete 和 merge 語句的效能,因為當表中的資料更改時,所有索引都須進行適當的調整. 

**查詢注意事項 **

在建立非聚集索引之前,應先了解訪問資料的方式.考慮對具有以下屬性的查詢使用非聚集索引:

(1)使用 join 或 group by 子句.

應為聯接和分組操作中所涉及的列建立多個非聚集索引,為任何外來鍵列建立乙個聚集索引.

(2)不返回大型結果集的查詢.

建立篩選索引以覆蓋從大型表中返回定義完善的行子集的查詢.

(3)包含經常包含在查詢的搜尋條件(例如返回完全匹配的 where 子句)中的列.

**列注意事項 **

(1)覆蓋查詢.

當索引包含查詢中的所有列時,效能可以提公升.查詢優化器可以找到索引內的所有列值;

不會訪問表或聚集索引資料,這樣就減少了磁碟 i/o 操作。使用具有包含列的索引來新增覆蓋列,而不是建立寬索引鍵.

如果表有聚集索引,則該聚集索引中定義的列將自動追加到表上每個非聚集索引的末端.

這可以生成覆蓋查詢,而不用在非聚集索引定義中指定聚集索引列.

例如:如果乙個表在 c 列上有聚集索引,則 b 和 a 列的非聚集索引將具有其自己的鍵值列 b、a 和 c.

(2)大量非重複值

如姓氏和名字的組合(前提是聚集索引被用於其他列)。

如果只有很少的非重複值,例如僅有 1 和 0,則大多數查詢將不使用索引,因為此時表掃瞄通常更有效.

對於這種型別的資料,應考慮對僅出現在少數行中的非重複值建立篩選索引。

例如,如果大部分值都是 0,則查詢優化器可以對包含 1 的資料行使用篩選查詢。

聚集索引與非聚集索引

非聚集索引也是堆結構?其實sqlserver有幾種頁面型別 資料都使用一頁一頁來儲存,就像windows的記憶體也是使用頁面來組織的 感興趣的朋友可以了解下,希望本文可以增加你們對非聚集索引結構的理解。我們知道sqlserver的資料行的儲存有兩種資料結構 a 堆b b樹 binary 二叉樹 資料...

聚集索引與非聚集索引

一 聚集索引概念 漢語字典的正文本身就是乙個聚集索引。比如,我們要查 安 字,就會很自然地翻開字典的前幾頁,因為 安 的拼音是 an 而按照拼音排序漢字的字典是以英文本母 a 開頭並以 z 結尾的,那麼 安 字就自然地排在字典的前部。如果您翻完了所有以 a 開頭的部分仍然找不到這個字,那麼就說明您的...

聚集索引與非聚集索引

1 聚集索引 聚集索引的意思可以理解為順序排列,比如乙個主鍵自增的錶即為聚集索引,即id為1的存在於第一條,id為2的存在於第二條.假使資料庫中是使用陣列來存放的這張表中的資料,那麼如果我需要查詢第100條,那麼直接第一條資料的位址加上100即為第一百條的位址,一次就能查詢出來。因為資料庫中的資料只...