後続のクエリ(実際には更新ステートメント)で使用する必要がある複雑なクエリがあります。私は両方のCTEと一時テーブルを使用してみました。 CTEを使用したパフォーマンスは、一時テーブルアプローチと比べて恐ろしいものです。 15秒とミリ秒の間の何か。後続のクエリでCTE/Tempテーブルに参加する代わりにテストを簡略化するために、単に*を選択しました。その場合、彼らは同じことを実行します。SQL 2005 CTEとTEMPテーブル他のテーブルの結合で使用された場合のパフォーマンス
私は両方のアプローチの実行計画を、後続のクエリの結合で調べた後、単に*を選択しました。単純な選択では、クエリプランはほぼ同じですが、後続の選択での結合ではクエリプランは作成されません。具体的には、テンポラリテーブルを作成して投入するためのクエリプランの部分は同じままで、CTEを作成して投入するためのクエリプラン部分は、その後、結合を含むクエリで使用されると劇的に変化します。
私の質問は、CTEの作成と作成に関するクエリプランが、一時テーブルが使用されていない間に後でどのように使用されるかによって変更される理由です。また、どのようなシナリオでは、CTEは一時表よりも優れたパフォーマンスを発揮しますか?
注:私もテーブル変数を使用しましたが、これは一時テーブルのアプローチと似ています。
おかげ
はい、マテリアライズ!定義のPK/IXはいいかもしれません。 – crokusek