全部產品
Search
文件中心

PolarDB:開啟和使用列存索引

更新時間:Jan 07, 2026

PolarDB PostgreSQL版支援通過控制台添加列存索引唯讀節點和直接使用列存索引外掛程式這兩種方式來開啟和使用列存索引。您可以根據實際業務情境選擇最適合您的使用方式。

適用範圍

  • 叢集版本:

    • PostgreSQL 14(核心小版本為2.0.14.10.20.0及以上)

    • PostgreSQL 15(核心小版本為2.0.15.15.7.0及以上)

    • PostgreSQL 16(核心小版本為2.0.16.8.3.0及以上)

    • PostgreSQL 17(核心小版本為2.0.17.7.5.0及以上)

    說明

    您可在控制台查看核心小版本號碼,也可以通過SHOW polardb_version;語句查看。如未滿足核心小版本要求,請升級核心小版本

  • wal_level參數的值需設定為logical,即在預寫式日誌WAL(Write-Ahead Logging)中增加支援邏輯編碼所需的資訊。

    說明

    您可以通過控制台設定wal_level參數。修改該參數後叢集將會重啟,請在修改參數前做好業務安排,謹慎操作。

  • 原表必須包含主鍵,並且在建立列存索引時,需要將主鍵列加入列存索引中。建議使用SERIALBIGSERIAL類型的主鍵,這將顯著提高資料同步的效率。

  • 一張表只能建立一個列存索引。

開啟列存索引功能

對於不同的PolarDB PostgreSQL版核心版本,開啟列存索引的方式不同:

PostgreSQL 16(2.0.16.9.8.0及以上)或PostgreSQL 14(2.0.14.17.35.0及以上)

目前的版本下的PolarDB PostgreSQL版叢集,支援兩種開啟方式,具體差異如下,請按需選擇:

對比項

【推薦】添加列存索引唯讀節點

直接使用預先安裝的列存索引外掛程式

操作方式

通過控制台實現可視化操作,手動添加列存索引節點。

無需任何操作,即可直接使用。

資源分派

列存引擎獨佔所有資源,能夠充分利用所有記憶體。

列存引擎只能使用25%的記憶體,其餘記憶體則分配給行存引擎使用。

業務影響

TP(事務)與AP(分析)業務在不同節點上相互隔離,互不影響。

TP(事務)與AP(分析)業務在同一節點,會互相影響。

費用

需額外收取列存索引唯讀節點的費用,按照普通計算節點收費。

無費用。

添加列存索引唯讀節點

您可選擇以下兩種方式中任意一種方式添加列存索引唯讀節點:

說明

叢集中應包含一個唯讀節點,即單節點叢集不支援添加列存索引唯讀節點。

控制台添加

  1. 登入PolarDB控制台,選擇叢集所在地區。您可以按照如下兩種方式中的任意一種進入增删节点向导頁面:

    • 集群列表頁面,單擊操作欄的增删节点

      image

    • 在目的地組群的基本信息頁面,数据库节点地區,單擊增删节点

      image

  2. 選擇增加列存索引只读节点選項,並單擊确定

  3. 在叢集變更配置頁面,添加列存索引唯讀節點並支付。

    1. 單擊增加一个列存索引只读节点,選擇節點規格。

    2. 選擇切換時間。

    3. (可選)查看產品服務合約、服務等級協議。

    4. 單擊立即购买

    image

  4. 支付完成後,返回叢集詳情頁等待列存索引唯讀節點添加成功,即節點狀態為运行中image

購買時添加

PolarDB購買頁节点个数配置項中自行選擇列存索引唯讀節點數量。

image

PostgreSQL 16(2.0.16.8.3.0~2.0.16.9.8.0)或PostgreSQL 14(2.0.14.10.20.0~2.0.14.17.35.0)

目前的版本下的PolarDB PostgreSQL版叢集,列存索引作為外掛程式polar_csi部署在資料庫叢集中,在使用之前需要在指定的資料庫中建立外掛程式。

說明
  • polar_csi外掛程式的範圍是Database層級,如果需要在叢集的多個Database中使用列存索引,需要為每個Database分別建立polar_csi外掛程式。

  • 安裝外掛程式使用的資料庫帳號必須為高許可權帳號

您可以選擇以下兩種方式中的任意一種安裝polar_csi外掛程式。

