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