跨機并行查詢功能還可以用于加速構建B-tree索引,同時支持加速創建B-Tree索引的GLOBAL索引。本文介紹工作原理以及如何使用該功能加速索引構建。

原理介紹

PolarDB PostgreSQL版(兼容Oracle)在執行索引構建時,會首先掃描待構建索引的基表構造出索引項,然后再進一步的根據索引項完成整棵索引樹的構建過程。

當使用跨機并行查詢功能加速Btree索引構建時,系統會自動構建出一個QC進程完成對基表項的并行掃描,并由索引構建進程接收QC進程掃描結果完成后續的索引創建邏輯。

索引加速架構圖(PX)

注意事項

  • 當前僅支持簡單場景,對普通列類型的索引構建過程,暫不支持CONCURRENTLY,INCLUDE等索引構建語法。
  • 暫不支持表達式等索引列類型。

參數說明

如果需要使用跨機并行查詢功能加速創建索引,請使用如下參數:

參數說明
polar_px_enable_btbuild是否開啟使用跨機并行查詢加速創建索引。取值如下:
  • off:不開啟(默認)
  • on:開啟
polar_px_dop_per_node指定通過跨機并行查詢加速構建索引的并行度。默認為1,推薦值8或者16。

該參數同時也指定了跨機并行查詢的并行度。詳細信息,請參見使用跨機并行查詢進行分析型查詢

該參數可以指定數據庫角色進行開啟。

polar_px_enable_replay_wait當使用跨機并行查詢加速索引構建時,當前會話內無需再手動開啟polar_px_enable_replay_wait,該參數將自動生效,以便保證最近更新的數據表項可以被創建到索引中,保證索引表的完整性。索引創建完成后,該參數將會被重置為數據庫默認設置。
polar_bt_write_page_buffer_size指定索引構建過程中的寫IO策略。該參數默認值為0,不開啟,單位為塊,最大值可設置為8192。推薦設置為4096。
  • 當該參數設置為不開啟時,在索引創建的過程中,對于索引頁滿寫盤的方式采用的是block-by-block進行單個塊寫盤。
  • 當該參數設置為開啟時,則會在內核中緩存一個polar_bt_write_page_buffer_size大小的buffer,對于需要寫盤的索引頁,會通過該buffer進行IO合并再統一寫盤,避免了頻繁IO調度的性能開銷。該參數會額外再帶來20%的索引創建性能提升。

示例

示例背景:

執行如下命令,創建test表。

CREATE TABLE test(id int,id2 int);

查詢表結構:

\d test
               Table "public.test"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           |          |
 id2    | integer |           |          |

執行如下步驟,對test表通過跨機并行查詢構建索引。

  1. 開啟使用跨機并行查詢加速創建索引功能。
    命令如下:
    SET polar_px_enable_btbuild=on;

    查看設置狀態:

    SHOW polar_px_enable_btbuild;

    返回結果如下:

      polar_px_enable_btbuild
    -------------------------
     on
    (1 row)
  2. 使用如下語法創建索引。
    CREATE INDEX t ON test(id) WITH(px_build=on);

    查詢表結構:

    \d test
                   Table "public.test"
     Column |  Type   | Collation | Nullable | Default
    --------+---------+-----------+----------+---------
     id     | integer |           |          |
     id2    | integer |           |          |
    Indexes:
        "t" btree (id) WITH (px_build=finish)
說明 若要使用跨機并行查詢加速索引創建,創建索引的語法需要添加px_build選項。

構建完成后,該表的索引類型會帶有(px_build=finish)字段,說明該索引項是通過跨機并行查詢的方式構建的。

如果開啟polar_px_enable_btbuild,但創建索引的語法上未添加px_build選項,則會使用PolarDB PostgreSQL版(兼容Oracle)原生的索引創建方式構建索引。示例如下:

CREATE INDEX t ON test(id);

查詢表結構:

\d test
                Table "public.test"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 id     | integer |           |          |
Indexes:
    "t" btree (id)

性能數據

使用跨機并行查詢加速索引構建功能,對于大表創建索引時間,相較于原生PolarDB PostgreSQL版(兼容Oracle)的索引創建,可縮短近5倍。

如下是500GB數據表索引構建性能對比,橫坐標為構建的復合索引個數,縱坐標為索引構建時長(單位:ms)。

索引構建時間(跨機并行查詢)

跨機并行查詢功能支持加速創建B-Tree索引的GLOBAL索引,如下是GLOBAL索引使用跨機并行查詢功能前后的性能對比圖(130GB數據量)。

構建性能對比圖