1. 程式人生 > >淺談sql server聚集索引與非聚集索引

淺談sql server聚集索引與非聚集索引

今天同事的服務程式在執行批量插入資料操作時,會超時失敗,程式碼debug了幾遍一點問題都沒有,SQL單條插入也可以正常錄入資料,除錯了一上午還是很迷茫,場面一度很尷尬,最後還是發現了問題的根本,原來是另一個同事為了提升查詢效率濫用了索引在搞鬼,沒有合理的運用索引使每次新增和修改資料時效率極低,大批量插入和修改資料時會使伺服器超時。

所以我也簡單的對索引相關的知識簡單的做了一些總結,我查閱整理了一下在sql server中有如下可用的索引:

索引型別 描述
雜湊:藉助於雜湊索引,可通過記憶體中的雜湊表來訪問資料。 雜湊索引的記憶體用量固定不變,是儲存桶數量的函式。

記憶體優化非聚集索引: 對於記憶體優化的非聚集索引,記憶體使用量依賴於行計數以及索引鍵列的大小

群集: 聚集索引基於聚集索引鍵按順序排序和儲存表或檢視中的資料行。 聚集索引按 B 樹索引結構實現,B 樹索引結構支援基於聚集索引鍵值對行進行快速檢索。

非聚集 :既可以使用聚集索引來為表或檢視定義非聚集索引,也可以根據堆來定義非聚集索引。 非聚集索引中的每個索引行都包含非聚集鍵值和行定位符。 此定位符指向聚集索引或堆中包含該鍵值的資料行。 索引中的行按索引鍵值的順序儲存,但是不保證資料行按任何特定順序儲存,除非對錶建立聚集索引。

唯一: 唯一索引確保索引鍵不包含重複的值,因此,表或檢視中的每一行在某種程度上是唯一的。唯一性可以是聚集索引和非聚集索引的屬性。

columnstore:

記憶體中列儲存索引通過使用基於列的資料儲存和基於列的查詢處理來儲存和管理資料。列儲存索引適合於主要執行大容量載入和只讀查詢的資料倉庫工作負荷。 與傳統面向行的儲存方式相比,使用列儲存索引存檔可最多提高 10 倍查詢效能 ,與使用非壓縮資料大小相比,可提供多達 7 倍資料壓縮率 。

帶有包含列的索引: 一種非聚集索引,它擴充套件後不僅包含鍵列,還包含非鍵列。 

計算列上的索引: 從一個或多個其他列的值或某些確定的輸入值派生的列上的索引。

篩選: 一種經過優化的非聚集索引,尤其適用於涵蓋從定義完善的資料子集中選擇資料的查詢。 篩選索引使用篩選謂詞對錶中的部分行進行索引。 與全表索引相比,設計良好的篩選索引可以提高查詢效能、減少索引維護開銷並可降低索引儲存開銷。

空間 :利用空間索引,可以更高效地對幾何資料型別的列中的空間物件( 空間資料 )執行某些操作。 空間索引可減少需要應用開銷相對較大的空間操作的物件數。

XML: xml 資料型別列中 XML 二進位制大型物件 (BLOB) 的已拆分持久表示形式。

全文: 一種特殊型別的基於標記的功能性索引,由 Microsoft SQL Server全文引擎生成和維護。 用於幫助在字串資料中搜索複雜的詞。

不難看出要搞清楚所有索引,並靈活的去應用它其實並不是一件容易的事情,很多索引我們甚至都在工作中沒用過,甚至沒聽說過,也不用擔心,可以先大致的瞭解它,可以在需要實際用到時再去學習也不遲。

不過索引雖多,不用個個深入學習,個人認為搞懂聚集索引和非聚集索引還是很有必要的,因為實際在優化查詢,插入等操作時,這兩個索引用的時最多的,也是最基礎的

1,什麼是索引?

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。如果想按特定職員的姓來查詢他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取資訊。最常見的索引就是書的目錄

2,如何理解聚集索引和非聚集索引

概念:

  聚集索引是指資料庫錶行中資料的物理順序與鍵值的邏輯(索引)順序相同。

  非聚集索引是一種索引,該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同。

上面是資料概念的概述,在講講我自己對聚集索引和非聚集索引的理解:

  聚集索引最現實的可以體現的例子就是字典的拼音查詢,一般我們常用的中文字典會將字典的每個字按照abcd...的拼音順序去排列,字典中的每一個字好比是一條條資料,而字典最前面更具拼音查詢指定字的頁碼的小目錄就是索引,目錄拼音排序和實際資料順序是相同的,也就是所謂的資料庫錶行中資料的物理順序與鍵值的邏輯(索引)順序相同。

  那非聚集索引勒?非聚集索引其實最現實的體現也是字典,只不過換成了字典的部首查詢的體現,我們看看部首查詢和拼音查詢有何區別,不難發現,從部首排序的角度去看,發現字典中字典中實際的字實際資料)排列順序是沒有任何部首排列規則的,但是查詢部首的目錄(索引)都是按照指定的部首規則排序的,這就是所謂的索引中索引的邏輯順序與磁碟上行的物理儲存順序不同。

聚集索引和非聚集索引都可以優化查詢,我在此處只是淺顯的從,概念的角度去談對兩個簡單索引的理解,希望對大家有用,實際索引的原理還是比較複雜的,需要深入所有索引的原理個人建議還是從資料結構入手

附:

  • 群集(聚集索引)

    • 聚集索引根據資料行的鍵值在表或檢視中排序和儲存這些資料行。 索引定義中包含聚集索引列。 每個表只能有一個聚集索引,因為資料行本身只能按一個順序儲存。

    • 只有當表包含聚集索引時,表中的資料行才按排序順序儲存。 如果表具有聚集索引,則該表稱為聚集表。 如果表沒有聚集索引,則其資料行儲存在一個稱為堆的無序結構中。

  • 非聚集(非聚集索引)

    • 非聚集索引具有獨立於資料行的結構。 非聚集索引包含非聚集索引鍵值,並且每個鍵值項都有指向包含該鍵值的資料行的指標。

    • 從非聚集索引中的索引行指向資料行的指標稱為行定位器。 行定位器的結構取決於資料頁是儲存在堆中還是聚集表中。 對於堆,行定位器是指向行的指標。 對於聚集表,行定位器是聚集索引鍵。

    • 可以向非聚集索引的葉級新增非鍵列以跳過現有的索引鍵限制,並執行完整範圍內的索引查詢。

聚集索引和非聚集索引都可以是唯一的。 這意味著任何兩行都不能有相同的索引鍵值。 另外,索引也可以不是唯一的,即多行可以共享同一鍵值。 

每當修改了表資料後,都會自動維護表或檢視的索引。

聚集索引的缺點是對錶進行修改速度較慢,這是為了保持表中的記錄的物理順序與索引的順序一致,而把記錄插入到資料頁的相應位置,必須在資料頁中進行資料重排,降低了執行速度。非聚集索引指定了表中記錄的邏輯順序,但記錄的物理順序和索引的順序不一致,聚集索引和非聚集索引都採用了B+樹的結構,但非聚集索引的葉子層並不與實際的資料頁相重疊,而採用葉子層包含一個指向表中的記錄在資料頁中的指標的方式。非聚集索引比聚集索引層次多,新增記錄不會引起資料順序的重組。