私の理解では、WITH ステートメント (CTE) はクエリごとに 1 回実行されます。次のようなクエリを使用します。
WITH Query1 AS ( ... )
SELECT *
FROM
SomeTable t1
LEFT JOIN Query1 t2 ON ...
これが100行になる場合、Query1
100回ではなく、1回だけ実行されたと思います。この仮定が正しければ、クエリ全体を実行するのにかかる時間は、実行Query1
+ から選択するSomeTable
+ に結合するSomeTable
のにかかる時間とほぼ同じQuery1
です。
私は次のような状況にいます:
Query1
単独で実行すると、約 5 秒 (400k 行) かかります。WITH
ステートメントを削除した後のクエリの残りの部分と、LEFT JOIN
約 15 秒 (400k 行) かかります。
したがって、WITH
ステートメントとそのLEFT JOIN
場でクエリ全体を実行すると、クエリがタイムリーに完了すると予想されていましたが、代わりに1時間以上実行し、停止すると11,000行しか取得できませんでした.
私は明らかに間違っていますが、なぜですか?