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

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

最終更新日:Jan 15, 2026

ApsaraDB RDS for PostgreSQL の AP アクセラレーションエンジン (rds_duckdb) を使用すると、複雑なクエリから高速な結果を取得できます。このエンジンは、列指向テーブルとベクトル化実行を提供し、元のクエリ文を変更することなく複雑なクエリを大幅に高速化します。これにより、簡単かつ効率的に結果を取得できます。

ApsaraDB RDS for PostgreSQL エクステンションの DingTalk グループ (ID: 103525002795) に参加して、質問、アイデアの共有、フィードバックの提供、エクステンションに関する詳細情報の入手ができます。

概要

rds_duckdb は、効率的でリソースフレンドリな DuckDB を ApsaraDB RDS for PostgreSQL に統合し、分析クエリ機能を強化します。このエクステンションを使用すると、ApsaraDB RDS for PostgreSQL からローカルテーブルを列指向テーブルにエクスポートして、分析処理 (AP) クエリの高速化を有効にできます。この機能は、複雑なクエリの実行速度を大幅に向上させ、分析ワークロードの要求により効果的に応えます。

前提条件

  • ご利用のインスタンスのメジャーバージョンが ApsaraDB RDS for PostgreSQL 12 以降であること。

  • ご利用のインスタンスのマイナーエンジンバージョンが 20241030 以降であること。

  • shared_preload_librariesパラメーター値rds_duckdb を追加済みであること。

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

説明

ご利用のインスタンスのメジャーバージョンが ApsaraDB RDS for PostgreSQL 15 で、マイナーバージョンが 20250228 の場合、列指向テーブルデータの自動増分同期がデフォルトで有効になります。

拡張機能の作成と削除

特権アカウントを使用してエクステンションを作成および削除します。

プラグインの作成

CREATE EXTENSION rds_duckdb;

エクステンションが使用する DuckDB バージョンの表示

SELECT rds_duckdb.duckdb_version();

拡張機能の削除

DROP EXTENSION rds_duckdb;

列指向テーブルの管理

列指向テーブルの作成

次のコマンドを使用して、ユーザーテーブル、マテリアライズドビュー、外部テーブルなどのローカル ApsaraDB RDS for PostgreSQL テーブルを列指向テーブルにエクスポートし、分析クエリを高速化します。

説明

ご利用のインスタンスのメジャーバージョンが ApsaraDB RDS for PostgreSQL 15 で、マイナーバージョンが 20250228 の場合、列指向テーブルデータの自動増分同期がデフォルトで有効になります。列指向テーブルを作成する前に、ターゲットの ApsaraDB RDS for PostgreSQL インスタンスとローカルテーブルで自動増分同期を有効にするように設定する必要があります。詳細については、「列指向テーブルの自動増分同期の設定」をご参照ください。

SELECT rds_duckdb.create_duckdb_table('local_table_name');

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

次のコマンドを使用して、エクスポートされた列指向テーブルをローカルの ApsaraDB RDS for PostgreSQL テーブルの最新データでリフレッシュします。このコマンドは、テーブルスキーマとデータの両方を更新します。

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 が SQL 文を実行します。SQL 文にサポートされていない DML または DDL 操作、または対応する列指向テーブルがないテーブルが含まれる場合、クエリは ApsaraDB RDS for PostgreSQL にフォールバックして実行されます。

ApsaraDB RDS for PostgreSQL にフォールバックする SQL 文の場合、システムは次の形式で警告を発行します: WARNING: Trying to execute an operation with non-duckdb tables(test), fallback to PG。括弧内のテーブル名は、対応する DuckDB 列指向テーブルがない ApsaraDB RDS for 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。これは、ワーカースレッドが 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;

列指向テーブルの自動増分同期の設定

ご利用のインスタンスのメジャーバージョンが ApsaraDB RDS for PostgreSQL 15 で、マイナーバージョンが 20250228 の場合、列指向テーブルデータの自動増分同期がデフォルトで有効になります。列指向テーブルを作成する前に、次の手順を実行して、ターゲットの ApsaraDB RDS for PostgreSQL インスタンスとローカルテーブルを設定する必要があります。

  1. [拡張機能の管理] で、rds_duckdb のバージョンを確認し、1.3 にアップグレードします。

  2. インスタンスパラメーターの設定を参照して、wal_level パラメーターの値を logical に変更します。

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

    ALTER TABLE <local_table_name> 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: 列指向テーブルに対応する ApsaraDB RDS for PostgreSQL テーブルに、プライマリキーまたは REPLICA IDENTITY インデックスがありません。

  • unsupported relation type: テーブルタイプが同期でサポートされていません (パーティションテーブル、ビュー、マテリアライズドビューなど)。

  • rds_duckdb.enable_sync not set:グローバル同期 GUC が有効になっていません。

    説明

    インスタンスのメジャーバージョンが ApsaraDB RDS for 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)

パフォーマンステスト

標準の TPC-H テストを Linux 環境で使用して、rds_duckdb が複雑なクエリに提供するパフォーマンス向上を評価します。詳細については、「AP アクセラレーションエンジン (rds_duckdb) のパフォーマンステスト」をご参照ください。