このトピックでは、PolarDB for PostgreSQLの並列INSERT機能について説明します。
前提条件
次のいずれかのバージョンを実行するPolarDB for PostgreSQLクラスターが作成されます。
マイナーエンジンバージョンが1.1.17以降のPostgreSQL 11
マイナーエンジンバージョンが14.8.12.0以降のPostgreSQL 14
次のいずれかのステートメントを実行して、PolarDB for PostgreSQLクラスターのマイナーエンジンバージョンを照会できます。
PostgreSQL 11
ショーpolar_version;PostgreSQL 14
select version();
概要
PolarDB for PostgreSQLには、複数の計算ノードでSQLクエリを並列に実行できるようにするelastic parallel query (ePQ) 機能があります。 これにより、PolarDB for PostgreSQLのクエリのパフォーマンスが向上します。 クラスターのプライマリノードで複数のプロセスを開始することで、ePQ機能を使用してデータを並列に書き込むこともできます。 これにより、INSERT文の実行速度が向上します。
パラレルINSERT機能は、INSERT INTO... など、データの読み取りと書き込みの両方を行うSQL文に適用できます。 SELECT... ステートメント。 SQL文のSELECTセクションでは、ePQは複数のプロセスを開始してクエリを並列に実行します。 SQL文のINSERTセクションでは、ePQはプライマリノードで複数のプロセスを開始して、データを並列に書き込みます。 Motion演算子は、読み取りプロセスと書き込みプロセスの間でデータを転送するために使用されます。
次のタイプのテーブルは、並列INSERT機能をサポートしています。
標準テーブル
パーティション分割されたテーブル
外部テーブルの一部
並列INSERT機能を使用すると、書き込みプロセスの数を調整することで、並列書き込みの並列度 (DOP) を動的に調整できます。 このように、クエリ速度が十分に速い場合、クエリのパフォーマンスを最大3倍向上させることができます。
制御ポリシー機能の動作
並列クエリと並列書き込みは、パイプラインの形式で同時に実行されます。 次の図は、並列クエリと並列書き込みの実行プロセスを示しています。
ePQ機能を使用して複数のINSERT操作を並行して実行する場合は、次の手順が実行されます。
ePQオプティマイザは、クエリから取得した構文ツリーに基づいて階層チャートを生成します。
ePQエグゼキュータは、階層チャートを各計算ノードに配布し、並列クエリおよび並列書き込みのプロセスを作成します。 その後、プロセスが開始される。
並列クエリのプロセスは、データシャードを並列に読み取り、データをMotion演算子に送信します。
並列書き込みのプロセスは、Motion演算子からデータを取得し、データを並列に書き込みます。
Parameters
polar_px_dop_per_node: 並列クエリのDOP。polar_px_insert_dop_num: 並列書き込みのDOP。
並列クエリのDOPが低いときに並列書き込みのDOPを徐々に上げると、クエリの速度が書き込み速度に追いつかないため、SQL文の実行が徐々に高速化され、その後特定のレベルにとどまります。
並列クエリのDOPが高いときに並列書き込みのDOPを徐々に増やすと、SQL文の実行が徐々に高速化され、その後特定のレベルにとどまります。 これは、クラスタのプライマリノードでのみ並列書き込みを実行できるためです。 この場合、書き込み速度は、激しいロック競合のためにクエリ速度に追いつくことができません。
例
t1という名前のテーブルとt2という名前のテーブルを作成し、t1テーブルにデータを挿入します。CREATE TABLE t1 (id INT); CREATE TABLE t2 (id INT); INSERT INTO t1 SELECT generate_series(1,100000);ePQ機能と並列
INSERT機能を有効にします。SET polar_enable_pxをオンにします。SET polar_px_enable_insert_selectをオンにします。Insertステートメントを実行して、t1テーブルのすべてのデータをt2テーブルに挿入します。 並列INSERT操作の実行プランを表示します。EXPLAIN INTO t2 SELECT * FROM t1; クエリ計画 ----------------------------------------------------------------------------------------- t2に挿入 (コスト=0.00 .. 952.87行=33334幅=4) -> 結果 (コスト=0.00 .. 0.00行=0幅=0) -> PXハッシュ6:3 (slice1; セグメント: 6) (コスト=0.00 .. 432.04行=100000幅=8) -> t1の部分Seqスキャン (コスト=0.00 .. 431.37行=16667幅=4) Optimizer: PolarDB PX Optimizer (5行)PX Hash 6:3は、t1テーブルからデータを並列に照会するために6つのプロセスが開始され、t2テーブルにデータを並列に書き込むために3つのプロセスが開始されることを示します。polar_px_insert_dop_numパラメーターを指定して、並列書き込みのDOPを動的に調整します。 次に、並列INSERT操作の実行プランを表示します。SET polar_px_insert_dop_num TO 12; t2 SELECT * からt1への挿入を説明します。 クエリ計画 ------------------------------------------------------------------------------------------ t2に挿入 (コスト=0.00 .. 952.87行=8334幅=4) -> 結果 (コスト=0.00 .. 0.00行=0幅=0) -> PXハッシュ6:12 (slice1; セグメント: 6) (コスト=0.00 .. 432.04行=100000幅=8) -> t1の部分Seqスキャン (コスト=0.00 .. 431.37行=16667幅=4) Optimizer: PolarDB PX Optimizer (5行)実行プランの
PXハッシュ6:12は、6つのプロセスがt1テーブルからデータを並列にクエリするために開始され、変更されないままであり、12のプロセスがt2テーブルにデータを並列に書き込むために開始されることを示します。