web-dev-qa-db-ja.com

SQLで2つの大きなデータセットを比較する効率的な方法

現在、一意のStoreKey/ProductKeyの組み合わせを含む2つのデータセットを比較しています。

1番目のデータセットには、2012年1月の初めから2014年5月の終わりまでの売り上げのユニークなStoreKey/ProductKeyの組み合わせがあります(結果= 45万行)。 2番目のデータセットには、2014年6月から今日までの売り上げ(結果= 1万9000行)の一意のStoreKey/ProductKeyの組み合わせがあります。

2番目のセットにはあるが1番目のセットにはないStoreKey/ProductKeyの組み合わせを探しています。つまり、6月の初めから販売された新製品です。

これまでは、2つのデータセットを一時テーブルにダンプし、両方のキーに両方のテーブルのインデックスを作成し、EXCEPTステートメントを使用して一意のアイテムを検索しました。

そのような大きなデータセットを比較する最も効率的な方法は何ですか?このタイプの大規模比較を行うより効率的な方法はありますか?

12

ここではEXCEPTを使用するのがよいと思いますが、一時テーブルの使用を再検討することをお勧めします。そうすることで、メモリ内のデータを効果的に複製し、速度が低下します。必要なインデックスがソーステーブルに存在する場合(私が推測しているように)、適切なSELECTSを比較するだけです。

SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date1 AND date2
EXCEPT
SELECT StoreKey,ProductKey FROM table WHERE sales BETWEEN date3 AND date4
10
Twinkles

アルゴリズム(Big-Oの複雑さ)に精通している場合、この比較の実行はせいぜいO(n log(n))です。最も効率的なアルゴリズムは、両方のデータセットをソートしてから、それらを並行してマージし、一致する(または一致しない)キーを見つけます。 EXCEPTまたはMINUSを使用している場合、ほとんどのRDBMSオプティマイザはこれを自動的に行います。あなたの説明計画が確認または非確認します。ネストされたループが見られる場合は、O(n ^ 2)を実行していますが、それほど効率的ではありません。

1
Joshua Huber