您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。
功能简介
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 15,小版本为20250228,默认开启列存表数据的自动增量同步。
创建和删除插件
使用高权限账户进行插件的创建与删除操作。
创建插件
CREATE EXTENSION rds_duckdb;
查看插件使用的DuckDB内核版本
SELECT rds_duckdb.duckdb_version();
删除插件
DROP EXTENSION rds_duckdb;
管理列存表
创建列存表
使用以下命令,将RDS PostgreSQL本地表(用户表、物化视图、外表等)导出为一份列存表,该列存表将用于加速分析型查询。
说明
当实例的大版本为RDS PostgreSQL 15,小版本为20250228时,默认启用列存表数据的自动增量同步功能。在创建列存表之前,您可以配置目标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,表示只有一个工作线程。 | 建议希望实现显著性能提升的用户,将该值设置为CPU核心数。 该参数与执行机器的硬件密切相关,值越大,执行AP加速时CPU的负载越高。因此,需要根据实际情况合理设置该参数。 该参数设置较高时,可以获得更优异的性能,然而CPU负载也会相应增加;反之,若该参数设置较低,则加速效果将会有所降低,但系统CPU负载也会随之减少。
|
rds_duckdb.memory_limit | AP加速时使用的内存限制。 单位:MB(配置参数时无需添加单位)。 取值范围:1~INT32_MAX。 默认值:100,表示上限为100 MB。 | 建议希望实现显著性能提升的用户,将该值设置为尽可能大的数值。 该参数与执行机器的硬件密切相关,值越大,执行AP加速时内存的使用量越高。因此,需要根据实际情况合理设置该参数。 默认参数值设置较为保守,建议用户根据设备的实际情况进行相应调整。 该值过小时可能会影响大表导出列存表的过程,并影响AP加速的性能。
|
关闭AP加速
SET rds_duckdb.execution = off;
设置列存表自动增量同步
当实例的大版本为RDS PostgreSQL 15,小版本为20250228时,默认启用列存表数据的自动增量同步功能。创建列存表之前,您需要执行以下操作,配置目标RDS PostgreSQL实例和本地表。
在插件管理中检查看rds_duckdb的版本,并将其升级到1.3。
设置实例参数,将wal_level参数的运行值改为logical。
(可选)当目标本地表未定义主键时,请执行以下命令,为该表设置REPLICA IDENTITY索引作为复制键。
ALTER TABLE <本地表名称> REPLICA IDENTITY USING INDEX <index_name>;
使用具备replication权限的账号或高权限账号创建列存表。
查看列存表的同步状态及同步位点进度
SELECT * FROM rds_duckdb.duckdb_sync_stat;
返回示例:
sync_table | sync_status_description | sync_error_description | confirmed_lsn
test | not syncing | no primary key or replica identity index |
test2 | not syncing | no primary key or replica identity index |
test3 | data syncing | no errors | 0/250D1E8
test4 | not syncing | no primary key or replica identity index |
test5 | data syncing | no errors | 0/250D1E8
test6 | data syncing | no errors | 0/250D1E8
test7 | data syncing | no errors | 0/250D1E8
test8 | data syncing | no errors | 0/250D1E8
参数说明:
参数 | 说明 |
sync_status_description | 列存表的同步状态。 |
sync_error_description | 未进行增量同步的列存表的原因。 no errors:没有问题。 dml replay conflict:DML操作导致增量回放冲突。 ddl replay conflict:DDL操作导致增量回放冲突。 no primary key or replica identity index:列存表所对应的RDS PostgreSQL表缺乏主键或REPLICA IDENTITY索引。 unsupported relation type:暂不支持的同步表类型,例如分区表、视图、物化视图。 rds_duckdb.enable_sync not set:全局同步GUC尚未开启。 说明 实例的大版本为RDS PostgreSQL 15,小版本为20250228时,默认开启。 removing duckdb table:正在进行列存表的删除操作。
|
查看SQL执行计划
使用EXPLAIN
语句查看开启和关闭AP加速后,SQL语句的执行计划。例如:
开启AP加速后,SQL语句的执行计划如下。
tpch_10x=# SET rds_duckdb.execution = on;
SET
tpch_10x=# EXPLAIN SELECT
tpch_10x-# 100.00 * sum(
tpch_10x(# CASE WHEN p_type LIKE 'PROMO%' THEN
tpch_10x(# l_extendedprice * (1 - l_discount)
tpch_10x(# ELSE
tpch_10x(# 0
tpch_10x(# END) / sum(l_extendedprice * (1 - l_discount)) AS promo_revenue
tpch_10x-# FROM
tpch_10x-# lineitem,
tpch_10x-# part
tpch_10x-# WHERE
tpch_10x-# l_partkey = p_partkey
tpch_10x-# AND l_shipdate >= date '1995-09-01'
tpch_10x-# AND l_shipdate < CAST('1995-10-01' AS date);
QUERY PLAN
Custom Scan (DuckDBNode) (cost=0.00..0.00 rows=0 width=0)
DuckDB Plan:
┌───────────────────────────┐
│ PROJECTION │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ Projections: │
│ promo_revenue │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ Estimated Cardinality: │
│ 1 │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ UNGROUPED_AGGREGATE │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ Aggregates: │
│ sum(#0) │
│ sum(#1) │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ PROJECTION │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ Projections: │
│ CASE WHEN (prefix(p_type,│
│ 'PROMO')) THEN (CAST( │
│ (l_extendedprice * (1.000 │
│ - CAST(l_discount AS │
│ DECIMAL(18,3)))) AS │
│ DECIMAL(20,5))) ELSE 0 │
│ .00000 END │
│ (l_extendedprice * (1.000 │
│ - CAST(l_discount AS │
│ DECIMAL(18,3)))) │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ Estimated Cardinality: │
│ 6600339 │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ HASH_JOIN │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ Join Type: │
│ INNER │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ Conditions: ├──────────────┐
│ l_partkey = p_partkey │ │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │
│ Estimated Cardinality: │ │
│ 6600339 │ │
└─────────────┬─────────────┘ │
┌─────────────┴─────────────┐┌─────────────┴─────────────┐
│ SEQ_SCAN ││ SEQ_SCAN │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ││ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ Stringified: ││ Stringified: │
│ lineitem ││ part │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ││ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ Projections: ││ Projections: │
│ l_partkey ││ p_partkey │
│ l_extendedprice ││ p_type │
│ l_discount ││ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ││ Estimated Cardinality: │
│ Filters: ││ 2000000 │
│ l_shipdate>='1995-09-01': ││ │
│ :DATE AND l_shipdate<'1995││ │
│ -10-01'::DATE AND ││ │
│ l_shipdate IS NOT NULL ││ │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ││ │
│ Estimated Cardinality: ││ │
│ 11997210 ││ │
└───────────────────────────┘└───────────────────────────┘
(71 rows)
关闭AP加速后,SQL语句的执行计划如下。
tpch_10x=# SET rds_duckdb.execution = off;
SET
tpch_10x=# EXPLAIN SELECT
100.00 * sum(
CASE WHEN p_type LIKE 'PROMO%' THEN
l_extendedprice * (1 - l_discount)
ELSE
0
END) / sum(l_extendedprice * (1 - l_discount)) AS promo_revenue
FROM
lineitem,
part
WHERE
l_partkey = p_partkey
AND l_shipdate >= date '1995-09-01'
AND l_shipdate < CAST('1995-10-01' AS date);
QUERY PLAN
Finalize Aggregate (cost=1286740.42..1286740.43 rows=1 width=32)
-> Gather (cost=1286739.96..1286740.37 rows=4 width=64)
Workers Planned: 4
-> Partial Aggregate (cost=1285739.96..1285739.97 rows=1 width=64)
-> Parallel Hash Join (cost=1235166.04..1282419.39 rows=189747 width=33)
Hash Cond: (part.p_partkey = lineitem.l_partkey)
-> Parallel Seq Scan on part (cost=0.00..43232.15 rows=500016 width=29)
-> Parallel Hash (cost=1233776.40..1233776.40 rows=111171 width=20)
-> Parallel Seq Scan on lineitem (cost=0.00..1233776.40 rows=111171 width=20)
Filter: ((l_shipdate >= '1995-09-01'::date) AND (l_shipdate < '1995-10-01'::date))
JIT:
Functions: 17
Options: Inlining true, Optimization true, Expressions true, Deforming true
(13 rows)