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

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

最終更新日:Nov 10, 2025

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

RDS PostgreSQL 拡張機能の DingTalk グループ (ID: 103525002795) に参加して、質問、ディスカッションへの参加、フィードバックの提供、または拡張機能に関する詳細情報の入手ができます。

機能

rds_duckdb 拡張機能は、効率的でリソース効率の高い DuckDB を ApsaraDB RDS for PostgreSQL に統合し、分析クエリ機能を強化します。この拡張機能を使用すると、ApsaraDB RDS for PostgreSQL からローカルテーブルを列指向テーブルにエクスポートし、分析処理 (AP) クエリ高速化機能を有効にできます。これにより、複雑なクエリの実行速度が大幅に向上し、分析ビジネス要件をより満たすことができます。

重要

このドキュメントで説明されている拡張機能の使用方法は、概念実証 (POC) テストにのみ適しています。本番環境については、「DuckDB 分析インスタンス」をご参照ください。

前提条件

  • インスタンスのメジャーバージョンが 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 の列指向テーブルがある場合、SQL クエリは DuckDB によって実行され高速化されます。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. レプリケーション権限を持つアカウントまたは特権アカウントを使用して、列指向テーブルを作成します。

列指向テーブルの同期ステータスと LSN の進行状況の表示

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: グローバル同期の Grand Unified Configuration (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)

パフォーマンステスト

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