1、向量(Vector)的概念
(1)、向量的定義
- 向量:在計算機科學中,向量是一組同類型數據的有序集合,例如一個包含多個數值的數組。在數據庫中,向量通常指批量數據(如一列數據的多個值組成的集合)。
理解:Java中的一個int數組或String列表等都算一個向量。
示例:
向量 A = [1, 2, 3, 4, 5]
- 向量化(Vectorization):通過單條指令同時對多個數據元素進行操作的技術,例如用一條指令對一個向量中的所有元素執行加法運算。
(2)、向量的特點
- 同質性:向量中的所有元素都屬于同一數據類型。
- 連續性:向量中的數據在內存中是連續存儲的,這使得訪問和操作非常高效。
- 批量處理:可以一次性對整個向量進行操作,而不是逐條處理單個元素。
(3)、向量在ClickHouse中的具體形式
-
數據塊(Block):
ClickHouse將數據按列式存儲,每個列的數據被劃分為多個數據塊(Block)。每個塊包含固定數量的行(如8192行),形成一個向量。
示例:
列 “age” 的數據塊可能包含 [25, 30, 35, 40, …](默認:8192個值)。 -
SIMD寄存器:
CPU的SIMD(Single Instruction Multiple Data)寄存器(如SSE、AVX)可以同時存儲多個數據元素,例如一個 128 位寄存器可存儲4個32位整數。向量化執行時,數據塊會被加載到這些寄存器中,通過一條指令并行處理多個元素。
2、向量化執行的實現方式
(1)、向量化執行的核心思想
傳統行式執行(Row-wise)逐行處理數據,而向量化執行以數據塊(向量)為單位處理數據,減少循環次數和函數調用開銷。
對比示例:
傳統行式方式:循環處理每行 → 處理10000行需要10000次循環;
for i in range(len(data)):result[i] = data[i] * data[i]
向量化方式:每次處理一個塊(如8192行) → 僅需2次循環。
result = [x * x for x in data]
解釋:
向量化執行通過SIMD指令(如SSE4.2、AVX)對向量中的多個數據同時執行相同操作,一次可以執行8192個數據,所以只需要2次執行即可。
(2)、ClickHouse的向量化執行流程
- 數據加載:
列式數據從磁盤加載到內存,按固定大小(如8192行)劃分為數據塊。 - 批量運算:
對每個數據塊執行操作(如過濾、聚合、計算),利用SIMD指令并行處理多個元素。 - 結果合并:
各數據塊的中間結果合并為最終結果。
(3)、向量化與列式存儲的結合
- 列式存儲:
數據按列存儲,天然適合批量讀取和處理(如只讀取需要的列)。 - 緩存優化:
連續的列數據塊更易被CPU緩存命中,減少內存訪問延遲。
3、向量化執行與傳統執行方式的對比
(1)、傳統行式執行(Row-wise)的局限
(2)、具體性能提升示例
-
過濾操作:
傳統方式:遍歷每行,判斷 WHERE age > 30 → 循環次數多。
向量化方式:對數據塊 age 列的8192個值同時比較 → 一條指令完成。 -
聚合操作:
傳統方式:逐行累加SUM(age) → 8192次加法。
向量化方式:將數據塊分成多個SIMD向量,每個向量并行累加 → 減少到約2048次加法。
4、向量化執行的核心優勢
(1)、減少函數調用開銷
- 傳統方式:每行調用函數 → 函數調用次數與行數線性相關。
- 向量化:按塊調用 → 函數調用次數減少 塊大小 倍。
(2)、提升CPU緩存效率
- 連續列式數據塊加載到緩存,減少內存帶寬占用和延遲。
- 列式存儲結合向量化,可減少I/O和CPU周期。
(3)、利用SIMD并行計算
- 一條指令處理多個數據元素,例如:
- SSE4.2:128位寄存器可同時處理4個32位整數。
- AVX-512:512位寄存器可處理16個32位整數。
(4)、降低控制流開銷
- 傳統方式:在逐行執行中,條件判斷(如if語句)可能導致分支預測失敗,破壞CPU流水線,進而引入性能開銷。
- 向量化:向量化執行可以通過批量處理避免頻繁的分支判斷,降低了分支預測失敗的概率。
5、總結
向量是一組連續存儲的同類型數據,可以看作是一維數組。它是批量處理實現的基礎。
向量化執行是一種對整個向量(而非單個元素)進行操作的計算方式。它通過減少指令開銷、利用SIMD指令集、提高緩存命中率等手段,顯著提升了查詢性能。
向量化執行是ClickHouse實現高性能的核心技術,其核心思想是批量處理數據并利用SIMD指令并行計算。通過將數據劃分為向量(數據塊),ClickHouse顯著減少了函數調用次數、優化了CPU緩存使用,并充分利用了現代CPU的SIMD能力。與傳統行式執行相比,向量化在分析型查詢(如過濾、聚合、排序)中性能提升可達 10-100倍,尤其適用于海量數據的OLAP場景。
關鍵點:
- 向量 = 數據塊 + SIMD并行
- 優勢 = 減少開銷 + 緩存優化 + 硬件加速
- 適用場景 = 列式存儲 + 分析查詢
逆風翻盤,Dare To Be!!!