針對基準測試查詢的手寫最佳化與規則衝突

ClickBench 維護者 alexey-milovidov 指出,pgrust v0.4-preview 的執行機制是專門為 ClickBench 的 43 個查詢撰寫的。透過檢查發布的二進位檔,發現其中嵌入了諸如 q00.rs、q01.rs 等對應各查詢編號的原始碼路徑。

這些核心由名為 'clickbench group count' 或 'clickbench phrase-min' 等特定名稱的計畫匹配器分派。此外,還存在一個名為 PGRUST_GRAVITY_Q20_VARIANT 的環境變數開關。公開的 v0.3 原始碼證實了這種設計,其標頭註解說明這是為所有 43 個 ClickBench 查詢手動降階的物理計畫。

根據 ClickBench 規則,查詢結果快取和管道末端的快取必須禁用,且條目標記為 'tuned: no'(未調校)。然而 pgrust 的行為顯示它針對這些特定查詢進行了深度調校,並使用了違反規則的快取機制。

熱執行結果實為前次執行的回放

對於 Q20、Q21 和 Q23 等查詢,計畫註解顯示熱重複執行是「純粹對快取判斷結果進行摺疊操作——零欄位觸碰;選擇即為答案」。在發布的二進位檔上執行 EXPLAIN 指令,Q20 顯示引擎家族為 'windowreplay',而 Q1 顯示為 'metaanswer' 且掃描標記為 'never executed'。

在 96 核心的 Graviton (Neoverse-V2) 機器上使用該條目自帶的腳本進行本地測量,並執行真正的冷循環(停止、清除快取、啟動)。Q20 查詢(URL LIKE '%google%')的首次冷執行耗時 10.8 秒,第二次執行降至 11 毫秒,第三次為 5 毫秒。若改變常數(如改為 '%rambler%'),首次執行則需 283 毫秒,隨後降至 12 毫秒和 4 毫秒。

Q17 查詢的首次冷執行為 1.65 秒,後續熱執行僅需 4 至 15 毫秒。Q33 查詢首次為 2.38 秒,後續為 213 毫秒和 108 毫秒。第二次重啟後,Q20 再次回到 11.2 秒的冷執行時間,隨後降至 3 毫秒。這表明發布的熱執行數據(7 至 23 毫秒)實際上是前一次執行判斷結果的回放,而非真實的掃描速度。

v0.2 版本曾披露類似的快取設定 (pgrust.condition_cache = on) 並提供關閉選項,但 v0.4 更新移除了該 README 和設定。目前即使將 pgrust.gravity_entry 和 pgrust.condition_cache 設為 off,重複的 LIKE 查詢仍會在 3 至 4 毫秒內返回結果。

缺乏通用執行路徑與寫入支援

該引擎對於列式表格沒有通用的執行路徑。稍微修改基準測試語法的查詢會失敗並報錯:'ERROR: sqe: statement over columnar relation "hits" is not served',錯誤詳情指出 'sqe 引擎服務於無回退機制的列式形狀;未服務的形狀會大聲失敗而不是緩慢執行'。

在測試中,67 個接近基準測試的探測查詢中有 20 個被拒絕,49 個變體中有 3 個被拒絕。被拒絕的簡單查詢包括 SELECT MIN(URL) FROM hits、SELECT COUNT(*) FROM hits WHERE URL = '...'、以及涉及 AVG(UserID + 1) 或 SUM(ResolutionWidth * 2) 的計算。

此外,該引擎不支援對該表格進行 INSERT、UPDATE 和 DELETE 操作,錯誤訊息為 'pgrcolumnar2 does not support INSERT'。這意味著 pgrust 在該測試環境中僅能處理預先定義好的特定查詢形狀,無法作為通用的資料庫引擎使用。

結果正確性與開發者回應

儘管存在上述問題,pgrust 對這 43 個查詢的回答本身是正確的。與 clickhouse local 在相同的 hits.parquet 檔案上比較,30 個結果完全匹配,其餘差異僅為 LIMIT 查詢中的有效並列處理(已個別驗證)。問題不在於錯誤的結果,而在於這些結果測量的是基準測試的查找表,而非一個真正的資料庫系統。

pgrust 開發者 malisper 在 GitHub 和 Hacker News 上回應稱,指控大部分不實。他表示該提交是 pgrust 0.4-preview 的早期版本,團隊已於近期開源了更新的 pgrust 0.4-beta 版本以供完整審查。他認為與其爭論,不如完成並開源新版本以證明誠實性。

社群討論中有人質疑這種「先發布測試版,幾週後再開源程式碼」的做法是否符合開源常態,也有觀點認為基準測試結果應基於隨機化數據以避免快取效應。ClickHouse 團隊已合併移除 pgrust 的提交 (commit 48c06ac),並刪除了相關分支。