すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:AP アクセラレーションエンジン (rds_duckdb)

最終更新日:Mar 31, 2026

rds_duckdb 拡張は、ApsaraDB RDS for PostgreSQL における複雑な分析クエリを高速化します。列指向テーブルとベクトル化を提供することで、ご利用の SQL ステートメントを変更することなく、クエリパフォーマンスを大幅に向上させます。

この拡張に関する質問、ディスカッション、フィードバックについては、ApsaraDB RDS for PostgreSQL 拡張 DingTalk グループ (ID: 103525002795) にご参加ください。

概要

rds_duckdb 拡張は、効率的でリソースに優しい DuckDB を ApsaraDB RDS for PostgreSQL に統合し、分析クエリ機能を強化します。この拡張を使用すると、ローカルテーブルを列指向テーブルにエクスポートし、AP クエリアクセラレーションを有効化できます。

前提条件

  • ご利用の ApsaraDB RDS for PostgreSQL インスタンスは、PostgreSQL メジャーバージョン 13 以降を実行している必要があります。

  • お客様のインスタンスは、マイナーエンジンバージョン 20260130 以降を実行しています。

  • shared_preload_libraries パラメーターの 実行中値rds_duckdb を追加済みである必要があります。

    パラメーターの設定方法の詳細については、「インスタンスパラメーターの設定」をご参照ください。たとえば、実行中値 を次のように変更できます。'pg_stat_statements,auto_explain,rds_duckdb'

説明

マイナーエンジンバージョン 20250228 以降では、列指向テーブルの自動増分同期がデフォルトで有効になっています。

拡張の作成および削除

特権アカウント を使用して、拡張を作成または削除します。

拡張の作成

CREATE EXTENSION rds_duckdb;

DuckDB のバージョン確認

SELECT rds_duckdb.duckdb_version();

拡張を削除

DROP EXTENSION rds_duckdb;

列指向テーブルの管理

列指向テーブルの作成

次のコマンドを実行して、ご利用の ApsaraDB RDS for PostgreSQL インスタンスからローカルテーブルを列指向テーブルにエクスポートします。ローカルテーブルには、ユーザーテーブル、マテリアライズドビュー、外部テーブルが含まれます。

説明

インスタンスが PostgreSQL 15 かつマイナーエンジンバージョン 20250228 以降の場合、列指向テーブルの自動増分同期がデフォルトで有効になります。列指向テーブルを作成する前に、この機能向けにターゲットの ApsaraDB RDS for PostgreSQL インスタンスおよびローカルテーブルを構成してください。詳細については、「列指向テーブルの自動増分同期の構成」をご参照ください。

SELECT rds_duckdb.create_duckdb_table('local_table_name');

列指向テーブルのリフレッシュ

次のコマンドを実行して、ソースのローカルテーブルから最新データでエクスポート済みの列指向テーブルを更新します。このコマンドは、テーブルスキーマとデータの両方を更新します。

SELECT rds_duckdb.refresh_duckdb_table('local_table_name');

テーブルサイズの確認

SELECT rds_duckdb.duckdb_table_size('local_table_name');

エクスポート済みテーブルの合計サイズの確認

SELECT rds_duckdb.duckdb_database_size();

列指向テーブルの削除

SELECT rds_duckdb.drop_duckdb_table('local_table_name');

AP アクセラレーションの管理

rds_duckdb 拡張は現在、読み取り専用クエリを高速化します。AP クエリアクセラレーションが有効になっている場合、DuckDB 列指向テーブルに対応するテーブルのみを使用するクエリは、DuckDB にオフロードされます。DML や DDL などの未対応操作を含むクエリ、または列指向テーブルに対応しないテーブルを参照するクエリは、自動的に標準の ApsaraDB RDS for PostgreSQL エンジンにフォールバックします。

PostgreSQL エンジンにフォールバックするクエリに対して、システムは次のような形式の警告を返します。WARNING: Trying to execute an operation with non-duckdb tables(test), fallback to PG。括弧内に記載されているテーブルは、対応する DuckDB 列指向テーブルを持たないものです。

読み取り専用以外のクエリも、次のような警告をトリガーします。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 コア数に設定してください。

  • 値を高くすると CPU 負荷が増加します。ワークロードに応じて調整してください。

  • このパラメーターの値を高くするとパフォーマンスが向上しますが、CPU 負荷も増加します。逆に、値を低くするとパフォーマンスは低下しますが、CPU 負荷も軽減されます。

rds_duckdb.memory_limit

AP クエリアクセラレーションのメモリ制限です。

単位:MB。パラメーター値を設定する際は、単位を含めないでください。

有効値:1 ~ INT32_MAX

デフォルト値:100(100 MB を示します)

  • 最適なパフォーマンスを得るには、ワークロードが許容する範囲でできるだけ高い値を設定してください。

  • 値を高くするとメモリ消費量が増加します。ワークロードに応じて調整してください。

  • デフォルト値は保守的です。インスタンスのリソースに基づいて調整してください。

  • 値が低いと、AP クエリアクセラレーションや大規模テーブルのエクスポート中にパフォーマンスが劣化する可能性があります。

説明

DuckDB パラメーターの詳細については、公式 DuckDB ドキュメント をご参照ください。

AP アクセラレーションの無効化

SET rds_duckdb.execution = off;

列指向テーブルの自動同期の構成

インスタンスが PostgreSQL 15 かつマイナーエンジンバージョン 20250228 以降の場合、列指向テーブルの自動増分同期がデフォルトで有効になります。列指向テーブルを作成する前に、次の手順を完了してください。

  1. 拡張機能管理rds_duckdb のバージョンを確認し、1.3 以降にスペックアップします。

  2. インスタンスパラメーターの設定 で、wal_level パラメーターの実行中値を logical に変更します。

  3. (オプション)ターゲットのローカルテーブルにプライマリキーがない場合は、次のコマンドを実行して、レプリケーションキーとして REPLICA IDENTITY インデックスを設定します。

    ALTER TABLE <local_table_name> REPLICA IDENTITY USING INDEX <index_name>;
  4. レプリケーション権限 を持つアカウントまたは 特権アカウント を使用して、列指向テーブルを作成します。

列指向テーブルの同期ステータスおよび進行状況の確認

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:ソースの PostgreSQL テーブルにプライマリキーまたは REPLICA IDENTITY インデックスがありません。

  • unsupported relation type:テーブルタイプが同期に対応していません。例:パーティションテーブル、ビュー、マテリアライズドビューなど。

  • rds_duckdb.enable_sync not set:グローバル同期 GUC (Grand Unified Configuration) パラメーターが有効になっていません。

    説明

    これは、PostgreSQL 15 かつマイナーエンジンバージョン 20250228 以降を実行するインスタンスでデフォルトで有効になっています。

  • removing duckdb table:列指向テーブルが削除されています。

SQL 実行計画の表示

EXPLAIN 文を使用して、AP クエリアクセラレーションの有効/無効時における SQL クエリの実行計画を比較します。例:

  • 次の例は、AP クエリアクセラレーションが有効な場合の実行計画を示しています。

    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 クエリアクセラレーションが無効な場合の実行計画を示しています。

    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)

パフォーマンステスト

rds_duckdb が複雑なクエリに対して提供するパフォーマンス向上を評価するには、Linux 環境で実施した標準 TPC-H ベンチマークテストをご参照ください。詳細な手順および結果については、「rds_duckdb 拡張のパフォーマンステスト」をご参照ください。