0

履歴エントリのテーブル内のレコードと一致する新しいエントリのテーブル内のレコードを検索するクエリに取り組んでおり、一致は多くのフィールドの 1 つにある可能性があります。言い換えると:

「current.id = archive.id または current.name = archive.name または current.address = archive.address のすべてのレコードを表示する」

このクエリの私の SQL は次のとおりです。

SELECT current.id, current.name, current.address FROM current
INNER JOIN archive
ON
    current.id = archive.id OR
    current.name = archive.name OR
    current.address = archive.address

私がそれを実行すると、永遠にかかります。これはデータの最初のロードです。アーカイブには常に約 300,000 レコードが含まれますが、現在は 500 から 40,000 の間で変動します。

このクエリを記述するより良い方法はありますか? または、クエリは安定していますが、基になるデータベースに問題がある可能性がありますか?

4

1 に答える 1

4

各テーブルで問題の 3 つのフィールドにインデックスを作成すると (特にアーカイブ テーブルが非常に大きい場合)、おそらく役立つでしょうが、代わりにこれを試してください。

SELECT current.id, current.name, current.address
FROM current
INNER JOIN archive
ON
    current.id = archive.id

UNION

SELECT current.id, current.name, current.address
FROM current
INNER JOIN archive
ON
    current.name = archive.name

UNION 

SELECT current.id, current.name, current.address
FROM current
INNER JOIN archive
ON
    current.address = archive.address

このクエリを使用すると、フィールドを個別にインデックス化できるため (引き続き行う必要があります)、インデックスが小さくなる可能性があり、全体的なパフォーマンスが向上します。

結合基準で OR を使用すると、クエリ オプティマイザが実際に混乱し、最適ではない処理が行われる可能性があります。s はコストがかかりますUNIONが、クエリ時間が結合に費やされる可能性が高く、それを簡素化すると大いに役立つ場合があります。

于 2012-05-03T20:24:24.983 に答える