実際には、指定された順序で実行されますが、保証はありません。
保証されている場合は、ドキュメントまたはSQL標準で説明されています。 UNION
の実行順序についての言及はありません どちらかで。
オプティマイザーが次々に実行する理由がある場合は、自由に実行できます。
実行の順序を確認するには、ステートメントを目的の順序で実行します。
SELECT * FROM func1();
SELECT * FROM func2();
往復を減らしたい場合は、可能であればクライアントのバッチ処理機能を使用するか、DO
を使用してください ブロック:
DO
$$
BEGIN
PERFORM proc1();
PERFORM proc2();
END;
$$;
値を返す必要がある場合は、関数を使用してRETURN QUERY
またはRETURN NEXT
。
または、PostgreSQLの(残念ながら)CTEではであるため、CTEで強制的に注文することができます。結果の具体化を強制する最適化フェンスとして機能します 。ただし、AFAIK PostgreSQLは、CTE用語を、記述された順序または参照された順序で実行する必要はありません。あなたが得る唯一の保証はあなたがこれをするかどうかです:
WITH f1 AS (SELECT * FROM function1())
SELECT * FROM function2()
UNION ALL
SELECT * FROM f1;
次にfunction1
最初に実行して具体化する必要があります。ただし、これはPostgreSQL固有の誤動作です。これは他のデータベースエンジンには当てはまらず、標準によって保証されていないため、信頼するべきではありません。
それは
には及びませんWITH f1 AS (SELECT * FROM function1())
f2 AS (SELECT * FROM function2())
SELECT * FROM f2
UNION ALL
SELECT * FROM f1;
...この場合のように、PostgreSQLは独立したCTE用語をどちらの順序でも実行できます。
繰り返しますが、結合の場合、同じ原則が適用されます。用語が独立している場合、システムはそれらを任意の順序で実行することを選択できますが、通常は実行しません。だから:
select null::void from (select 1 from foo() ) left join (select 1 from bar()) on true
bar()
を評価して具体化することができます 次に、その結果をfoo()
に結合します 。
順序付けられた実行が必要な場合は、共用体や結合などの集合演算に依存しないでください。個別のクエリまたは手続き型コードを使用します。
はい、あります。
SELECT * FROM function1();
SELECT * FROM function2();