0

クエリで一時的な結果が必要な場合、SQL Server 2008 には 3 つのオプションがあります。

  1. 次のように、動的な結果としてクエリで使用します

    Select * from tab1 a join (select * from tab2) b on a.ID = b.ID

  2. 一時テーブルを使用:

    select * int #tmptab from tab2

    Select * from tab1 a join #tmptab b on a.ID = b.ID

  3. タブ式を使用:

    myTab を (select * from tab2)
    Select * from tab1 a join myTab b on a.ID = b.ID

質問: 最高のパフォーマンスを発揮する最適なソリューションはどれですか?

4

1 に答える 1

2

SQL Server はjoin、要求していない場合でも、実際には一部の結果を一時テーブルに格納します。そのような場合、一時テーブルはテーブル式と同一であり、パフォーマンスの違いはありません。

一時テーブルは、クエリ オプティマイザーの自由度を減らします。例えば:

select * into #tmptab from tab2

select * from tab1 a join #tmptab b on a.ID = b.ID

tab2最初のステップを処理している間、クエリ オプティマイザーは、 に対応する行があるからの値のみを探していることを知りませんtab1。2 番目のステップを処理するとき、クエリ オプティマイザは操作する一時テーブルしか持っていません。のインデックスは使用できませんtab2

したがって、一般に、オプティマイザの自由度が高いため、表式の方が優れています。ただし、一時テーブルを使用して、クエリ オプティマイザーを特定の方法で動作させることができる場合がいくつかあります。テスト後、本当に必要な場合にのみ、注意して使用してください。

于 2013-05-24T13:27:08.693 に答える