主頁 > 知識庫 > sqlserver索引的原理及索引建立的注意事項小結(jié)

sqlserver索引的原理及索引建立的注意事項小結(jié)

熱門標簽:呼叫中心市場需求 AI電銷 鐵路電話系統(tǒng) 網(wǎng)站排名優(yōu)化 服務(wù)外包 百度競價排名 Linux服務(wù)器 地方門戶網(wǎng)站
聚集索引,數(shù)據(jù)實際上是按順序存儲的,數(shù)據(jù)頁就在索引頁上。就好像參考手冊將所有主題按順序編排一樣。一旦找到了所要搜索的數(shù)據(jù),就完成了這次搜索,對于非聚集索引,索引是安全獨立于數(shù)據(jù)本身結(jié)構(gòu)的,在索引中找到了尋找的數(shù)據(jù),然后通過指針定位到實際的數(shù)據(jù)。
SQL Server中的索引使用標準的B-樹來存儲他們的信息,如下圖所示,B-樹通過查找索引中的一個關(guān)鍵之來提供對于數(shù)據(jù)的快速訪問,B-樹以相似的鍵記錄聚合在一起,B不代表二叉(binary),而是代表balanced(平衡的),而B-樹的一個核心作用就是保持樹的平衡。同伙向下遍歷這棵樹以找到一個數(shù)值并定位記錄。因為樹是平衡的,所以尋找任何記錄都只需要等量的資源,而且獲取的速度總是一致的—因為從根索引葉索引都具有相同的深度。

索引的中間層次是根據(jù)表的行數(shù)一級索引行的大小而變化的,如果使用一個較長的鍵(KEY)來創(chuàng)建索引,一個分頁上就只容納較少的條目,因而索引就需要更多分頁(或者說更多層),頁越多那么查找就需要話費相對較長的時間來找到所需要的信息,索引就可能不太有用了。
聚集索引
聚集索引的葉級別不僅包含了索引鍵,還包含了數(shù)據(jù)頁。另一種說法數(shù)據(jù)本身也是聚集索引的一部分,聚集索引基于鍵值保持表中的數(shù)據(jù)有序,表中的數(shù)據(jù)頁是通過一個被稱作頁鏈(page chain)的雙向鏈接表來維護的,由于實際的數(shù)據(jù)頁的頁鏈只能按一種方式排序,因此一張表只能擁有一個聚集索引。
這里可能有一個誤區(qū),有很多介紹SQL Server索引的文檔會告訴讀者:聚集索引按照排序順序(sorted order)物理地存儲數(shù)據(jù)。如果以為物理存儲就是磁盤本身的話就會產(chǎn)生誤解。試想如果聚集索引需要按照特定順序在實際的磁盤上維護數(shù)據(jù)的話,那么任何修改操作都將會產(chǎn)生相當高昂的代價。當一個頁變滿了需要一分為二的時候,所有后續(xù)頁面上的數(shù)據(jù)都必須向后移動。聚集索引中的排序順序(sorted order)僅僅表示數(shù)據(jù)頁鏈在邏輯上是有序的。
大多數(shù)表都應該需要一個聚集索引。優(yōu)化器非常傾向于采用聚集索引,因為聚集索引能夠直接在葉級別找到數(shù)據(jù)。由于定義了數(shù)據(jù)的邏輯順序,聚集索引能夠特別快的訪問針對范圍值的查詢,查詢優(yōu)化器能夠發(fā)現(xiàn)只有某一段范圍的數(shù)據(jù)頁需要掃描。

非聚集索引
對于非聚集索引,葉級別不包含全部的數(shù)據(jù)。除了鍵值之外,每個葉級別(樹的最底層)中的索引行包含了一個書簽(bookmark),告訴SQL Server可以在那里找到與索引鍵相應的數(shù)據(jù)行。一個書簽可能有兩種形式。如果表上存在聚集索引,書簽就是相應的數(shù)據(jù)行的聚集索引鍵。如果彪是堆(heap)結(jié)構(gòu),書簽就是一個行表示(row identifier,RID),以“文件號:頁號:槽號”的格式來定位實際的行。
主鍵(PRIMARY KEY)與聚集索引(CLUSTER INDEX)
嚴格來說,主鍵與聚集索引沒有任何關(guān)系,如果要說有話,那就是表中沒有聚集索引的時候,創(chuàng)建的主鍵默認就是聚集索引(除非有特別設(shè)置為NOCLUSTER)。
在主鍵與聚集索引的處理方面,注意以下事項:
1、主鍵不與聚集索引分離
2、聚集索引鍵列盡量避免使用int之外的數(shù)據(jù)類型
3、盡量避免使用復合主鍵


創(chuàng)建索引時的注意事項


