我有一个包含2,200,000条记录的数据库。我在ac#程序中做了一些工作,重新计算这些2,200,000条记录的数据,我想插入它但没有任何重复(即如果它生成相同的相同数据)为了记录,不要做任何事情)。我检查了9个字段,看它们是否相同,如果没有差异(相同数据),我不会插入。
我正在考虑一种快速的方法来做到这一点。我能想到的只是在所有9个领域都有一个独特的约束,但我觉得这可能是错误的方法。
之前我把整批货都加载到内存中并进行了比较,但由于它已达到2 mil +记录,这已经变得不切实际了。
有什么想法吗?
更多细节:
运行收集一些科学数据的服务。如果数据符合某些条件(不重要),则会将警告记录插入数据库。程序第一次运行时会产生200万条警告。
第二次运行时,它会收集相同的数据。但是我只希望在与现有记录不同的情况下插入记录。因此,我必须将之前的200万次警告与200万次新警告进行比较。如果它们是相同的,则没有任何反应。如果它们以任何方式不同,它们将作为新警告插入。
科学家逐一检查每个警告并将其标记为重要或不重要。所以他们不关心完全相同的重复警告。
数据有9个字段,有些字符串是整数,如果有任何字段发生变化,则必须插入新警告。
问题:
目前,警告在循环中逐个计算,然后在另一个循环中插入数据库。
哈希听起来像它可能有效,我怎样才能创建所有字段的哈希?这是一个c#手动操作还是我可以让SQL自动执行? (我将不得不在代码中生成相同的哈希以阻止重复,我想,所以我需要能够在c#中创建它。)
是的,如果以前的版本与当前版本相同,则不要插入,例如我有数据“1,125,abcdef,33.4,巧克力”,如果我处理一个记录并得到“1,125,abcdef,33.4,巧克力”不插入,如果我得到“1,125,abcdef,33.4,甜瓜“然后插入。
答案 0 :(得分:1)
使用哈希。
我在为客户提供的DWH实施“Delta Imports”时遇到了类似的问题。最简单,最快捷的方法是比较两个数据集的哈希值。每条记录都有uid (uniqueidentifier)
和hash (nvarchar(400))
列。在将哈希值插入数据库中的相应表之前计算哈希值。
对于每个新导入(即您的场景中的计算),将再次计算散列并将其与现有散列(具有相同的uid
)进行比较。记录将被跳过,两者都匹配,如果两者不同,将会更新。