本文介紹了使用向量化引擎過程中可能遇見的問題及解決方案。
建立列存索引時提示:ERROR: access method "csi" does not exist
需要建立polar_csi外掛程式,請執行以下指令。
CREATE EXTENSION polar_csi;建立列存索引較慢
可通過設定不同參數來加快索引建立速度,詳情請參見提升索引建立速度。
建立列存索引過程阻塞原表寫入
最新寫入的資料無法在列存索引中被檢索
確認當前查詢是否使用列存索引,詳細操作請參見查看SQL是否使用列存索引。
確認當前查詢已使用列存索引,可能原因是向量化引擎未能及時將行存資料同步至列存索引中。可通過調整相關參數來提升行列同步的速度,詳情請參見列存索引的即時性。
預設情況下,向量化引擎使用最終一致性層級,因此查詢時使用的資料可能是舊資料,可開啟強一致性讀功能來保證列存索引資料必須與行存資料一致後再返回,詳情請參見查詢一致性。
開啟強一致性功能後查詢變慢
確認當前查詢是否使用列存索引,詳細操作請參見查看SQL是否使用列存索引。
確認當前查詢已使用列存索引,可能原因是向量化引擎未能及時將行存資料同步至列存索引中。可通過調整相關參數來提升行列同步的速度,詳情請參見提升索引建立速度。
如果行存表的寫入量較大,且行列同步效能無法滿足要求時,可以考慮關閉強一致性讀功能,轉而採用最終一致性。
SET polar_csi.forward_replay_wait = off;
查詢無法使用列存索引/向量化引擎
請按如下步驟檢查:
確認是否安裝向量化引擎外掛程式,詳情請參見安裝向量化引擎外掛程式。
確認表是否建立列存索引,詳情請參見建立列存索引。
確認查詢語句所涉及的列是否都在加速索引中。例如,使用
CREATE INDEX csi_idx_t ON t USING CSI(id,name);建立索引,使用SELECT id,name,age FROM t;查詢時無法使用列存索引,這是因為查詢語句中age欄位並未包含在列存索引中。確認是否開啟向量化查詢,通過
SHOW polar_csi.enable_query來確認,當結果為off時,表示該SQL語句無法使用列存索引,開啟向量化引擎功能請參見參數設定。確認查詢語句的執行代價是否較小。當查詢語句較為簡單時,使用行存引擎效率更高。可通過Explain或Explain Analyze等工具列印查詢計劃,確認語句的查詢代價,若需要忽略查詢代價,強制查詢語句使用列存索引,可將
polar_csi.cost_threshold值設為0,其他注意事項請參見參數設定。如果還無法使用向量化引擎加速,可執行
SET client_min_messages = debug5進一步排查。
與PolarDB ePQ的關係
PolarDB PostgreSQL版的ePQ是雲端式原生一寫多讀架構下,為了充分利用所有RO節點的計算資源而研發的跨機並行能力。ePQ能夠將一個查詢語句分發到所有的RO節點執行,而原生PostgreSQL的並行能力只能使用一個節點的計算資源,因此PolarDB PostgreSQL版的ePQ比原生PostgreSQL具有更好的scale out能力。
PolarDB PostgreSQL版的向量化引擎與ePQ並非同一種技術,向量化引擎的目標是在同樣的硬體資源下提升計算效率,而ePQ的目標是能充分利用資料庫叢集的所有資源,二者相互補充。