控制台安裝

  1. 登入PolarDB控制台,在左側導覽列單擊集群列表,選擇叢集所在地區,並單擊目的地組群ID進入叢集詳情頁。

  2. 在左側導覽列選擇配置与管理 > 插件管理,在管理插件頁簽,選中未安装插件

  3. 在頁面右上方選擇目標資料庫,單擊polar_csi外掛程式操作列安装,在彈出的安装插件對話方塊,選擇目標数据库账号,單擊確定,即將外掛程式安裝到目標資料庫中。

    image.png

命令列安裝

串連資料庫叢集,並在具有相應許可權的目標資料庫中執行以下語句,建立polar_csi外掛程式。

CREATE EXTENSION polar_csi;

建立列存索引

1. 為指定列或所有列建立列存索引

文法說明

-- 為部分列建立索引
CREATE INDEX [ CONCURRENTLY ] csi_index_name ON table_name USING CSI(column1,column2,...);
-- 為所有列建立索引
CREATE INDEX [ CONCURRENTLY ] csi_index_name ON table_name USING CSI;

參數說明

參數

描述

CONCURRENTLY

可選,使用併發模式建立索引。不會阻塞原表的寫入操作,適用於對線上已有表的索引建立。

說明
  • PostgreSQL 14且核心小版本2.0.14.13.27.0及以上叢集支援使用該參數。如不滿足核心小版本要求,請升級核心小版本

  • CONCURRENTLY的實現依賴邏輯複製槽功能,在核心小版本2.0.14.13.27.0及以上叢集該功能將預設啟用。如使用舊版本,需重裝polar_csi外掛程式或聯絡我們處理。

  • 使用CONCURRENTLY建立索引時,會建立臨時邏輯複製槽以支援並行作業。資料同步完成後,臨時邏輯複製槽將自動釋放。

csi_index_name

自訂的列存索引名稱。

table_name

需要建立列存索引的表名稱。

column1,column2,...

指定建立列存索引的表的具體列,如不指定則為所有列建立索引。

樣本

  1. 準備基礎測試表sales

    CREATE TABLE sales (sale_id int primary key, name CHAR(10), amount int);
  2. 建立列存索引。由於一張表只能建立一個列存索引,請選擇執行以下任一語句以為指定表建立列存索引。

    指定列建立列存索引

    CREATE INDEX idx_csi_sales ON sales USING CSI(sale_id, amount);

    所有列建立列存索引

    CREATE INDEX idx_csi_sales ON sales USING CSI;

    使用併發模式為指定列建立列存索引

    併發模式下建立列存索引不會阻塞原表的寫入操作,適用於對線上已有表進行索引建立。

    CREATE INDEX CONCURRENTLY idx_csi_sales ON sales USING CSI(sale_id, amount);

    建立索引成功後可使用以下語句查看索引情況:

    SELECT * FROM pg_indexes WHERE tablename = 'sales';

2. 查看索引建立進度

為資料量較大的表建立列存索引可能耗時較長,可通過以下方式查看索引建立的進度。同時,您可以調整相關參數以提升索引建立的速度

SELECT * FROM pg_stat_progress_create_index;

3. (可選)取消索引建立

當建立索引耗時較長,且建立索引的進程對現有業務產生了影響,您可通過pg_cancel_backendpg_terminate_backend取消索引的建立,函數中需要的pid可通過2. 查看索引建立進度擷取。

SELECT pg_cancel_backend(pid);

SELECT pg_terminate_backend(pid);

4. 查看索引大小

可以使用pg_relation_size函數查看索引大小,並結合pg_size_pretty函數以更友好的方式進行顯示。

SELECT * FROM pg_size_pretty(pg_relation_size('csi_index_name'));

例如,查看之前建立的列存索引佔用的儲存空間大小。

SELECT * FROM pg_size_pretty(pg_relation_size('idx_csi_sales'));

5. (可選)列存索引資料即時性

PolarDB PostgreSQL版叢集不僅支援對歷史資料建立列存索引,還能夠自動將行存表中的新資料同步至列存索引。當使用CREATE INDEX語句為表建立列存索引後,之後新增的資料將即時寫入列存索引,且無需對該過程進行額外操作。

