在SQL中比较两个大型数据集的有效方法


12

目前,我正在比较两个包含唯一StoreKey/ProductKey组合的数据集。

第一个数据集具有StoreKey/ProductKey2012年1月开始至2014年5月结束之间的唯一销售组合(结果= 45万行)。第二个数据集具有独特的StoreKey/ProductKey组合,从2014年6月开始销售到今天(结果= 190K行)。

我正在寻找StoreKey/ProductKey第二组中的组合,但不在第一组中-即从6月初开始销售的新产品。

到目前为止,我已经将这两个数据集转储到了临时表中,在两个键上都为这两个表创建了索引,并使用该EXCEPT语句查找了唯一项。

比较这么大的数据集最有效的方法是什么?有没有更有效的方式进行这种大型比较?

Answers:


10

我认为使用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

1
正确,该表确实具有索引,但是它是两个必填字段以及一个名为TransactionDateKey的字段的聚集索引。如果我实现以下任一方法,将会看到很大的不同:a。)StoreKey和ProductKey上的聚簇索引b。)StoreKey和ProductKey上的两个独立的非聚簇索引?
Pierre Pretorius

1
我假设TransactionDateKey是用于过滤时间段的列。在这种情况下TransactionDateKeyStoreKey和上的聚集索引ProductKey是完美的。
Twinkles 2014年

1

如果您熟悉算法(Big-O复杂度),则执行此比较最多为O(n log(n))。最有效的算法将对两个数据集进行排序,然后对合并后的数据进行并行处理,以找到匹配(或不匹配)的键。当您使用EXCEPT或时,大多数RDBMS优化器都会自动为您执行此操作MINUS。您的解释计划将确认或不确认。如果看到嵌套循环,则表示执行O(n ^ 2),效率不高。


谢谢乔苏阿。虽然不熟悉Big-O的复杂性,但一定会对此进行了解。
Pierre Pretorius

链接,以了解有关复杂性分析的更多信息,有些人通常将其称为Big-O。它并不像初看起来那样困难。当人们说任务将以线性时间或多项式时间运行时,这就是他们所指的。数据库备份通常是线性的,这意味着2倍的数据库大小需要2倍的时间来备份。排序数据集虽然不是线性的。2倍大的文件需要2倍以上的时间进行排序。bigocheatsheet.com,在wiki en.wikipedia.org/wiki/Time_complexity中,它提到了最快的比较排序方式是“ linearithmic time” = n log(n)。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.