Sql-Server

在 SQL 中比較兩個大型數據集的有效方法

  • November 30, 2018

目前,我正在比較兩個包含獨特StoreKey/ProductKey組合的數據集。

第一個數據集具有StoreKey/ProductKey2012 年 1 月開始到 2014 年 5 月結束之間的唯一銷售組合(結果 = 450K 行)。第二個數據集具有獨特的StoreKey/ProductKey組合,從 2014 年 6 月開始銷售,直到今天(結果 = 190K 行)。

我正在尋找StoreKey/ProductKey第 2 組中的組合,但第 1 組中沒有 - 即從 6 月初開始銷售的新產品。

到目前為止,我已經將這兩個數據集轉儲到臨時表中,在兩個鍵上為這兩個表創建索引,並使用該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))。最有效的算法將對兩個數據集進行排序,然後將它們並行合併以找到匹配(或不匹配)的鍵。大多數 RDBMS 優化器會在您使用EXCEPT或時自動為您執行此操作MINUS。您的解釋計劃將確認或不確認。如果你看到嵌套循環,你正在做 O(n^2),效率不高。

引用自:https://dba.stackexchange.com/questions/68385