2017-02-28 5 views
-4

私はゆっくり実行しているクエリをデバッグしようとしています。いくつかのwithの式がleft joinedです。ジョインを削除すると、かなり速くなります。SQL ServerはCTE式を使用しないと実行しますか?

オリジナルクエリ:

;with CTE as 
(
    Select * 
    from table1 
) 
SELECT * 
FROM table2 
LEFT JOIN CTE ON table2.CTEID 

より高性能のクエリ:それは参加していないので、上記で

;with CTE as 
(
    Select * 
    from table1 
) 
SELECT * 
FROM table2 

が、それはCTEを実行していない、またはそれは関係なく、それを実行しますか?

+0

実際のクエリはどうですか?単語パズルだけでは、私たちは大いに役に立たない。そして "with"は、共通テーブル式を定義する方法です。変数ではありません。 –

+0

私はそれが私が混乱しているところだと思います。と一緒に使うと、式のトップダウン内で実際にクエリが実行されるのですか、呼び出されたときに実行されますか? –

+0

インラインビューです。呼び出されません。これはクエリの一部です。 –

答えて

3

私の推測はおそらくそうではありません。クエリオプティマイザは不要なものを実行しないことにかなり賢いです。すべてのクエリが異なり、クエリオプティマイザは実際のデータに関する統計を使用して評価方法を決定するため、SQL Serverにクエリの評価方法を伝える唯一の方法があります。

これを実行するには、SQL Server Management Studioで「実際の実行計画を含める」を使用してクエリを実行すると、そのクエリの評価方法がはっきりと分かります。

+0

ありがとう、私は実行計画について考えなかった。あなたは正しかった。 Contra Seanのコメントでは、CTEを実行しませんでした。 –

+1

さて、私はcteを定義していると思うし、それを使用しないのは完全に不条理ですが、決して選択されなかったのでデータを選択しないという意味になります。 –

+0

私はそれがボトルネックを引き起こしていたCTEか結合であるかどうかを理解したかったのです。そして、今私が知っているのは、私の特別なケース(CTEの内容だけでうまくいっている)での参加だから、何が起こっているのかをよく理解したかったのです。 –

関連する問題