Optimizing query performance#
Postgres Analytics AcceleratorPGAAは、分析ワークロードをSeafowlと、大規模向けに設計されたベクトル化実行エンジンであるApache Sparkにオフロードすることにより、高いパフォーマンスを実現します。 PGAAが実行パスを選択する方法を理解することにより、クエリを「高速パス」に維持して、最大の高速化を実現できます。
スキャンタイプを理解する#
分析テーブルを照会すると、PGAAは2つの異なる実行パスを介してデータの取得と処理を管理します。
DirectScan Seafowlは、オブジェクトストレージからデータを直接読み取り、ソースですべてのフィルタと集計を適用し、最終的な結果セットのみをPostgresに返します。これにより、ベクトル化された加速を完全に利用し、ネットワークトラフィックを最小限に抑えることにより、パフォーマンスを最大化します。
CompatScan クエリにSeafowlがネイティブで処理できないSQL機能またはカスタムファンクションが含まれている場合、システムはハイブリッドモードにフォールバックします。このシナリオでは、Seafowlは引き続きデータソースとして機能しますオブジェクトストレージからデータをストリーミングし、基本的なフィルタリングを実行しますが、Postgresは最終的な複雑な処理のオーケストレーターとして機能します。
CompatScanでは、ワークロードは次のように分割されます。
Seafowlはファイルを読み取り、許可されたプッシュダウンを処理します結合またはグループバイなど。
PostgresはSeafowlから最適化されたストリームを受け取り、特殊な機能、最終的な並べ替え、またはベクトル化エンジンがまだサポートしていない複雑なロジックを実行します。
DirectScanは最大速度の目標ですが、 CompatScanは信頼できるフォールバックとして機能し、一部のパフォーマンスを犠牲にしてPostgres機能の完全な互換性を保証します。
クエリプランの分析#
PGAAがクエリーを実行している方法を確認するには、 EXPLAIN
コマンドを使用します。出力により、どのエンジンが重い作業を実行しているかがわかります。
DirectScan
SeafowlDirectScanまたはSparkDirectScanノードを探します。これは、Seafowlが操作全体フィルタリング、結合、および集計を処理し、最終結果のみをPostgresに返すことを示しています。CompatScan
SeafowlCompatScanまたはSparkCompatScanノードが表示される場合、クエリは「ハイブリッド」モードで実行されています。 Postgresは最終的な実行をオーケストレーションして、完全な機能の互換性を保証しますが、プッシュダウン設定が有効になっている場合、リモートエンジンはクエリの一部を高速化できます。
DirectScanフォールバックの管理#
クエリがより遅いCompatScanパスにフォールバックする場合は、次の手順に従ってトラブルシューティングを行ってください。
現在のセッションでDirectScanが許可されていることを確認します。
SHOW pgaa.enable_direct_scan;
-- If off, enable it:
SET pgaa.enable_direct_scan=on;
強制エラー報告 障害動作を変更します フォールバックの原因を明らかにできます。
SET pgaa.direct_scan_fail_behavior = error;
Postgresは、互換性のないSQL構文またはデータ型を識別する明示的なエラーをスローします。
クエリが複雑な場合は、句を1つずつ削除して、ハイブリッドモードを強制する特定の「互換性トリガー」を分離します。
Icebergのメンテナンスの実行#
ハイブリッドモードでも、リソースを大量に使用する操作をオフロードすることにより、高いパフォーマンスを維持できます。次の設定はデフォルトで有効になっており、パフォーマンスのセーフティネットとして機能します。
pgaa.enable_join_pushdown システムがリモート実行者SeafowlまたはSparkへの参加をオフロードしようとすることを承認します。データが存在する場所でデータを結合することにより、大規模な生データセットをPostgresメモリにプルすることを回避し、ネットワークトラフィックを大幅に削減します。
pgaa.enable_groupby_pushdown 集約SUM 、COUNT 、AVG
およびGROUP BY
句のオフロードを承認します。ソースで10億行を10のグループに集約すると、データ転送が数桁削減され、帯域幅とPostgres
CPUの両方が節約されます。
サポートされているオプションと例の完全なリストについては、 pgaa.execute_compaction() のファンクションリファレンスセクションを参照してください。