2008-09-16 21 views
3

SELECTステートメントで一時テーブルを使用すると、論理I/Oカウントが向上するのはなぜですか?それを減らすのではなく、データベースへのヒットの量を増やすのではないでしょうか。これは、「問題」がセクションに分割されているためですか?私は裏で何が起こっているのか知りたいです。少なくともmysqlので、TMPのテーブルをデータベース側で収集構造体に結果を構築する問題のクラスがありますHD一時テーブルとSQL SELECTパフォーマンス

+0

DBMSとは何ですか?どのSQLを話していますか?それを貼り付けてください! –

答えて

2

一般的な答えはありません。これは、テンポラリテーブルの使用方法によって異なります。

一時テーブルは、複雑なフィルタ/結合の後に複数回作成された行をバッチで後でキャッシュすることで、IOを削減できます。このようにして、DBは、レコードのサブセットのみが必要な場合に、ベーステーブルに複数回ヒットすることを避けることができます。

一時テーブルは、クエリで後で使用されないレコードを格納するか、または他のデータでよりよく使用されていた可能性のあるエンジンのキャッシュ内に多くの領域を占有することによってIOを増加させる可能性があります。

すべての内容を使用する一時テーブルを作成するのは、クエリオプティマイザが一時テーブルを見過ごすことができず、(おそらく)不必要なデータのspoolこれをソース表からストリーミングできるようにするのではなく、

+0

あなたのRAMまたはあなたの設定がそのようなジブmemeoryテーブルを許可していない場合にのみ、tempテーブルが正常に遅くなるディスクを使用している場合に限り、tempテーブルが通常MEMORYタイプとしてビルドされます。 – Rufinus

0

、結果の部品をクライアントに返すよりも、各部品の丸めをする方がはるかに好ましい方法です。例えば

:任意の深さの再帰的な関係(のボス)

データがないと、クエリが効率的に実行可能な方法でインデックス化されることはありませんクエリの問題の別のクラスがあります。結果をカスタム構造で索引付けできるコレクション構造にすると、これらの問合せの論理IOが減少します。

0

を打つ何よりものSELECTがはるかに速くなって、RAMに保存されている私の知る限り

1

私はテンポラリテーブルによって、WHERE句のサブ選択を意味するつもりです。

クエリオプティマイザがサブ選択/一時表に出会うと、何をすべきかについていくつかの前提ができます(これは、セミジョイン操作と呼ばれ、通常はクエリのテキスト実行計画で参照できます)。そのデータで本質的に、オプティマイザは、サブ選択の結果セットの結合を実行する実行プランを作成し、他のテーブルから読み取る必要がある行の数を減らします。行数が少ないため、クエリエンジンはディスク/メモリからのページを少なく読み込み、必要なI/O量を減らすことができます。

関連する問題