AP加速引擎(rds_duckdb)

更新时间:2025-03-25 06:31:37

当您进行复杂查询并期望快速获得查询结果时,可以利用云数据库RDS PostgreSQLAP加速引擎(rds_duckdb)。该引擎提供了列存表和向量化执行能力,显著提升复杂查询的执行速度,且无需修改原始查询语句,从而确保您能够方便且高效地获取结果。

您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。

功能简介

rds_duckdbRDS 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加速的性能。

说明

DuckDB的参数请参见DuckDB

关闭AP加速

SET rds_duckdb.execution = off;

设置列存表自动增量同步

当实例的大版本为RDS PostgreSQL 15,小版本为20250228时,默认启用列存表数据的自动增量同步功能。创建列存表之前,您需要执行以下操作,配置目标RDS PostgreSQL实例和本地表。

  1. 插件管理中检查看rds_duckdb的版本,并将其升级到1.3。

  2. 设置实例参数,将wal_level参数的运行值改为logical。

  3. (可选)当目标本地表未定义主键时,请执行以下命令,为该表设置REPLICA IDENTITY索引作为复制键。

    ALTER TABLE <本地表名称> REPLICA IDENTITY USING INDEX <index_name>;
  4. 使用具备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

列存表的同步状态。

  • not syncing:未进行增量数据同步。

  • data copying:首次全量数据复制过程。

  • data catchup:在复制全量数据过程中产生的增量数据的应用过程。

  • data syncing:正常的增量同步过程。

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语句的执行计划如下。

    开启AP加速

    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语句的执行计划如下。

    关闭AP加速

    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)

性能测试

Linux环境为例,采用标准TPC-H测试评估rds_duckdb在复杂查询中的性能提升情况。详情请参见AP加速引擎(rds_duckdb)性能测试

免费体验

您可前往RDS PostgreSQL 列存索引/表-加速TP复杂SQL查询进行免费体验。具体请参见免费体验RDS PostgreSQL AP加速引擎(rds_duckdb)

  • 本页导读 (1)
  • 功能简介
  • 前提条件
  • 创建和删除插件
  • 创建插件
  • 查看插件使用的DuckDB内核版本
  • 删除插件
  • 管理列存表
  • 创建列存表
  • 刷新列存表
  • 查看列存表大小
  • 查看当前数据库中所有导出表大小
  • 删除列存表
  • 管理AP加速
  • 开启AP加速
  • 设置AP加速参数
  • 关闭AP加速
  • 设置列存表自动增量同步
  • 查看SQL执行计划
  • 性能测试
  • 免费体验