当您进行复杂查询并期望快速获得查询结果时,可以利用云数据库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语句的执行计划如下。