下面簡單說一些暫時想到的對使用索引影響較大的幾個注意點
請一定要記住,頁是sql server進行資料讀寫的最小i/o單位,而不是行。sql server中乙個頁大小為8kb,每8個頁形成乙個區,每頁8kb,其中頁頭占用96個位元組,頁尾的行指示器占用2個位元組,還有幾個保留位元組,也就是乙個頁8192個位元組,能用了儲存資料的實際約8000個位元組,8000個位元組一般可以儲存很多行資料。即便sql server只訪問一行資料,它也要把整個頁載入到快取並從快取讀取資料,我們通常所說的開銷主要就是i/o開銷,這點不少人都沒有清醒的認知。
很多書籍和文章都寫過索引要使用窄索引,窄索引是個什麼東東呢,大白話就是把索引建在位元組長度比較小的列上,比如int占用4個位元組,bigint占用8個位元組,char(20)占用20個位元組nchar(20)最占用40個位元組,那麼int 相對於bigint來說就是窄了(占用位元組數更少),bigint比char(20)也要窄,char(20)和nchar(20)相比要窄(nchar(20)每個字元占用2個位元組)。
明白了啥是窄索引我們來說下為什麼要使用窄索引,我們知道資料儲存和讀取的最小單位是頁,乙個頁8k大小,當使用比較窄的列做索引列時,每個頁能儲存的資料就更多,以int和bigint為例,乙個8k的頁大約能儲存8*1024/4(int 4個位元組)=2048(實際值要比這個數字小)條資料,使用bigint大約能儲存8*1024/8(bigint為8個位元組)=1024(實際值要比這個數字小)條資料,也就是說索引列的長度也小,每個頁能儲存的資料也就越多,反過來說就是儲存索引所需要的頁數也就越少,頁數少了進行索引查詢時需要檢索的頁自然也就少了,檢索頁數少了io開銷也就隨之減少,查詢效率自然也就高了。
摘抄自懶惰的肥兔
聚集索引與非聚集索引 SQL
介紹 查詢資料表中的行的兩種方式,不管聚集索引,還是非聚集索引,都是用b 樹來實現的,關於b樹的介紹 clustered index 聚集索引 類似於使用字典的拼音索引來找字 表必須按順序排列,聚集索引的葉節點就是實際的資料頁,每一頁為乙個頁節點,訪問資料時表得保持順序故會減低速度,每個表只能有乙個...
SQL聚集與非聚集索引
索引是在資料庫表或者檢視上建立的物件,目的是為了加快對錶或檢視的查詢的速度 按照儲存方式分為 聚集與非聚集索引 按照維護與管理索引角度分為 唯一索引 復合索引和系統自動建立的索引 索引的結構是由 根節點 非葉節點 非葉節點 葉節點 1 聚集索引 表中儲存的資料按照索引的順序儲存,檢索效率比普通索引高...
聚集索引與非聚集索引
非聚集索引也是堆結構?其實sqlserver有幾種頁面型別 資料都使用一頁一頁來儲存,就像windows的記憶體也是使用頁面來組織的 感興趣的朋友可以了解下,希望本文可以增加你們對非聚集索引結構的理解。我們知道sqlserver的資料行的儲存有兩種資料結構 a 堆b b樹 binary 二叉樹 資料...