Database 找出两个非常大的列表之间的差异

Database 找出两个非常大的列表之间的差异,database,sorting,Database,Sorting,我有两个大的列表可能是一亿个项目,每个列表的源可以来自数据库表或平面文件。两个列表的大小相当,都未排序。我需要找出它们之间的区别。所以我有3个场景: 1.List1是一个数据库表假设每一行只有一个itemkey,它是一个字符串,List2是一个大文件。 2.两个列表都来自2个db表。 3.两个列表都来自两个文件 在案例2中,我计划使用: select a.item from MyTable a where a.item not in (select b.item form MyTable b)

我有两个大的列表可能是一亿个项目,每个列表的源可以来自数据库表或平面文件。两个列表的大小相当,都未排序。我需要找出它们之间的区别。所以我有3个场景: 1.List1是一个数据库表假设每一行只有一个itemkey,它是一个字符串,List2是一个大文件。 2.两个列表都来自2个db表。 3.两个列表都来自两个文件

在案例2中,我计划使用:

select a.item from MyTable a where a.item not in (select b.item form MyTable b) 这显然是低效的,有没有更好的办法?

另一种方法是: 我计划对每个列表进行排序,然后遍历它们以查找差异。如果列表来自文件,我必须先将其读入db表,然后使用db排序输出列表。在数据库排序中,运行时复杂性仍然是唯一的吗

这两种方法都很痛苦,而且当涉及的列表中有数亿项时,速度似乎会非常缓慢。有什么建议吗

在所有情况下,将两个集合都放入数据库中……这种排序和确定是db的用途。其他任何东西都将是车轮的翻版。 以下可能比不在的速度快,但请测试以确保:

在a.JoinColumn=B.JoinColumn(其中B.JoinColumn为NULL)上,从MyTable a左联接MyTable B中选择a.item


确保您的列已编制索引。索引将使整个排序问题变得糟糕。

这实际上不是一个数据库问题

第一步。对两个列表进行排序。可能db列表已经排序,但如果没有,则按排序顺序导出它,或者如果需要对同一列表进行多次排序,则创建索引

第二步。使用排序实用程序在文本文件中创建列表的排序副本。如果这些列表超出了UNIX排序实用程序的功能范围,请将它们拆分,对每个列表进行排序,并在应用程序中合并这些列表

第三步。编写应用程序对这两个列表应用合并算法,并以这种方式识别差异。请注意,如果文本文件位于多个块中,则需要一个辅助合并算法以按排序顺序向主算法提供数据


请注意,如果无法使用UNIX或Linux对文本文件进行排序,请获取UNIX sort命令的源代码并将其移植到您的O/S。

在SQL Server中,您的第2点肯定不正确。在MySQL中,我认为这可能是正确的。在SQL Server中,我可能只会从一个表中选择项,而不是从bis中选择项,这样左连接速度非常慢,每个表有1亿行?+1这是唯一正确的答案。DB不是为这个而设计的,当你在谈论1亿行时,它的性能很差。我最有趣的一个项目是编写一个直接营销合并系统,它的工作原理与Mitch在这里描述的一模一样。这肯定比简单的db left JOIN更难实现。Chri的回答是:从MyTable a left JOIN中选择a.item MyTable B ON a.JoinColumn=B.JoinColumn,其中B.JoinColumn为空,但无论如何,db排序不是比unix排序实用程序或我自己的方法更有效吗?我的应用程序会将它们分解,然后进行排序?