sql >> データベース >  >> RDS >> PostgreSQL

postgresユニオンは、副作用のある関数を呼び出すときに実行の順序を保証しますか?

    実際には、指定された順序で実行されますが、保証はありません。

    保証されている場合は、ドキュメントまたは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();
    



    1. node.jsでフォームがenctype=multipart / form-dataに設定されている場合、MySQLでデータを送信するにはどうすればよいですか?

    2. どのSQLクエリが高速ですか?参加基準またはWhere句でフィルタリングしますか?

    3. SQLServerの2つの日時の違い

    4. エラー:サブクエリは1つの列のみを返す必要があります