All Products
Search
Document Center

ApsaraDB RDS:Mesin akselerasi AP (rds_duckdb)

Last Updated:Mar 31, 2026

Ekstensi rds_duckdb untuk ApsaraDB RDS for PostgreSQL mempercepat kueri analitik kompleks. Dengan menyediakan tabel berorientasi kolom dan vektorisasi, ekstensi ini secara signifikan meningkatkan performa kueri tanpa memerlukan perubahan pada pernyataan SQL asli Anda.

Untuk pertanyaan, diskusi, atau masukan mengenai ekstensi ini, bergabunglah dengan grup DingTalk Ekstensi ApsaraDB RDS for PostgreSQL (ID: 103525002795).

Ikhtisar

Ekstensi rds_duckdb mengintegrasikan DuckDB yang efisien dan hemat sumber daya ke dalam ApsaraDB RDS for PostgreSQL guna meningkatkan kemampuan kueri analitiknya. Ekstensi ini memungkinkan Anda mengekspor tabel lokal ke dalam tabel berorientasi kolom dan mengaktifkan akselerasi kueri AP.

Prasyarat

  • Instans ApsaraDB RDS for PostgreSQL Anda menjalankan versi utama PostgreSQL 13 atau lebih baru.

  • Instans Anda menjalankan versi mesin minor 20260130 atau lebih baru.

  • Anda telah menambahkan rds_duckdb ke dalam running value parameter shared_preload_libraries.

    Untuk informasi selengkapnya tentang cara mengonfigurasi parameter, lihat Setel parameter instans. Sebagai contoh, Anda dapat mengubah running value menjadi 'pg_stat_statements,auto_explain,rds_duckdb'.

Catatan

Untuk versi mesin minor 20250228 dan yang lebih baru, sinkronisasi data inkremental otomatis untuk tabel berorientasi kolom diaktifkan secara default.

Buat dan hapus ekstensi

Gunakan Akun istimewa untuk membuat atau menghapus ekstensi.

Buat ekstensi

CREATE EXTENSION rds_duckdb;

Periksa versi DuckDB

SELECT rds_duckdb.duckdb_version();

Hapus ekstensi

DROP EXTENSION rds_duckdb;

Kelola tabel berorientasi kolom

Buat tabel berorientasi kolom

Jalankan perintah berikut untuk mengekspor tabel lokal dari instans ApsaraDB RDS for PostgreSQL Anda ke dalam tabel berorientasi kolom. Tabel lokal dapat mencakup tabel pengguna, tampilan yang di-materialisasi, atau tabel eksternal.

Catatan

Jika instans Anda menjalankan PostgreSQL 15 dengan versi mesin minor 20250228 atau lebih baru, sinkronisasi inkremental otomatis untuk tabel berorientasi kolom diaktifkan secara default. Sebelum membuat tabel berorientasi kolom, konfigurasikan instans ApsaraDB RDS for PostgreSQL target dan tabel lokal untuk fitur ini. Untuk informasi selengkapnya, lihat Konfigurasikan sinkronisasi inkremental otomatis untuk tabel berorientasi kolom.

SELECT rds_duckdb.create_duckdb_table('local_table_name');

Refresh tabel berorientasi kolom

Jalankan perintah berikut untuk merefresh tabel berorientasi kolom yang diekspor dengan data terbaru dari tabel lokal sumber. Perintah ini memperbarui skema tabel maupun datanya.

SELECT rds_duckdb.refresh_duckdb_table('local_table_name');

Periksa ukuran tabel

SELECT rds_duckdb.duckdb_table_size('local_table_name');

Periksa ukuran total tabel yang diekspor

SELECT rds_duckdb.duckdb_database_size();

Hapus tabel berorientasi kolom

SELECT rds_duckdb.drop_duckdb_table('local_table_name');

Kelola akselerasi AP

Ekstensi rds_duckdb saat ini hanya mempercepat kueri read-only. Ketika akselerasi kueri AP diaktifkan, setiap kueri yang hanya menggunakan tabel yang memiliki padanan tabel berorientasi kolom DuckDB akan dialihkan ke DuckDB. Jika suatu kueri melibatkan operasi yang tidak didukung, seperti DML atau DDL, atau merujuk ke tabel yang tidak memiliki padanan berorientasi kolom, kueri tersebut secara otomatis kembali menggunakan mesin standar ApsaraDB RDS for PostgreSQL.

Untuk kueri yang kembali menggunakan mesin PostgreSQL, sistem mengembalikan peringatan dalam format berikut: WARNING: Trying to execute an operation with non-duckdb tables(test), fallback to PG. Tabel yang tercantum dalam tanda kurung adalah tabel yang tidak memiliki padanan tabel berorientasi kolom DuckDB.

Kueri non-read-only juga memicu peringatan: WARNING: Modification operations on DuckDB tables are currently not supported, fallback to PG.

Aktifkan akselerasi AP

SET rds_duckdb.execution = on;

Konfigurasikan parameter akselerasi AP

Sesuaikan parameter dalam sesi Anda untuk mengontrol performa akselerasi kueri AP. Contohnya:

SET rds_duckdb.worker_threads = 32;
SET rds_duckdb.memory_limit = 16384;

