- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
本文章使用圖解資料行存放區 (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 上的成本差異,更多資料行存放區的優缺點煩請參考官方文件
留言
張貼留言