1、始終包含聚集索引
當表中不包含聚集索引時,表中的數(shù)據(jù)是無序的,這會降低數(shù)據(jù)檢索效率。即使通過索引縮小了數(shù)據(jù)檢索的范圍,但由于數(shù)據(jù)本身是無序的,當從表中提取實際數(shù)據(jù)時,會產(chǎn)生頻繁的定位問題,這也使得SQL Server基本上不會使用無聚集索引表中的索引來檢索數(shù)據(jù)。
2、保證聚集索引唯一
由于聚集索引是非聚集索引的行定位器,如果它不唯一,則會使行定位器中包含輔助數(shù)據(jù),同時也導致從表中提取數(shù)據(jù)時,需要借助行定位器中的輔助數(shù)據(jù)來定位,這會降低處理效率。
3、保證聚集索引最小
每個聚集鍵值都是所有非聚集索引的葉結(jié)點記錄,它越小,意味著每個非聚集索引的索引葉包含的有效數(shù)據(jù)越多,這對于提升索引效率很有好處。
4、覆蓋索引
覆蓋索引是指索引中的列包含了數(shù)據(jù)處理中涉及的所有列,覆蓋索引相當原始表的一個子集,由于這個子集中包含了數(shù)據(jù)處理涉及的所有列,因此操作這個子集就可以滿足數(shù)據(jù)處理需要。一般而言,如果大多數(shù)處理都只涉及某個大表的某些列,可以考慮為這些列建立覆蓋索引。
覆蓋索引的建立方法是將要包含的列中的關(guān)鍵列做為索引鍵列,將其他列做為索引的包含列(使用索引創(chuàng)建語句中的INCLUDE子句)。
5、適量的索引
當數(shù)據(jù)發(fā)生變化時,SQL Server會同步維護相關(guān)索引中的數(shù)據(jù),過多的索引會加影響數(shù)據(jù)變更的處理效率。因此,只應該在經(jīng)常使用的列上建立索引。
適量的索引還體現(xiàn)在對索引列的組合方式的控制上。例如,如果有兩個列col1和col2,這兩個列的組合會產(chǎn)生三種使用情況:單獨使用col1、單獨使用col2及同時使用col1和col2。如果有為每種情況都建立索引,則需要建立三個索引。但也可以只建立一個復合索引(col1, col2),這樣能夠依次滿足col1+col2、col1、col2這三種方式的查詢,其中,col2利用這個查詢會比較勉強(還要配合單獨的統(tǒng)計),可以視實際情況確定是否需要為col2建立單獨的索引。
特別注意:
不要建立重復索引,目前最常見的重復索引是單獨為某個列建立主鍵和聚集索引
與直接從表中提取數(shù)據(jù)相比,根據(jù)索引檢索數(shù)據(jù),多了一個索引檢索的過程,這個過程要求能夠盡量縮小數(shù)據(jù)檢索范圍,并且使用最少的時間,這樣才能真正保證能夠通過索引提高數(shù)據(jù)檢索效率。
實現(xiàn)上述目的,對于索引鍵列的選擇,應該遵循如下原則:
選擇性原則
選擇性是滿足條件的記錄占總記錄數(shù)的百分比,這個比率應該盡可能低,這樣才能保證通過索引掃描后,只需要從基礎(chǔ)表提取很少的數(shù)據(jù)。
如果這個比率偏高,則不應該考慮在此列上建立索引。
數(shù)據(jù)密度原則
數(shù)據(jù)密度是指列值唯一的記錄占總記錄數(shù)的百分比,這個比率越高,則說明此列越適合建立索引。
在考慮數(shù)據(jù)密度的時候,還要注意數(shù)據(jù)分布的問題,只有經(jīng)常檢索的密度高時,才適合建立索引。例如,如果一張表有10萬記錄,雖然某個列不重復的記錄有9萬條,但如果經(jīng)常檢索的2萬條記錄,其不重復的列值才幾十條的話,這個列是不太適合建立索引的。另一種情況是,整體數(shù)據(jù)密度不大,但經(jīng)常檢索的數(shù)據(jù)的密度大,例如訂單的狀態(tài),一般來說,訂單的狀態(tài)就幾種,但已經(jīng)Close的訂單往往占整個數(shù)據(jù)的絕大部分,但數(shù)據(jù)處理的時候,基本上都是檢索未Close的訂單,這種情況下,為訂單的狀態(tài)列建立索引還是比較有效的(SQL Server 2008中,可以為這種列建立具有更佳效果的篩選索引)。
6、索引鍵列大小
一般不宜為超過100Byte的列建立索引。
7、復合索引鍵列順序
在索引中,索引的順序主要由索引中的每一個鍵列確定,因此,對于復合索引,索引中的列順序是很重要的,應該優(yōu)先把數(shù)據(jù)密度大,選擇性列,存儲空間小的列放在索引鍵列的前面。

鏈接:http://topic.csdn.net/u/20120721/10/b057fc3b-4304-44ee-b7b5-16160f30bacc.html?seed=656570155r=79190463#r_79190463

作者 Beirut(小愛)
您可能感興趣的文章:
  • SQL Server2014 哈希索引原理詳解
  • SqlServer索引的原理與應用詳解
  • SQL Server 索引介紹
  • SQLSERVER全文目錄全文索引的使用方法和區(qū)別講解
  • SQL Server 聚集索引和非聚集索引的區(qū)別分析
  • SQLSERVER 創(chuàng)建索引實現(xiàn)代碼
  • SQLSERVER聚集索引和主鍵(Primary Key)的誤區(qū)認識
  • sqlserver 索引的一些總結(jié)
  • SQL Server全文索引服務(wù)
  • SQL Server索引的原理深入解析

標簽:黃山 仙桃 湘潭 蘭州 崇左 銅川 衡水 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標題《sqlserver索引的原理及索引建立的注意事項小結(jié)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266