資料與儲存 2026 年 4 月 24 日

2026-04-24 — 資料與儲存:ClickHouse 取代 Elasticsearch、PostgreSQL 欄式儲存擴充、SQLite pub/sub

ClickHouse 挑戰 Elasticsearch 日誌…

ClickHouse 挑戰 Elasticsearch 日誌分析霸主地位:全文搜尋與大規模分析的整合引擎

ClickHouse Blog · 2026-04-23

ClickHouse 在 2026 年 4 月的這篇文章中,正式宣告其日誌分析能力已能取代 Elasticsearch:在同一個引擎中同時提供大規模分析查詢性能和完整的全文搜尋功能,而無需維運兩套獨立的系統。

技術背景

日誌分析歷來分為兩個主要需求:其一是對特定字串的精確與模糊搜尋(Elasticsearch/OpenSearch 的傳統強項,基於倒排索引);其二是對時間序列日誌的聚合分析,如錯誤率統計、P99 延遲計算、趨勢分析(ClickHouse 的傳統強項,基於列式儲存)。企業通常需要同時部署兩套系統,帶來雙倍的維運複雜度與成本。

ClickHouse 的全文搜尋實作

ClickHouse 透過以下機制實現在列式儲存引擎中的全文搜尋能力:

  • 倒排索引(Inverted Index):對字串欄位建立詞項到行號的映射,支援詞項匹配、前綴搜尋和模糊搜尋
  • 全文索引函式hasToken()hasTokenCaseInsensitive() 等函式利用倒排索引進行快速篩選
  • BM25 排序:支援基於 BM25 算法的相關性排序,與 Elasticsearch 的預設排序算法一致
  • 列式存儲優勢保留:全文搜尋索引與 ClickHouse 的 MergeTree 儲存引擎深度整合,分析查詢仍可利用列式存儲的壓縮率和向量化執行引擎

性能對比

ClickHouse 官方的基準測試顯示,在典型日誌分析工作負載(大量聚合 + 部分全文搜尋)下,ClickHouse 的查詢速度比 Elasticsearch 快數倍至數十倍,同時儲存空間使用量低 5-10 倍(得益於列式壓縮)。Elasticsearch 在純全文搜尋排序場景下仍具優勢,但對多數日誌分析場景而言,ClickHouse 的整合方案已足夠。

遷移考量

Elasticsearch 的查詢 DSL(Domain-Specific Language)與 ClickHouse 的 SQL 方言存在顯著差異,現有 Kibana/OpenSearch Dashboards 的整合需要適配。ClickHouse 提供了 Elasticsearch 相容的 API 端點以降低遷移成本,但對於深度使用 Elasticsearch 聚合(Aggregation API)的場景,遷移仍需相當的工程投入。

原始來源:ClickHouse Blog


storage_engine 1.0.7:為 PostgreSQL 16-18 帶來欄式壓縮與行式壓縮兩種 Table Access Method

PostgreSQL News · 2026-04-23

storage_engine 1.0.7 是一個 PostgreSQL 擴充功能,透過 PostgreSQL 的 Table Access Method(TAM)API 為資料庫提供兩種替代儲存引擎,分別針對分析查詢和通用工作負載的壓縮需求。

Table Access Method API 背景

PostgreSQL 的 Table Access Method(TAM)API 在 PostgreSQL 12 中引入,允許第三方開發者實作自定義的資料儲存引擎,替換預設的 heap(堆疊)儲存格式。TAM 擴充功能可以定義自己的資料布局、MVCC 實作、掃描方法和 VACUUM 策略,同時保持與 PostgreSQL 的索引、查詢規劃器和 SQL 介面的完整相容性。

兩種儲存引擎

colcompress(欄式壓縮儲存):以欄位(column)為單位儲存資料,相同欄位的值在磁碟上連續存放。這種布局在分析查詢中具有顯著優勢:當查詢只需讀取少數欄位時,I/O 量大幅降低;相同資料類型的連續值壓縮率遠高於行式儲存。colcompress 特別適合寬表的分析查詢(SELECT 少數列,FROM 大量行)場景,支援 PostgreSQL 16-18 版本。

行式壓縮儲存(Row-Compressed Storage):保留傳統行式儲存的布局(每行資料連續存放),但在行層級應用透明壓縮,在維持 OLTP 工作負載相容性的同時降低儲存空間使用。適合需要同時服務讀多寫少的混合工作負載且希望降低儲存成本的場景。

1.0.7 版本更新

此版本帶來了對 PostgreSQL 18 的正式支援(PostgreSQL 18 目前處於 beta 階段),並修復了若干在大資料量掃描時的邊界條件問題。TAM 實作遵循 PostgreSQL 的 ACID 保證,但部分進階功能(如特定類型的 VACUUM 操作)可能與 heap 引擎有所差異,需參閱文件確認相容性。

原始來源:PostgreSQL News


Honker:為 SQLite 帶來 PostgreSQL NOTIFY/LISTEN 語義的開源 Pub/Sub 函式庫

GitHub/russellromney · 2026-04-24

Honker 是一個開源函式庫,在 SQLite 資料庫上實現了 PostgreSQL 的 NOTIFY/LISTEN pub/sub 語義,使使用者能夠在不依賴外部訊息佇列的情況下,在 SQLite 資料庫上構建輕量級的事件驅動架構。此專案在 Hacker News 上獲得了 217 分的高評價。

PostgreSQL NOTIFY/LISTEN 的設計

PostgreSQL 的 NOTIFY/LISTEN 機制允許資料庫客戶端透過 SQL 命令進行非同步訊息傳遞:發送方執行 NOTIFY channel, 'payload' 將訊息發布至指定頻道;接收方執行 LISTEN channel 訂閱頻道,並透過連線的非同步事件機制接收通知。這一機制在 PostgreSQL 的網路協議層實作,利用長連線的服務端推送能力,為資料庫客戶端提供了輕量級的事件通知功能。

SQLite 的挑戰與 Honker 的解法

SQLite 的設計是嵌入式、無伺服器的,缺乏 PostgreSQL 的持久網路連線和伺服器端推送能力。Honker 透過以下機制在 SQLite 上模擬 NOTIFY/LISTEN 語義:利用 SQLite 的「儲存」(storage)功能在資料庫中建立一個訊息佇列表;使用 SQLite 的更新鉤子(update hook)在資料庫寫入時觸發通知;接收方透過輪詢(polling)或 SQLite 的 WAL 模式鉤子監聽新訊息。Honker 提供與 PostgreSQL asyncpg/psycopg2 相似的 Python API 介面,降低了在 PostgreSQL 和 SQLite 之間切換的學習成本。

適用場景

Honker 特別適合本地開發環境(以 SQLite 模擬 PostgreSQL 的 pub/sub 行為)、邊緣計算場景(無法部署完整 PostgreSQL 伺服器)、以及輕量級事件通知需求(不值得為此引入 Redis Pub/Sub 或 RabbitMQ 等外部依賴)。

原始來源:GitHub/russellromney/honkerPostgreSQL NOTIFY 文件


End of article
0
Would love your thoughts, please comment.x
()
x