iT邦幫忙

2025 iThome 鐵人賽

DAY 17
1

目前為止,我們已經深入了解 Parquet 的欄式儲存設計,看到它如何透過分層架構和壓縮技術來高效儲存資料。但是,資料儲存只是第一步,真正的價值在於如何快速查詢和分析這些資料。今天,我們要來探討 OLAP 查詢引擎的核心概念,以及為什麼它特別適合處理 columnar data。

什麼是 OLAP (Online Analyticla Processing,線上分析處理)?

OLAP 是一種可以從多個角度分析業務資料的技術。我們可以從它的名字來分析它能做到哪些事:

  • Online: 即時地
  • Processing: 處理(processing) 來源資料
  • Analytical: 並透過分析來生成報表

OLAP 時常被拿來與 OLTP 來進行比較與選型。為了能更了解 OLAP 的優勢,以下讓我們直接來比較兩者有哪些技術上的差異。

OLAP vs OLTP:技術面的差異

所有資料庫管理系統都可以分為兩大類:OLAP(Online Analytical Processing)和 OLTP(Online Transactional Processing)。前者專注於建立報表,每次基於大量歷史資料進行分析,但執行頻率較低;後者通常處理持續的交易流,不斷修改資料的當前狀態。

簡單來說,OLAP 通常用於製作歷史資料的分析與報告,因為如此,它不太需要去處理、保持資料的一致性,它關注的是如何能透過 query 去快速地得到資料聚合後的結果並統合成資料洞察。

不過,在實務上,OLAP 和 OLTP 並非二元對立的分類,而更像是一個光譜。大多數真實系統通常會專注於其中一種,但也會提供一些解決方案或變通方法來處理另一種工作負載。這種情況常常迫使企業需要運行多個整合的儲存系統,增加了維護成本。
https://ithelp.ithome.com.tw/upload/images/20251001/201779615gpV3X5UcE.png

圖中架構結合了 OLAP 與 OLTP 兩種資料庫。OLTP負責儲存商務交易和紀錄,而 OLAP 資料庫則保存所有歷史紀錄,以利進行後續的時間序列分析

因此,近年來的趨勢是朝向 HTAP(Hybrid Transactional/Analytical Processing)發展,讓單一資料庫管理系統能同時處理這兩種工作負載。即使是最初設計為純 OLAP 或純 OLTP 的系統,也逐漸加入對另一種工作負載的支援以保持競爭力。

OLAP 與 OLTP 的根本取捨

然而,OLAP 和 OLTP 系統之間仍存在一個根本的取捨:

  • 高效建立分析報表的關鍵在於能夠單獨讀取欄位,因此大多數 OLAP 資料庫採用欄式儲存(columnar storage)
  • 但欄式儲存會增加列操作的成本,例如新增或就地修改資料,且成本與欄位數量成正比(在試圖收集事件的所有細節時,欄位數量可能非常龐大)。因此,大多數 OLTP 系統採用列式儲存(row-based storage)
  • OLTP 重視資料處理與一致性,如果儲存的資料與交易等強調一致性的資料有關,就不太適合使用 OLAP。

這就是為什麼 Parquet 這類欄式儲存格式特別適合 OLAP 場景。當我們儲存了夠寬的結構化資料,它讓我們能夠只讀取需要的欄位,在高基數、高維度的資料中,也能大幅提升資料的查詢效率。

OLAP 查詢引擎的核心技術

1. 欄式儲存 (Columnar Storage)

https://ithelp.ithome.com.tw/upload/images/20251001/20177961KUcSK5mYy4.png
我們在前面的文章中已經深入探討過 Parquet 的欄式儲存設計。OLAP 引擎利用欄式儲存的優勢:

  • 減少 I/O:只讀取查詢需要的欄位
  • 高壓縮率:相同類型的資料聚集在一起,壓縮效果更好
  • 向量化執行:可以批次處理同一欄位的多個值

2. 分區 (Partitioning)

