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

CTE (Common Table Expressions) が SQL Server の一時テーブルと比較してクエリの速度を低下させる理由

    答えは簡単です。

    SQL Server は CTE を実現しません。実行計画からわかるように、それらをインライン化します。

    他の DBMS では実装が異なる場合があります。よく知られている例は、CTE を具体化する Postgres です (基本的に、内部で CTE の一時テーブルを作成します)。

    中間の明示的な実体化が明示的な一時テーブルになるかどうかは、クエリによって異なります。

    複雑なクエリでは、一時テーブルへの中間データの書き込みと読み取りのオーバーヘッドは、オプティマイザが生成できるより効率的で単純な実行計画によって相殺できます。

    一方、Postgres では CTE は「最適化フェンス」であり、エンジンは CTE 境界を越えて述語をプッシュできません。

    ある方法が良い場合もあれば、別の方法が良い場合もあります。クエリの複雑さが特定のしきい値を超えると、オプティマイザーはデータを処理するために考えられるすべての方法を分析できず、何かに落ち着かなければなりません。たとえば、テーブルを結合する順序です。順列の数は、選択するテーブルの数に応じて指数関数的に増加します。オプティマイザーが計画を生成する時間は限られているため、すべての CTE がインライン化されている場合、オプティマイザーは不適切な選択になる可能性があります。複雑なクエリをより小さく単純なものに手動で分割する場合、何を行っているかを理解する必要がありますが、オプティマイザは単純なクエリごとに適切な計画を生成する可能性が高くなります。



    1. プリペアドステートメントでLIKE'%{$ var}%'を使用する正しい方法は? [mysqli]

    2. nvarchar連結/インデックス/nvarchar(max)不可解な動作

    3. Symfony2のテーブルに参加する

    4. MySQLの@OneToManyエラー:親行を削除または更新できません:外部キー制約が失敗します