軟體工程師的小事:到底要不要 Close

資料行存放區索引是如何增加 IO 效能

本文章使用圖解資料行存放區 (columnstore) 資料儲存方式與一般資料表儲存方式 (rowstore) 的差異,呈現在硬碟 IO 效能上的優化

僅示意,無法代表實際資料表儲存順序百分之百相同

描述內容有錯誤與不正確的地方可使用下方留言

文章環境
作業系統
Windows Server 2016 Standard Evaluation (10.0)
資料庫
Microsoft SQL Server Enterprise Evaluation (64-bit)
範例資料表

下面將使用 AdventureWorks2017 範例資料庫中 Sales.SalesOrderDetail 資料表作為範例

資料表查詢結果如下圖

接下來就來說明資料列存放區 (rowstore) 與資料行存放區 (columnstore) 的差異

資料列存放區 (rowstore)

一般情況下資料表在硬碟的方式如下圖

每一個方形代表硬碟儲存區塊,資料依照資料列的順序進行儲存

資料行存放區 (columnstore)

當資料表變成資料列存放區時,資料的儲存方式如下

每個區塊皆儲存相同資料行的資料內容

改成資料行儲存的好處

其中一項:可減少檔案 IO 的成本

我們使用下面查詢取得資料

SELECT SalesOrderID
 ,SalesOrderDetailID
 ,CarrierTrackingNumber
FROM Sales.SalesOrderDetail

在資料列存放區,每個區塊都需要被讀取然後才取得查詢結果(黃色底的區塊代表 IO 會存取到的檔案區塊)

但在資料行存放區,只需讀取特定欄位 (SalesOrderID,SalesOrderDetailID,CarrierTrackingNumber) 的區塊

OrderQty 的區塊並不需要被讀取

讀取的區塊相較之下變少了,查詢成本相較之下就減少了

此文章僅說明在 IO 上的成本差異,更多資料行存放區的優缺點煩請參考官方文件

Columnstore indexes: Overview

參考資料

留言