分區是將大型資料集按照某個維度進行物理分割的技術。在可觀測性場景中,最常見的分區維度是時間,因為大多數查詢都會指定時間範圍。

分區的結構

以時間分區為例,資料會被組織成這樣的目錄結構:

data/
├── date=2025-09-01/
│   └── metrics.parquet
├── date=2025-09-02/
│   └── metrics.parquet
└── date=2025-09-03/
    └── metrics.parquet

這樣分區的設計有幾項優勢:

  1. 分區修剪 (Partition Pruning)
    https://ithelp.ithome.com.tw/upload/images/20251001/20177961mpO33miLOX.png

    • 當查詢指定時間範圍時,系統可以直接跳過不相關的分區
    • 例如查詢「2025-05-01 的資料」時,只需要掃描 date=2025-05-01/ 這個分區
    • 大幅減少需要讀取的資料量
  2. 平行處理

    • 不同分區可以同時被不同的執行緒或節點處理
    • 提升查詢的平行度和整體效能
  3. 資料管理

    • 可以輕鬆刪除過期資料(直接刪除整個分區目錄)
    • 方便實作資料保留政策(retention policy)

選擇分區鍵(partition key)的考量

  • 查詢模式:選擇最常用的查詢條件作為分區鍵。例如可觀測性資料通常需要時間軸,才能賦予其資料意義,因此常見的分區策略通常與時間有關
  • 分區大小:每個分區不宜過小(造成過多檔案)或過大(失去分區效果)
  • 基數:避免選擇基數過高的欄位(如 user_id),會產生過多分區

3. 索引技術

現代 OLAP 資料庫(如 ClickHouse、Druid、DuckDB)使用多種索引技術來加速查詢:

Zone Maps / Skip Index

  • 記錄每個資料塊(或 Page)的統計資訊,包括最小值、最大值、空值數量等
  • 查詢引擎可以根據這些統計資訊判斷是否需要掃描該資料塊
  • 例如:查詢 WHERE timestamp > '2025-09-02' 時,可以跳過所有最大值小於該時間的資料塊
  • 在 Parquet 中,Page Index 就是這種技術的實現

排序鍵 (Sort Key)

  • 資料按照指定的欄位排序儲存,讓範圍查詢更高效
  • 配合 Zone Maps 可以快速過濾資料
  • 適合經常用於過濾條件的欄位(如時間戳記)

倒排索引 (Inverted Index)

  • 用於加速文字搜尋和全文檢索
  • 特別適合處理 log 資料中的關鍵字搜尋
  • 在可觀測性場景中常用於搜尋錯誤訊息或特定事件

與傳統 OLAP Cube 預先計算所有維度組合不同,現代 OLAP 資料庫不需要預先建立聚合表,而是透過這些索引技術在查詢時快速過濾和定位資料,提供更高的靈活性。

結語

今天我們深入探討了 OLAP 查詢引擎的核心技術,從技術角度理解了為什麼 OLAP 特別適合處理可觀測性資料。

回顧這幾天的內容,從 Apache Iceberg 的 table format、Parquet 的欄式儲存設計,到今天的 OLAP 查詢引擎,我們逐步建構了對 Data Lakehouse 架構的理解——從資料的組織、儲存到查詢,這些技術環環相扣,共同支撐起海量可觀測性資料的高效分析。

參考資料

AWS - 什麼是 OLAP (線上分析處理)?

ClickHouse - What is OLAP?

Hubert Dulay - What is Hybrid Transactional & Analytical Processing (HTAP)

Microsoft Azure - 在線分析處理

Vu Trinh - Partitioning and Clustering


上一篇
Day 16 - 解構 Parquet:從檔案結構看欄式儲存設計原理(下)
下一篇
Day 18 - AWS Kinesis Data Firehose:架構選擇與設計考量(上)
系列文
被稱作Server Restart Engineer的我,也想了解如何實踐可觀測性工程18
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言