ホームページ >データベース >mysql チュートリアル >PostgreSQL の LATERAL JOIN は、配列引数に対する複数の関数呼び出しをどのように最適化できますか?
配列引数での複数の関数呼び出しのクエリの最適化
Postgres では、配列引数で関数を複数回呼び出すのは効率が悪い場合があります特に関数が複数の列を返す場合。この課題に対処するためのクエリ最適化戦略を検討してみましょう。
指定されたパラメータで行の配列を処理し、行のセットと新しい列を返す関数 foo を考えてみましょう。
CREATE OR REPLACE FUNCTION foo(data data[], parameter int) RETURNS SETOF enhanceddata AS ...
最初、この関数は以下を使用して 1 つのデータセットに対して動作します:
SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1)
ただし、目標はそれを動作させることです。 dataid パラメーターを指定せずに複数のデータ グループを使用することもできます。
1 つのアプローチには、サブクエリを使用してデータを配列に集約し、それを foo 関数に渡すことが含まれます。
SELECT dataid, (foo(ARRAY_AGG(data)),1).* FROM dataset WHERE dataid = something -- only testing on 1 GROUP BY dataid
これは可能性がありますが、論理的であるように見えますが、データ行ごとに 1 回ずつ、foo を複数回呼び出すという問題があります。
次の場合の横結合の使用最適化
このクエリを最適化するには、PostgreSQl LATERAL JOIN を使用できます。この強力な手法は、サブクエリの結果と別のテーブルの行の間に行ベースのデカルト積を作成します。この場合、サブクエリはデータを配列に集約し、横結合は集約された配列の各行に対して foo を 1 回実行します。
PostgreSQL 9.3 以降を使用すると、次のクエリは複数の関数呼び出しを最適化します。
SELECT sub.dataid, f.* FROM ( SELECT dataid, array_agg(data) AS arr FROM dataset WHERE dataid = something GROUP BY 1 ) sub LEFT JOIN LATERAL foo(sub.arr) f ON true;
LEFT JOIN LATERAL は、左側のテーブル (サブクエリ) のすべての行が確実に保持されるようにします。 foo によって行が返されない場合でも。関数が行を返さない場合、これが推奨される構文です。
常に結果を返す関数の場合は、簡略化された構文を使用できます:
CROSS JOIN LATERAL foo(sub.arr)
または同等の省略表現:
, foo(sub.arr)
Postgres マニュアルで強調されているように、LATERAL JOIN を使用するとクエリが最適化されます。 foo のようなセットを返す関数を使用します。この手法は、不必要な関数評価を発生させることなく、複数のデータ グループを効率的に処理します。
以上がPostgreSQL の LATERAL JOIN は、配列引数に対する複数の関数呼び出しをどのように最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。