列存索引通過PolarDB PostgreSQL版的邏輯複製機制實現資料同步,需對WAL日誌進行解碼並將其同步至列存引擎,在預設配置下,該機制能夠承載約20萬QPS的寫入壓力(基於Sysbench oltp_insert標準測試)。

  • 查詢當前資料同步延遲

    SELECT active_pid, database, slot_name, pg_size_pretty(pg_current_wal_lsn() - confirmed_flush_lsn) AS size FROM pg_replication_slots WHERE slot_name LIKE 'csi_sync_%';

    當size維持在50 MB以內時,列存資料可在秒級實現同步重新整理。

  • 提高資料同步效率

    為滿足某些業務情境下的行列資料即時性的要求,您可以通過調整參數polar_csi.update_intervalpolar_csi.update_batch_count提升列存索引的即時性

使用列存索引

1. 配置參數

在建立完列存索引後,可以通過如下參數來控制SQL查詢語句是否使用列存索引。

參數

說明

polar_csi.enable_query

是否允許查詢語句使用列存索引,取值如下:

  • off(預設):不允許查詢語句使用列存索引。

  • on:允許查詢語句使用列存索引。

SET polar_csi.enable_query = on;

polar_csi.cost_threshold

查詢代價閾值,是否使用列存索引。如果查詢代價小於當前設定閾值,使用行存引擎,反之使用列存引擎。

SET polar_csi.cost_threshold = 0;
說明

將值設定為0時,所有查詢語句都將優先採用列存索引。不建議在實際業務中將值設定為0,請根據行存引擎與列存引擎的負載情況動態調整該值。

2. 配置參數生效範圍

全域範圍

您可以通過控制台設定polar_csi.enable_query參數on,讓所有資料庫中的查詢語句都會嘗試使用列存索引。

會話級

會話內的所有查詢都會嘗試使用列存索引。

SET polar_csi.enable_query = ON;

SQL語句級

會話內的單個SQL查詢語句使用列存索引,可通過Hint方式實現。

說明

依賴pg_hint_plan外掛程式的能力,需要在目標資料庫執行CREATE EXTENSION pg_hint_plan;以安裝該外掛程式。

  • 僅設定polar_csi.enable_query

    -- 允許查詢語句使用列存索引
    /*+ SET (polar_csi.enable_query on) */ SELECT COUNT(*) FROM sales;
  • 設定polar_csi.enable_querypolar_csi.cost_threshold

    -- 允許查詢語句使用列存索引並且設定查詢代價閾值為0
    /*+SET (polar_csi.enable_query on) SET(polar_csi.cost_threshold 0)*/  SELECT COUNT(*) FROM sales;

3. 查看SQL是否使用列存索引

通過ExplainExplain Analyze等工具列印查詢計劃,出現CSI Executor關鍵詞時即表示該查詢已經使用列存索引。

EXPLAIN SELECT COUNT(*) FROM sales;

返回結果如下:

  QUERY PLAN  
--------------
 CSI Executor
(1 row)

4. (可選)配置列存索引資料查詢一致性

PolarDB PostgreSQL版列存索引支援兩種查詢一致性層級,以滿足不同業務需求。

  • 最終一致性(預設):適用於寫入負載高,但對資料即時性要求低的查詢。

  • 強一致性:在列存資料與行存資料完全一致後再返回查詢結果。

PolarDB PostgreSQL版的列存索引即時性可以達到秒級,但當寫入負載過大時,列存索引的資料延遲會升高。預設的一致性層級為最終一致性,所以當寫入負載過大,且SQL查詢使用列存索引時,可能無法查出最新的資料。

為滿足某些業務情境下的行列強一致性要求,您可以通過將參數polar_csi.forward_replay_wait調整為強一致性讀(on)來實現。當查詢時,系統會等待列存索引的資料與行存資料一致時才會執行。

刪除與重建列存索引

由於當前PolarDB PostgreSQL版叢集不支援修改列存索引,若您需要在已有的列存索引中添加其他指定列,您可以選擇刪除索引重新建立或重建列存索引。

刪除列存索引

文法說明

DROP INDEX csi_index_name;

參數說明

參數

描述

csi_index_name

需要刪除的列存索引名稱。

樣本

刪除之前建立的列存索引

DROP INDEX idx_csi_sales; 

重建列存索引

文法說明

REINDEX INDEX csi_index_name;