Parameter

Deskripsi

Saran

rds_duckdb.worker_threads

Jumlah thread pekerja untuk akselerasi kueri AP.

Nilai valid: 1 hingga 255.

Nilai default: 1.

  • Untuk performa optimal, atur nilai ini sesuai jumlah core CPU yang tersedia.

  • Nilai yang lebih tinggi meningkatkan beban CPU. Sesuaikan pengaturan ini berdasarkan workload Anda.

  • Nilai parameter yang lebih tinggi memberikan performa lebih baik tetapi juga meningkatkan beban CPU. Sebaliknya, nilai yang lebih rendah mengurangi performa namun juga menurunkan beban CPU.

rds_duckdb.memory_limit

Batas memori untuk akselerasi kueri AP.

Unit: MB. Jangan sertakan unit saat mengatur nilai parameter.

Nilai valid: 1 hingga INT32_MAX.

Nilai default: 100 (yang berarti 100 MB).

  • Untuk performa optimal, atur nilai ini setinggi mungkin sesuai kapasitas workload Anda.

  • Nilai yang lebih tinggi meningkatkan konsumsi memori. Sesuaikan pengaturan ini berdasarkan workload Anda.

  • Nilai default bersifat konservatif. Sesuaikan berdasarkan sumber daya instans Anda.

  • Nilai yang terlalu rendah dapat menurunkan performa selama akselerasi kueri AP dan ekspor tabel besar.

Catatan

Untuk informasi selengkapnya tentang parameter DuckDB, lihat dokumentasi resmi DuckDB.

Nonaktifkan akselerasi AP

SET rds_duckdb.execution = off;

Konfigurasikan auto-sync untuk tabel berorientasi kolom

Jika instans Anda menjalankan PostgreSQL 15 dengan versi mesin minor 20250228 atau lebih baru, sinkronisasi inkremental otomatis untuk tabel berorientasi kolom diaktifkan secara default. Sebelum membuat tabel berorientasi kolom, lengkapi langkah-langkah berikut.

  1. Di manajemen ekstensi, periksa versi rds_duckdb dan upgrade ke versi 1.3 atau lebih baru.

  2. Setel parameter instans untuk mengubah running value parameter wal_level menjadi logical.

  3. (Opsional) Jika tabel lokal target tidak memiliki primary key, jalankan perintah berikut untuk menetapkan indeks REPLICA IDENTITY sebagai kunci replikasi.

    ALTER TABLE <local_table_name> REPLICA IDENTITY USING INDEX <index_name>;
  4. Gunakan akun dengan izin replikasi atau Akun istimewa untuk membuat tabel berorientasi kolom.

Periksa status dan progres sinkronisasi tabel berorientasi kolom

SELECT * FROM rds_duckdb.duckdb_sync_stat;

Contoh output dan deskripsi parameter

Contoh output:

 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

Deskripsi parameter:

Parameter

Deskripsi

sync_status_description

Status sinkronisasi tabel berorientasi kolom.

  • not syncing: Sinkronisasi data inkremental tidak aktif.

  • data copying: Proses penyalinan data penuh awal sedang berlangsung.

  • data catchup: Menerapkan data inkremental yang dihasilkan selama penyalinan data penuh.

  • data syncing: Sinkronisasi inkremental sedang berlangsung.

sync_error_description

Alasan sinkronisasi inkremental tidak aktif.

  • no errors: Tidak ditemukan masalah.

  • dml replay conflict: Terjadi konflik replay inkremental akibat operasi DML.

  • ddl replay conflict: Terjadi konflik replay inkremental akibat operasi DDL.

  • no primary key or replica identity index: Tabel sumber PostgreSQL tidak memiliki primary key atau indeks REPLICA IDENTITY.

  • unsupported relation type: Jenis tabel tidak didukung untuk sinkronisasi. Contohnya termasuk tabel partisi, tampilan, dan tampilan yang di-materialisasi.

  • rds_duckdb.enable_sync not set: Parameter GUC (Grand Unified Configuration) sinkronisasi global tidak diaktifkan.

    Catatan

    Parameter ini diaktifkan secara default untuk instans yang menjalankan PostgreSQL 15 dengan versi mesin minor 20250228 atau lebih baru.

  • removing duckdb table: Tabel berorientasi kolom sedang dihapus.

Lihat rencana eksekusi SQL

Gunakan pernyataan EXPLAIN untuk membandingkan rencana eksekusi kueri SQL dengan dan tanpa akselerasi kueri AP yang diaktifkan. Contohnya:

  • Contoh berikut menunjukkan rencana eksekusi ketika akselerasi kueri AP diaktifkan.

    Akselerasi kueri AP diaktifkan

    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)
  • Contoh berikut menunjukkan rencana eksekusi ketika akselerasi kueri AP dinonaktifkan.

    Akselerasi kueri AP dinonaktifkan

    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)

Pengujian performa

Untuk mengevaluasi peningkatan performa yang diberikan oleh rds_duckdb pada kueri kompleks, rujuk pada pengujian benchmark TPC-H standar kami yang dilakukan di lingkungan Linux. Untuk prosedur dan hasil lengkap, lihat Pengujian performa untuk ekstensi rds_duckdb.