將編輯好的 SQL 查詢複製到 SSMS 會出現無法執行錯誤

資料行存放區索引是如何增加 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

參考資料

留言