Sql-Server
如果行儲存索引儲存在 b 樹資料結構中,列儲存索引使用哪種資料結構?
我對如何儲存正常行儲存索引的理解是在一種 b-tree 資料結構中,但我想知道由於列儲存索引的不同性質,使用什麼類型的底層資料結構?
我們通常認為索引是一種快速查找對給定資訊的所有引用的方法。在給定主題的教科書中,我們可以找到所有提到該主題的頁面。在給定列值的數據庫中,我們可以找到具有該值的所有行。
從這個意義上說,將列儲存稱為“索引”有點用詞不當。它並非旨在為特定列值的行提供快速查找。相反,它旨在快速提供大型數據集的聚合結果。因此,它本身就是一種數據格式。列式數據儲存,有時稱為分解儲存模型 (DSM),是眾所周知且受人尊敬的。許多專有和開源 DBMS 都提供它。
列儲存的基本思想是列的值連續儲存在磁碟上。然後該列上的聚合可以有效地從磁碟中提取該列,並且只提取該列,從而減少必須讀取的磁碟塊的數量。此外,由於一個塊中的所有數據值都來自同一域,因此對該塊的壓縮可能非常有效,從而進一步減少了所需的塊數量。壓縮比一般的 ZIP 要好得多——可以使用字典、遊程和增量編碼。
由於各種原因,最好在壓縮和儲存行之前將它們分成大組。SQL Server 將這些組稱為“行組”,它們由“列段”組成。每個行組包含超過一百萬行。當建構段時,伺服器會為該列提取一些元數據,例如最小值、最大值和(可能)總和。此元數據有時稱為區域圖。在執行時,這些區域映射可以與查詢謂詞進行比較,如果謂詞不在段的最小值和最大值之間,則處理可以完全避免從磁碟讀取這些塊。這稱為段消除,類似於分區消除。此外,一些查詢可以直接從區域圖中回答,例如“從表中選擇最小(列)”
我要注意的是,B-Tree 並不是唯一用於索引行儲存的結構,它只是對使用 SQL Server 的數據庫開發人員可用的唯一結構。