0

以下に説明する時間のかかるクエリがあるとします。

(SELECT ...
FROM ...) AS FOO
LEFT JOIN (
    SELECT ...
    FROM ...) AS BAR
ON FOO.BarID = BAR.ID

と仮定しましょう

(SELECT ...
FROM ...) AS FOO

多くの行を返します(10 M としましょう)。すべての行を BAR のデータと結合する必要があります。

ここで、次の結果を挿入するとしましょう

    SELECT ...
    FROM ...) AS BAR

テーブルにアドホック インデックスを追加します。

私の質問:

ライブクエリでの「JOIN」のパフォーマンスは、アドホック インデックスが追加された前のライブクエリの結果を含むテーブルへの「JOIN」のパフォーマンスとどのように異なりますか?

それを置く別の方法:

JOIN が遅い場合、JOIN 先のテーブルを実際に格納してインデックスを作成することにメリットはありますか?

4

1 に答える 1

1

答えは「たぶん」です。

問題のデータの統計に依存します。確実に見つける唯一の方法は、実際に最初のクエリを一時テーブルにロードし、関連するインデックスをそれに貼り付けてから、クエリの 2 番目の部分を実行することです。

最初のクエリの結果をテーブルに永続的にロードすることが可能であれば、もちろんクエリはより高速になります。

さらに高速にしたい場合は、使用している DBMS に応じて、両方のテーブルを横断するインデックスを作成することを検討できます。SQL Server を使用している場合は、「インデックス付きビュー」と呼ばれるか、「Reified他のシステムのインデックス。

最後に、究極の速度が必要な場合は、データを非正規化して、その場で発生している結合を排除することを検討してください。基本的には、前処理 (結合) をオフラインに移動しますが、ストレージ スペースとデータの一貫性 (ライブ テーブル) を犠牲にします。更新を実行する頻度によっては、少し遅れます)。

これが役立つことを願っています。

于 2012-09-01T14:55:36.797 に答える