2011-07-29 22 views
1
with ini as 
(
    select ... 
) 
select ini.a 
join ini.b 
join ini.c 

SQL Serverエンジンcalculateは、何度もiniテーブルの結果を返しますか?CTEはパフォーマンスを改善しますか?

withステートメント(CTE)が結果をaliasingで改善した場合、私が(あなたの助けを借りて)答えようとしている私の質問です。

答えて

2

CTE iniは単に展開するマクロであり、この使用法は構文/明快さのみです。 MSDNは言う:CTEを使用して

改善可読性の利点を提供し、複雑なクエリ

パフォーマンスについては何のメンテナンスの容易。

1件につきと評価されています:こちらは3回実行計画から見ることができます。

CTEは、それ自体の上に構築さが、まだCTE(共通テーブル式「と」に包まれている部分)が、本質的で一度言及

+0

ここでは3つのタイマーを意味しています... theres 3 joins –

1

ごとに評価されるように再帰CTEのために、それは多少違います1回限りの表示。あなたが一時的な見解の点でそれを考えるなら、おそらく答えがより明確になるでしょう。私が知る限り、通訳者はCTE内にあるものが参照を見つけるたびにメインクエリにコピー/ペーストするのと同等の処理を行います。

CTEの存在自体が単にクエリのパフォーマンスを向上させるものではないと思われる場合があります。 (つまり、同じサブクエリを複数回再入力する必要はありません)しかし、私はそれが魔法のように物事をより速く動かすとは信じませんすべてが等しい)。もちろん、クエリがWTE /サブクエリよりもCTE内で異なって構成されている場合は、CTEがその時点でより高速に実行される可能性がありますが、今ではリンゴとオレンジを比較しています。

0

派生テーブルや相関サブクエリを置き換えるために使用していると思われます。パフォーマンスは、最初のケースではほぼ同じで、おそらくCTEへの参照でSuqueryコードを置き換えたのではなく、CTEに参加した場合の2番目のケースではかなり優れています。それを使用してNOT EXISTS句をCTEへの左結合で置き換えると(あるテーブルではなく他のテーブルでレコードを見つけるために)、パフォーマンスが悪化することが予想されます。そのタイプの仕事をする。私が言っていることは、パフォーマンスはあなたがCTEをどのように使ったかということだけでなく、あなたがそれを生成したという事実だけではないということです。

関連する問題