當您進行複雜查詢並期望快速獲得查詢結果時,可以利用雲資料庫RDS PostgreSQL的AP加速引擎(rds_duckdb)。該引擎提供了列存表和向量化執行能力,顯著提升複雜查詢的執行速度,且無需修改原始查詢語句,從而確保您能夠方便且高效地擷取結果。
功能簡介
rds_duckdb在RDS PostgreSQL中引入了高效、資源友好的DuckDB,以增強分析型查詢能力。該外掛程式可以將RDS PostgreSQL中的本地表匯出為列存表,並啟用分析型查詢加速(Analytical Processing Query Acceleration,簡稱AP)功能,顯著提升了複雜查詢的執行速度,從而更好地滿足分析型業務的需求。
前提條件
執行個體大版本為RDS PostgreSQL 12及以上。
執行個體核心小版本為20241030及以上。
已將rds_duckdb添加到shared_preload_libraries的運行參數值中。
配置參數的詳情操作請參見設定執行個體參數。例如,將運行參數值改為
'pg_stat_statements,auto_explain,rds_duckdb'
。
注意事項
暫不支援RDS PostgreSQL主備之間同步匯出的列存表資料,
暫不支援匯出列存表資料進行自動增量同步處理。
建立和刪除外掛程式
使用高許可權賬戶進行外掛程式的建立與刪除操作。
建立外掛程式
CREATE EXTENSION rds_duckdb;
查看外掛程式使用的DuckDB核心版本
SELECT rds_duckdb.duckdb_version();
刪除外掛程式
DROP EXTENSION rds_duckdb;
管理列存表
建立列存表
使用以下命令,將RDS PostgreSQL本地表(使用者表、物化視圖、外表等)匯出為一份列存表,該列存表將用於加速分析型查詢。
SELECT rds_duckdb.create_duckdb_table('本地表名稱');
重新整理列存表
使用以下命令,依據RDS PostgreSQL本地表的最新資料重新整理匯出的列存表,同時更新表結構資訊和資料內容。
SELECT rds_duckdb.refresh_duckdb_table('本地表名稱');
查看列存表大小
SELECT rds_duckdb.duckdb_table_size('本地表名稱');
查看當前資料庫中所有匯出表大小
SELECT rds_duckdb.duckdb_database_size();
刪除列存表
SELECT rds_duckdb.drop_duckdb_table('本地表名稱');
管理AP加速
rds_duckdb目前支援加速唯讀查詢。開啟AP加速後,當SQL類型為查詢且涉及的表均有對應的DuckDB列存表時,SQL將由DuckDB執行以實現加速。如果SQL屬於暫不支援的DML、DDL操作或包含不存在的列存表,則將回退到RDS PostgreSQL中執行。
對於回退到RDS PostgreSQL執行的SQL,系統會給出警告提示,格式為:WARNING: Trying to execute an operation with non-duckdb tables(test), fallback to PG
。其中,括弧內顯示的是不包含對應DuckDB列存表的RDS PostgreSQL表。
非唯讀SQL查詢也會收到提示,顯示為:WARNING: Modification operations on DuckDB tables are currently not supported, fallback to PG
。
開啟AP加速
SET rds_duckdb.execution = on;
設定AP加速參數
您可以在會話中通過調整參數配置來實現對AP加速效能的控制。例如:
SET rds_duckdb.worker_threads = 32;
SET rds_duckdb.memory_limit = 16384;
參數名稱 | 參數說明 | 取值建議 |
rds_duckdb.worker_threads | AP加速時使用的背景工作執行緒數量。 取值範圍:1~255。 預設值:1,表示只有一個背景工作執行緒。 |
|
rds_duckdb.memory_limit | AP加速時使用的記憶體限制。 單位:MB(配置參數時無需添加單位)。 取值範圍:1~INT32_MAX。 預設值:100,表示上限為100 MB。 |
|
DuckDB的參數請參見DuckDB。
關閉AP加速
SET rds_duckdb.execution = off;
使用樣本
rds_duckdb效能測試
本文以Linux環境為例,使用標準TPC-H測試評估rds_duckdb對複雜查詢的效能提升情況。
建立ECS執行個體並構建測試資料。
通過PostgreSQL官方網站下載並安裝PostgreSQL。
下載dbgen工具。
wget https://github.com/electrum/tpch-dbgen/archive/refs/heads/master.zip yum install -y unzip zip unzip master.zip cd tpch-dbgen-master/ echo "#define EOL_HANDLING 1" >> config.h # 消除產生資料末尾的'|' make ./dbgen --help
產生測試資料。
本文以測試資料存放區路徑為
/data/test
,測試資料為100 GB為例。您可根據自身需求選擇資料路徑和適當的資料集大小。./dbgen -s 100 mkdir /data/test/tpch_data mv *.tbl /data/test/tpch_data
說明資料量的大小對查詢速度具有直接影響。TPC-H中使用SF來描述資料量,其中1 SF對應1 GB。以此類推,100 SF即為100 GB。需要注意的是,1 SF對應的資料量僅包括8個表的總資料量,不包含索引等其他空間佔用。因此,在準備資料時,應預留更多的儲存空間。
按照前提條件建立RDS PostgreSQL資料庫,並匯入相關測試資料。
執行如下語句,建立8張TPC-H測試表。
CREATE TABLE customer(c_custkey BIGINT NOT NULL, c_name VARCHAR NOT NULL, c_address VARCHAR NOT NULL, c_nationkey INTEGER NOT NULL, c_phone VARCHAR NOT NULL, c_acctbal DECIMAL(15,2) NOT NULL, c_mktsegment VARCHAR NOT NULL, c_comment VARCHAR NOT NULL); CREATE TABLE lineitem(l_orderkey BIGINT NOT NULL, l_partkey BIGINT NOT NULL, l_suppkey BIGINT NOT NULL, l_linenumber BIGINT NOT NULL, l_quantity DECIMAL(15,2) NOT NULL, l_extendedprice DECIMAL(15,2) NOT NULL, l_discount DECIMAL(15,2) NOT NULL, l_tax DECIMAL(15,2) NOT NULL, l_returnflag VARCHAR NOT NULL, l_linestatus VARCHAR NOT NULL, l_shipdate DATE NOT NULL, l_commitdate DATE NOT NULL, l_receiptdate DATE NOT NULL, l_shipinstruct VARCHAR NOT NULL, l_shipmode VARCHAR NOT NULL, l_comment VARCHAR NOT NULL); CREATE TABLE nation(n_nationkey INTEGER NOT NULL, n_name VARCHAR NOT NULL, n_regionkey INTEGER NOT NULL, n_comment VARCHAR NOT NULL); CREATE TABLE orders(o_orderkey BIGINT NOT NULL, o_custkey BIGINT NOT NULL, o_orderstatus VARCHAR NOT NULL, o_totalprice DECIMAL(15,2) NOT NULL, o_orderdate DATE NOT NULL, o_orderpriority VARCHAR NOT NULL, o_clerk VARCHAR NOT NULL, o_shippriority INTEGER NOT NULL, o_comment VARCHAR NOT NULL); CREATE TABLE part(p_partkey BIGINT NOT NULL, p_name VARCHAR NOT NULL, p_mfgr VARCHAR NOT NULL, p_brand VARCHAR NOT NULL, p_type VARCHAR NOT NULL, p_size INTEGER NOT NULL, p_container VARCHAR NOT NULL, p_retailprice DECIMAL(15,2) NOT NULL, p_comment VARCHAR NOT NULL); CREATE TABLE partsupp(ps_partkey BIGINT NOT NULL, ps_suppkey BIGINT NOT NULL, ps_availqty BIGINT NOT NULL, ps_supplycost DECIMAL(15,2) NOT NULL, ps_comment VARCHAR NOT NULL); CREATE TABLE region(r_regionkey INTEGER NOT NULL, r_name VARCHAR NOT NULL, r_comment VARCHAR NOT NULL); CREATE TABLE supplier(s_suppkey BIGINT NOT NULL, s_name VARCHAR NOT NULL, s_address VARCHAR NOT NULL, s_nationkey INTEGER NOT NULL, s_phone VARCHAR NOT NULL, s_acctbal DECIMAL(15,2) NOT NULL, s_comment VARCHAR NOT NULL); \dt # 查看匯入的資料表
匯入已產生的測試資料。
COPY customer FROM '/data/test/tpch_data/customer.tbl' DELIMITER '|'; COPY lineitem FROM '/data/test/tpch_data/lineitem.tbl' DELIMITER '|'; COPY nation FROM '/data/test/tpch_data/nation.tbl' DELIMITER '|'; COPY orders FROM '/data/test/tpch_data/orders.tbl' DELIMITER '|'; COPY part FROM '/data/test/tpch_data/part.tbl' DELIMITER '|'; COPY partsupp FROM '/data/test/tpch_data/partsupp.tbl' DELIMITER '|'; COPY region FROM '/data/test/tpch_data/region.tbl' DELIMITER '|'; COPY supplier FROM '/data/test/tpch_data/supplier.tbl' DELIMITER '|'; \dt+ # 查看匯入的資料表的詳細資料
安裝rds_duckdb外掛程式並產生列存表。
安裝rds_duckdb外掛程式。
CREATE EXTENSION rds_duckdb;
產生列存表。
# 將PG本地錶轉換產生對應的列存表 SELECT rds_duckdb.create_duckdb_table('customer'); SELECT rds_duckdb.create_duckdb_table('lineitem'); SELECT rds_duckdb.create_duckdb_table('nation'); SELECT rds_duckdb.create_duckdb_table('orders'); SELECT rds_duckdb.create_duckdb_table('part'); SELECT rds_duckdb.create_duckdb_table('partsupp'); SELECT rds_duckdb.create_duckdb_table('region'); SELECT rds_duckdb.create_duckdb_table('supplier');
設定AP加速參數。
# 根據您自己的測試機情況設定線程數和記憶體限制(單位為MB) SET rds_duckdb.worker_threads = 32; SET rds_duckdb.memory_limit = 8192;
開啟AP加速。
SET rds_duckdb.execution = on; # 開啟計時 \timing on # 將結果重新導向到檔案中 \o /data/test/tpch_data/tpch_out
執行如下22條TPC-H標準測試SQL,並測試查詢效能。
查看SQL執行計畫
使用EXPLAIN
語句查看開啟和關閉AP加速後,SQL語句的執行計畫。例如:
開啟AP加速後,SQL語句的執行計畫如下。
關閉AP加速後,SQL語句的執行計畫如下。