1

をしている

SELECT * FROM (SELECT foo.id, bar.name FROM foo LEFT JOIN bar ON bar.foo_id = foo.id)
              \--------------- Will this be a temp table? --------------------------/

ストアド プロシージャで # を使用してテーブルを宣言するのと同じ種類の一時テーブルを作成しますか? それとも、ビューやその他の魔法を作成しますか? 一時テーブルをすばやく検索すると、それらがストアド プロシージャで使用されていることがわかりました。

4

3 に答える 3

1

はい、内部的にのみです。

クエリ全体が実行された後は、アクセスできなくなります。

于 2012-09-19T08:27:00.017 に答える
1

一時テーブルはメモリ内に作成され、前述のように失われます。複雑なサブクエリの場合、これは明らかにメモリに負担をかけますが、ほとんどのものと同様に、メモリはディスクよりも高速です。

ネストされたクエリを個別のクエリとして実行し、(ディスク上の) 一時テーブルを使用して別のクエリを実行し、最終的にテーブルを削除することができます。

于 2012-09-19T08:34:25.450 に答える
0

あなたの例では、外側のクエリは何もしません。そのため、クエリ オプティマイザーはそれを最適化して取り除きます。

クエリ実行プランで結果セットの流れを確認できます。たとえば、loop join結果は、結果の行を含む一時構造になります。一時構造は、一時テーブルと同じように tempdb に格納できます。ただし、それは表示されず、クエリの完了後に割り当てが解除されます。

于 2012-09-19T08:31:07.857 に答える