with ini as
(
select ...
)
select ini.a
join ini.b
join ini.c
SQL Serverエンジンcalculate
は、何度もini
テーブルの結果を返しますか?CTEはパフォーマンスを改善しますか?
with
ステートメント(CTE)が結果をaliasing
で改善した場合、私が(あなたの助けを借りて)答えようとしている私の質問です。
with ini as
(
select ...
)
select ini.a
join ini.b
join ini.c
SQL Serverエンジンcalculate
は、何度もini
テーブルの結果を返しますか?CTEはパフォーマンスを改善しますか?
with
ステートメント(CTE)が結果をaliasing
で改善した場合、私が(あなたの助けを借りて)答えようとしている私の質問です。
CTE iniは単に展開するマクロであり、この使用法は構文/明快さのみです。 MSDNは言う:CTEを使用して
改善可読性の利点を提供し、複雑なクエリ
パフォーマンスについては何のメンテナンスの容易。
1件につきと評価されています:こちらは3回実行計画から見ることができます。
CTEは、それ自体の上に構築さが、まだCTE(共通テーブル式「と」に包まれている部分)が、本質的で一度言及
ごとに評価されるように再帰CTEのために、それは多少違います1回限りの表示。あなたが一時的な見解の点でそれを考えるなら、おそらく答えがより明確になるでしょう。私が知る限り、通訳者はCTE内にあるものが参照を見つけるたびにメインクエリにコピー/ペーストするのと同等の処理を行います。
CTEの存在自体が単にクエリのパフォーマンスを向上させるものではないと思われる場合があります。 (つまり、同じサブクエリを複数回再入力する必要はありません)しかし、私はそれが魔法のように物事をより速く動かすとは信じませんすべてが等しい)。もちろん、クエリがWTE /サブクエリよりもCTE内で異なって構成されている場合は、CTEがその時点でより高速に実行される可能性がありますが、今ではリンゴとオレンジを比較しています。
派生テーブルや相関サブクエリを置き換えるために使用していると思われます。パフォーマンスは、最初のケースではほぼ同じで、おそらくCTEへの参照でSuqueryコードを置き換えたのではなく、CTEに参加した場合の2番目のケースではかなり優れています。それを使用してNOT EXISTS句をCTEへの左結合で置き換えると(あるテーブルではなく他のテーブルでレコードを見つけるために)、パフォーマンスが悪化することが予想されます。そのタイプの仕事をする。私が言っていることは、パフォーマンスはあなたがCTEをどのように使ったかということだけでなく、あなたがそれを生成したという事実だけではないということです。
ここでは3つのタイマーを意味しています... theres 3 joins –