參數說明

參數

描述

csi_index_name

需要重建的列存索引名稱。

樣本

重建之前建立的列存索引

REINDEX INDEX idx_csi_sales; 

調整列存索引參數提升效能

提升索引建立速度

索引建立速度與多個參數有關,如下所示:

參數名

取值範圍

預設值

描述

polar_csi.memory_limit

1~1048576

4096

列存索引可以使用的記憶體大小,單位:MB。

記憶體閾值越大,索引建立越快。請根據叢集規格來調整該參數的值,建議不超過叢集記憶體的25%,否則可能造成OOM的風險。

說明
  • PostgreSQL 14:在2.0.14.19.40.0及以上核心小版本調整參數預設值為4096,在此之前預設值為1024。

  • PostgreSQL 16:在2.0.16.10.12.0及以上核心小版本調整參數預設值為4096,在此之前預設值為1024。

polar_csi.flush_count

2048~20480000

204800

建立索引時,批次提交的行數。

增加行數能夠提高建立效率,但同時也需要佔用更多記憶體。

提升列存索引的即時性

通過調整這些參數,您可以提高行列轉換的速度,從而提升列存索引資料的即時性

參數名

取值範圍

預設值

作用

polar_csi.update_interval

0~3600

1

定期更新行列資料即時性的時間間隔,單位:秒。

增大更新間隔可以合并同類型的小事務,從而在事務數量較多時提高資料更新效率。

說明
  • PostgreSQL 14:在2.0.14.13.28.0及以上核心小版本,增加該參數用於提升列存索引的即時性。

  • PostgreSQL 16:在2.0.16.10.12.0及以上核心小版本,增加該參數用於提升列存索引的即時性。

polar_csi.update_batch_count

1024~4294967295

100000

批次更新行數的閾值。

一個更新事務的最大行數,增加該閾值可以提升資料更新的效率。

說明
  • PostgreSQL 14:在2.0.14.13.28.0及以上核心小版本,增加該參數用於提升列存索引的即時性。

  • PostgreSQL 16:在2.0.16.10.12.0及以上核心小版本,增加該參數用於提升列存索引的即時性。

提升查詢速度

查詢效能主要與以下參數有關,可通過調整參數值提升查詢效能:

參數名

取值範圍

預設值

作用

polar_csi.exec_parallel

1~512

2

列存索引的並行度,即一條SQL語句可以使用的CPU資源,一般來說並行度越大效能越好。

實際取值與叢集資源規格相關,請根據叢集規格來調整該參數的值,建議不超過計算節點的CPU核心數。

polar_csi.memory_limit

1~1048576

4096

列存索引可以使用的記憶體大小,單位:MB。

記憶體閾值越大,索引建立越快。請根據叢集規格來調整該參數的值,建議不超過叢集記憶體的25%,否則可能造成OOM的風險。

說明
  • PostgreSQL 14:在2.0.14.19.40.0及以上核心小版本調整參數預設值為4096,在此之前預設值為1024。

  • PostgreSQL 16:在2.0.16.10.12.0及以上核心小版本調整參數預設值為4096,在此之前預設值為1024。

polar_csi.cost_threshold

1~1000000000

50000

當查詢代價小於該閾值時,查詢語句不會使用列存索引來加速。實際取值請根據實際業務負載進行調整。

  • 當該參數的取值過大時,會導致耗時的 SQL 陳述式無法使用列存索引,查詢較慢。

  • 當該參數的取值過小時,會導致簡單SQL使用列存索引,降低系統的並發度。

說明
  • 您可以通過EXPLAINEXPLAIN ANALYZE來查詢並分析SQL語句的查詢代價。

  • PostgreSQL 14:在2.0.14.13.28.0及以上核心小版本調整參數預設值為50000,在此之前預設值為1000。

  • PostgreSQL 16:在2.0.16.10.12.0及以上核心小版本調整參數預設值為50000,在此之前預設值為1000。

polar_csi.forward_replay_wait

on|off

off

列存索引資料查詢一致性層級,取值如下:

  • off:表示最終一致性,列存索引的資料可能會落後於行存。

  • on:表示強一致性,查詢過程中會等待列存資料回放到最新資料時才會執行。當寫入壓力較大時,開啟該參數,可能會造成等待時間過長。