簡體   English   中英

SQL服務器中使用非聚集索引

[英]Non clustered index use in SQL server

任何人都可以告訴我在SQL服務器中使用非聚集索引的用途。 據我所知,聚簇和非聚簇索引使搜索變得容易..

一種用途是您只能在表上擁有一個聚簇索引。 如果您需要多個,則其余部分必須是非群集的。

聚簇索引是表的每一行的數據如何物理存儲在磁盤上(每個表只能有一個這些索引類型),因此所有寫操作的性能都基於此索引。 如果你必須重建這個索引或者在這個索引上移動東西,這可能會非常昂貴。

非聚簇索引只是行的特定部分的列表,其順序與它們的物理存儲順序不同(每個表可以有多個這些索引類型),以及指向它實際存儲位置的指針。 當您只知道有關該行的某些信息時,非聚簇索引用於使查找特定行變得容易。

如果您將典型的教科書視為數據庫表,則聚簇索引是該書的實際內容頁面集。 因為從邏輯上講,按順序編寫這些頁面是有意義的。 非聚集索引是本書后面的索引,按字母順序列出重要術語。 這只列出您要查找的單詞,以及您可以找到它的頁碼。 這樣,當您查找特定術語時,您可以輕松地找到需要閱讀的內容。

通常,最好使聚簇索引成為遵循NUSE原則的ID(窄,唯一,靜態,不斷增加)。 通常,您可以使用SMALLINT,INT或BIGINT來完成此操作,具體取決於您要在表中存儲的數據量。 這為您提供了一個窄鍵,因為它們只有2個,4個或8個字節寬(分別),您可能還希望為該列設置IDENTITY屬性,使其自動遞增。 如果你永遠不改變一行的這個值(使它靜止) - 並且通常沒有理由這樣做 - 那么它將是獨一無二的並且不斷增加。 這樣,當您插入新行時,它只會將其拋出到磁盤上的下一個可用位置。 這有助於提高寫入速度。

當您使用某些列搜索數據時,通常會使用非聚簇索引。 因此,如果您有一個滿桌的人,並且您通常按姓氏查找人員,那么您可能希望在姓氏列上的人員表上使用非聚集索引。 或者你可以有一個姓氏,名字。 如果您通常也會根據其年齡搜索人員,那么您可能希望在人員的生日列中使用另一個非聚集索引。 這樣,您可以輕松搜索在特定日期之上或之下出生的人。

解釋差異的經典例子是電話簿之一。 電話簿,從姓名開頭到結尾的物理結構(我認為,自從我查看實體電話簿以來已經有一段時間了)類似於桌面上的聚集索引。 表上只能有一個聚簇索引。 實際上,聚集索引是表; 它是如何物理存儲在磁盤上的。 聚簇索引的結構包含您定義的鍵以及所有數據。 注意,在SQL中,您根本不需要擁有聚簇索引; 這樣的表被稱為“堆”,但這不是一個好主意。

例如,如果您想通過地址在電話簿中查找某人的條目,那么非聚集索引將是一個例子。 你在書的后面有一個索引,地址按字母順序排序,然后在電話簿中你可以找到那個電話號碼。 這樣做稱為“查找”。 所以非聚集索引具有:

  • 要索引的鍵(例如地址)
  • 指向聚簇索引中的行的指針(該地址處人員的姓氏)
  • (可選)您可能經常需要的包含列的列表,但不希望必須返回到聚簇索引以進行查找。

雖然聚簇索引包含每行的所有數據,但非聚簇索引通常較小,因為您只有鍵,指針和可選的列。 你也可以隨心所欲地擁有它們。

至於它們如何返回數據,它們非常相似,特別是如果您不必查找聚簇索引。 一個可以從非聚集索引中獲取所需內容的查詢被稱為“覆蓋”(因為所有你需要的東西都被非聚集索引覆蓋)。 此外,由於聚簇索引是物理數據的線性排序,因此它可以使基於范圍的查詢更快,因為它只需使用聚簇索引開頭的偏移量即可找到范圍的開始和結束。

其他人似乎都觸及了相同的觀點,盡管我會保持簡短並為您提供資源以獲取更多相關信息。

聚簇索引表,它(顯然)包括所有列。 這可能並不總是需要的,並且當結果集中有許多行數據時可能成為障礙。 您可以利用非聚集索引(實際上是表的一部分的副本)來“覆蓋”您的查詢,以便您可以更快地獲得響應時間。

請查看世界級DBA,Brent Ozar的免費視頻: https ://www.brentozar.com/training/think-like-sql-server-engine/

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM