複雑なクエリを実行し、クエリ結果をすばやく取得したい場合は、ApsaraDB RDS for PostgreSQLのrds_duckdb拡張機能を使用して、分析処理 (AP) クエリアクセラレーションを実装できます。 拡張機能は、ローカルテーブルを列指向テーブルとしてエクスポートし、ベクトル化機能を使用して、元のクエリステートメントを変更することなく、複雑なクエリを大幅に高速化します。 これにより、クエリ結果を便利かつ効率的に取得できます。
概要
ApsaraDB RDS for PostgreSQLのrds_duckdb拡張機能は、効率的でリソースに優しいDuckDBに基づいて開発されています。 この拡張により、分析クエリ機能が強化されます。 拡張機能を使用して、ApsaraDB RDS for PostgreSQLインスタンスのローカルテーブルを列指向テーブルとしてエクスポートし、APクエリアクセラレーション機能を有効にすることができます。 これにより、分析サービスの要件を満たす複雑なクエリが大幅に加速されます。
前提条件
RDSインスタンスはPostgreSQL 12以降のバージョンを実行します。
RDSインスタンスは、20241030以降のマイナーエンジンバージョンを実行します。
rds_duckdbは、shared_preload_librariesパラメーターの実行中の値に追加されます。
たとえば、shared_preload_librariesパラメーターの実行中の値を
'pg_stat_statements,auto_explain, rds_duckdb '
に設定でき。 インスタンスのパラメーターを設定する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。shared_preload_libraries
パラメーターは'rds_duckdb'
に設定されています。 パラメーターの設定方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。
使用上の注意
プライマリRDSインスタンスとセカンダリRDSインスタンス間で列指向テーブルのデータを同期することはできません。
列指向テーブルのデータをエクスポートして、自動増分同期を実装することはできません。
拡張機能の作成と削除
拡張機能を作成または削除するには、特権アカウントを使用する必要があります。
拡張機能の作成
CREATE EXTENSION rds_duckdb;
拡張機能のDuckDBバージョンを照会する
SELECT rds_duckdb.duckdb_version();
拡張機能の削除
DROP EXTENSION rds_duckdb;
列指向テーブルの管理
列指向テーブルの作成
次のステートメントを実行して、RDSインスタンスのローカルテーブルを列指向テーブルとしてエクスポートします。 ローカルテーブルは、ユーザーテーブル、マテリアライズドビュー、または外部テーブルです。 列指向テーブルは、分析クエリを高速化するために使用されます。
SELECT rds_duckdb.create_duckdb_table('Local table name');
列指向テーブルの更新
次のステートメントを実行して、RDSインスタンスのローカルテーブルの最新データに基づいてエクスポートされた列ストアテーブルを更新し、テーブルスキーマとデータを更新します。
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クエリアクセラレーション機能を有効にした後、テーブルからデータをクエリするためにSQL文を実行する必要があり、テーブルにDuckDB列指向テーブルが存在する場合、クエリを高速化するためにDuckDBでSQL文が実行されます。 SQL文がサポートされていないDMLまたはDDL文である場合、または列指向テーブルが存在しない場合、SQL文はApsaraDB RDS for PostgreSQLで実行されます。
システムは、ApsaraDB RDS for PostgreSQLで実行されるSQL文について、warning: duckdb以外のテーブル (テスト) で操作を実行しようとしている場合、PGにフォールバック
と同様の警告を表示します。 括弧 () 内の内容は、DuckDB列指向テーブルが存在しないRDSインスタンスのテーブルを示します。
また、読み取り専用クエリに使用されていないSQL文について、[警告: DuckDBテーブルの変更操作は現在サポートされていません。フォールバック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_スレッド | APクエリの高速化に使用されるワーカースレッドの数。 有効な値: 1 ~ 255 デフォルト値: 1。これは、1つのワーカースレッドのみが使用されることを示します。 |
|
rds_duckdb.memory_limit | APクエリの高速化に使用できる最大メモリ。 単位:MB。 このパラメーターを設定するときにユニットを追加する必要はありません。 有効値: 1〜INT32_MAX。 デフォルト値: 100。上限が100 MBであることを示します。 |
|
DuckDBパラメーターの詳細については、「設定」をご参照ください。
APクエリアクセラレーション機能の無効化
SET rds_duckdb.execution = off;
例
rds_duckdb拡張機能のパフォーマンスのテスト
この例では、LinuxサーバーでTPC-Hテストを実行して、複雑なクエリに対するrds_duckdb拡張機能のパフォーマンス向上をテストします。
Elastic Compute Service (ECS) インスタンスを作成し、テストデータを生成します。 詳細については、「クイック起動タブのサブスクリプションECSインスタンスの作成」をご参照ください。
PostgreSQL公式WebサイトからPostgreSQLをダウンロードしてインストールします。
ダウンロードdbgen.
wget https://github.com/electrum/tpch-dbgen/archive/refs/heads/master.zip yum install -y unzip zip unzip master.zip cd tpch-dbgen-master/ echo "#define EOL_HANDLING 1" >> config.h # Delete the vertical bars (|) at the end of each row of data. make ./dbgen --help
テストデータを生成します。
この例では、テストデータの格納パスは
/data/test
であり、テストデータのサイズは100 GBである。 ビジネス要件に基づいて、データストレージパスとデータサイズを選択できます。./dbgen -s 100 mkdir /data/test/tpch_data mv *.tbl /data/test/tpch_data
説明データボリュームのサイズは、クエリ速度に直接影響します。 スケールファクタ (SF) は、データ量を記述するTPC-Hに使用される。 TPC-Hでは、1 SFは1 GBのデータを示す。 同様に、100 SFは100 GBのデータを示す。 1 SFのデータ量は、8つのテーブルの合計データ量のみを示す。 インデックスなどの要素に関するデータは含まれません。 データを準備するときは、十分なストレージを確保する必要があります。
前提条件の説明に基づいてRDSインスタンスを作成し、テストデータをインポートします。
RDSインスタンスを作成します。 詳細については、「ApsaraDB RDS for PostgreSQL インスタンスの作成」をご参照ください。
特権アカウントを作成します。 詳細については、「アカウントの作成」をご参照ください。
RDSインスタンスに接続します。 詳細については、「ApsaraDB RDS For PostgreSQLインスタンスへの接続」をご参照ください。
次のSQL文を実行して、TPC-Hテスト用の8つのテーブルを作成します。
CREATE TABLE customer(c_custkey BIGINT NOT NULL, c_name VARCHAR NOT NULL, c_address VARCHAR NOT NULL, c_nationkey INTEGER NOT NULL, c_phone VARCHAR NOT NULL, c_acctbal DECIMAL(15,2) NOT NULL, c_mktsegment VARCHAR NOT NULL, c_comment VARCHAR NOT NULL); CREATE TABLE lineitem(l_orderkey BIGINT NOT NULL, l_partkey BIGINT NOT NULL, l_suppkey BIGINT NOT NULL, l_linenumber BIGINT NOT NULL, l_quantity DECIMAL(15,2) NOT NULL, l_extendedprice DECIMAL(15,2) NOT NULL, l_discount DECIMAL(15,2) NOT NULL, l_tax DECIMAL(15,2) NOT NULL, l_returnflag VARCHAR NOT NULL, l_linestatus VARCHAR NOT NULL, l_shipdate DATE NOT NULL, l_commitdate DATE NOT NULL, l_receiptdate DATE NOT NULL, l_shipinstruct VARCHAR NOT NULL, l_shipmode VARCHAR NOT NULL, l_comment VARCHAR NOT NULL); CREATE TABLE nation(n_nationkey INTEGER NOT NULL, n_name VARCHAR NOT NULL, n_regionkey INTEGER NOT NULL, n_comment VARCHAR NOT NULL); CREATE TABLE orders(o_orderkey BIGINT NOT NULL, o_custkey BIGINT NOT NULL, o_orderstatus VARCHAR NOT NULL, o_totalprice DECIMAL(15,2) NOT NULL, o_orderdate DATE NOT NULL, o_orderpriority VARCHAR NOT NULL, o_clerk VARCHAR NOT NULL, o_shippriority INTEGER NOT NULL, o_comment VARCHAR NOT NULL); CREATE TABLE part(p_partkey BIGINT NOT NULL, p_name VARCHAR NOT NULL, p_mfgr VARCHAR NOT NULL, p_brand VARCHAR NOT NULL, p_type VARCHAR NOT NULL, p_size INTEGER NOT NULL, p_container VARCHAR NOT NULL, p_retailprice DECIMAL(15,2) NOT NULL, p_comment VARCHAR NOT NULL); CREATE TABLE partsupp(ps_partkey BIGINT NOT NULL, ps_suppkey BIGINT NOT NULL, ps_availqty BIGINT NOT NULL, ps_supplycost DECIMAL(15,2) NOT NULL, ps_comment VARCHAR NOT NULL); CREATE TABLE region(r_regionkey INTEGER NOT NULL, r_name VARCHAR NOT NULL, r_comment VARCHAR NOT NULL); CREATE TABLE supplier(s_suppkey BIGINT NOT NULL, s_name VARCHAR NOT NULL, s_address VARCHAR NOT NULL, s_nationkey INTEGER NOT NULL, s_phone VARCHAR NOT NULL, s_acctbal DECIMAL(15,2) NOT NULL, s_comment VARCHAR NOT NULL); \dt # View the imported data tables.
生成されたテストデータをインポートします。
COPY customer FROM '/data/test/tpch_data/customer.tbl' DELIMITER '|'; COPY lineitem FROM '/data/test/tpch_data/lineitem.tbl' DELIMITER '|'; COPY nation FROM '/data/test/tpch_data/nation.tbl' DELIMITER '|'; COPY orders FROM '/data/test/tpch_data/orders.tbl' DELIMITER '|'; COPY part FROM '/data/test/tpch_data/part.tbl' DELIMITER '|'; COPY partsupp FROM '/data/test/tpch_data/partsupp.tbl' DELIMITER '|'; COPY region FROM '/data/test/tpch_data/region.tbl' DELIMITER '|'; COPY supplier FROM '/data/test/tpch_data/supplier.tbl' DELIMITER '|'; \dt + # View the details of the imported data tables.
rds_duckdb拡張をインストールし、列指向テーブルを生成します。
rds_duckdb拡張子をインストールします。
CREATE EXTENSION rds_duckdb;
列指向テーブルを生成します。
# Create column-oriented tables for the local tables of the RDS instance. SELECT rds_duckdb.create_duckdb_table('customer'); SELECT rds_duckdb.create_duckdb_table('lineitem'); SELECT rds_duckdb.create_duckdb_table('nation'); SELECT rds_duckdb.create_duckdb_table('orders'); SELECT rds_duckdb.create_duckdb_table('part'); SELECT rds_duckdb.create_duckdb_table('partsupp'); SELECT rds_duckdb.create_duckdb_table('region'); SELECT rds_duckdb.create_duckdb_table('supplier');
APクエリアクセラレーションのパラメーターを設定します。
# Specify the number of threads and memory limit based on your test machine. Unit of the memory limit: MB. SET rds_duckdb.worker_threads = 32; SET rds_duckdb.memory_limit = 8192;
APクエリの高速化機能を有効にします。
SET rds_duckdb.execution = on; # Start timing. \timing on # Redirect the result to a file. \o /data/test/tpch_data/tpch_out
次の22のTPC-H SQL文を実行して、クエリのパフォーマンスをテストします。
SQL実行プランの表示
APクエリアクセラレーション機能が有効または無効になった後、EXPLAIN
ステートメントを実行してSQLステートメントの実行計画を表示できます。
次のサンプルコードは、APクエリ高速化機能を有効にした後のSQL文の実行計画の例を示しています。
次のサンプルコードは、APクエリアクセラレーション機能を無効にした後のSQL文の実行計画の例を示しています。