SQLは宣言型言語であり、手続き型言語ではありません。つまり、必要な結果を記述するSQLステートメントを作成します。 SQLエンジンに方法を伝えているのではありません。 仕事をするために。
原則として、SQLエンジンとSQLオプティマイザーに最適なクエリプランを見つけさせることをお勧めします。 SQLエンジンの開発には多くの人年の努力が必要です。そのため、エンジニアに自分の知っている方法を実行させてください。
もちろん、クエリプランが最適でない場合もあります。次に、クエリヒントを使用し、クエリを再構築し、統計を更新し、一時テーブルを使用し、インデックスを追加するなどして、パフォーマンスを向上させます。
あなたの質問は。 CTEとサブクエリのパフォーマンスは、理論的には同じである必要があります。これは、どちらもクエリオプティマイザに同じ情報を提供するためです。 1つの違いは、複数回使用されたCTEは、1回で簡単に識別および計算できることです。その後、結果を保存して複数回読み取ることができます。残念ながら、SQL Serverはこの基本的な最適化方法を利用していないようです(この一般的なサブクエリの削除と呼ぶ場合があります)。
一時テーブルは別の問題です。これは、クエリの実行方法に関するガイダンスを提供しているためです。主な違いの1つは、オプティマイザが一時テーブルの統計を使用してクエリプランを確立できることです。これにより、パフォーマンスが向上する可能性があります。また、複数回使用される複雑なCTE(サブクエリ)がある場合は、それを一時テーブルに保存すると、パフォーマンスが向上することがよくあります。クエリは1回だけ実行されます。
あなたの質問に対する答えは、特に定期的に実行される複雑なクエリの場合、期待するパフォーマンスを得るためにいろいろと試してみる必要があるということです。理想的な世界では、クエリオプティマイザは完璧な実行パスを見つけます。多くの場合そうなりますが、パフォーマンスを向上させる方法を見つけることができる場合があります。