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


12

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

1番目のデータセットには、StoreKey/ProductKey2012年1月から2014年5月の終わりまでの販売の一意の組み合わせがあります(結果= 45万行)。2番目のデータセットには、StoreKey/ProductKey2014年6月から今日までの販売の一意の組み合わせがあります(結果= 19万行)。

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

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

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

回答:


10

私の意見では、EXCEPTを使用することがここに行く方法ですが、一時テーブルの使用を再検討することもできます。そうすることで、メモリ内のデータを効果的に複製することになり、速度が低下します。必要なインデックスがソーステーブルに存在する場合(疑わしい)、適切なSELECTを比較します。

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

1
正しい、テーブルにはインデックスがありますが、2つの必須フィールドのクラスター化インデックスとTransactionDateKeyという名前のフィールドです。a。)StoreKeyとProductKeyのクラスター化インデックスb。)StoreKeyとProductKeyの2つの個別の非クラスター化インデックスをそれぞれ実装すると、大きな違いが見られますか?
ピエールプレトリアス14年

1
TransactionDateKeyは期間をフィルタリングするために使用される列であると仮定します。その場合、のクラスター化インデックスはTransactionDateKeyStoreKeyあり、ProductKey完璧です。
きらめき14年

1

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


ジョスアありがとう。Big-Oの複雑さに精通していませんが、確かにそれを見るでしょう。
ピエールプレトリアス14年

一部の人々は口語的にBig-Oと呼ぶComplexity Analysisの詳細情報へのリンク。それは最初に見るほど難しいものではありません。タスクが線形時間または多項式時間で実行されると人々が言うとき、これが彼らが言及していることです。一般に、データベースのバックアップは線形です。つまり、データベースサイズの2倍のバックアップには2倍の時間がかかります。ただし、データセットを並べ替えると、線形ではありません。サイズが2倍のファイルは、ソートに2倍以上の時間がかかります。bigocheatsheet.com、wiki en.wikipedia.org/wiki/Time_complexityでは、可能な限り高速な比較ソートは「線形時間」= n log(n)であると述べています。
ジョシュアフーバー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.