0

レポートを作成しているため、2 つの異なるタイプのクエリを作成しました。しかし、これら 2 つの方法のパフォーマンスには大きな違いがあります。その理由は何ですか?私のメインテーブル(テーブルAと仮定)には日付列が含まれています。日付に基づいてデータをフィルタリングしています。約 10 のテーブルに参加します。このテーブルを使用する必要があります。

最初の方法:

select A.id,A1.name,...
from table A
join A1
join A2 ....A10
where A.Cdate >= @date
and A.Cdate <= @date

2 番目の方法:

With CTE as(select A.id from A where A.Cdate>=@date and A.Cdate<=@date)
select CTE.id, A1.name,.... from CTE join A1 join A2....A10

ここで2番目の方法は高速です。理由は何ですか?最初の方法では、A のフィルター処理されたデータのみが他のテーブル データと結合されますよね?

4

3 に答える 3

1

実行計画で確実にわかりますが、CTE が結合前に多くの行を除外できる場合は、より最適な結合アプローチが選択されている可能性があります (たとえば、ハッシュではなくマージ)。SQL はそのように動作することは想定されていません。理論的には、これら 2 つは同じ方法で実行されるはずです。しかし実際には、SQL Server のオプティマイザーは完璧ではなく、統計、選択性、並列処理、キャッシュ内のその計画の既存のバージョンなど、さまざまな要因に基づいてさまざまな方法で影響を受ける可能性があることがわかりました。

于 2012-07-21T14:51:36.040 に答える
1

1 つの提案です。両方の計画があるので、この質問に自分で答えることができるはずです。2つのプランを比較しましたか?それらは似ていますか?また、パフォーマンスが悪い場合は、時間、CPU時間、IO、または何を比較しましたか?

したがって、質問を投稿する前に、これらのカウンターを確認する必要があります。ほとんどの場合、何らかの回答が提供されると確信しています。

CTE は、クエリのパフォーマンスを自動的に改善しないコードを管理するためのものです。CTEはオプティマイザによって拡張されるため、あなたの場合、これらは両方とも変換または拡張後に同じクエリを持つ必要があるため、同様の計画が必要です。

于 2012-07-21T14:52:38.730 に答える
0

CTEは基本的に、より複雑なコード(再帰的またはサブクエリを含む)を処理するためのものですが、2つの異なるクエリの改善に関する実行計画を確認する必要があります. CTE の使用については、http: //msdn.microsoft.com/en-us/library/ms190766 (v=sql.105).aspx で確認できます。

多くのシナリオでは、CTE よりも一時テーブルの方がパフォーマンスが優れているため、一時テーブルも試してみてください。
参照 : http://social.msdn.microsoft.com/Forums/en/transactsql/thread/d040d19d-016e-4a21-bf44-a0359fb3c7fb

于 2012-07-21T14:40:08.277 に答える