如何在 SQL 服务器中进行大量比较?
How can I do a very high volume of comparisons in SQL Server?
我有一个包含 2,200,000 条记录的数据库。我在一个 c# 程序中做了一些工作,该程序重新计算了这 2,200,000 条记录的数据,我想插入它但没有任何重复项(即如果它生成相同的记录相同的数据,不要做任何事情)。我检查了 9 个字段,看它们是否相同,如果没有差异(相同数据),我不插入。
我正在想一个快速的方法来做到这一点。我能想到的就是在所有 9 个字段中都有一个唯一的约束,但我觉得这可能是错误的方法。
之前我将整个批次加载到内存中并在那里进行了比较,但是由于它已经增加到 200 万条以上的记录,这变得不切实际。
有什么想法吗?
更详细一点:
一项收集一些科学数据的服务正在运行。如果数据符合某些标准(不重要),则它会在数据库中插入一条警告记录。程序第一次运行产生200万条警告
第二次运行时,它收集了相同的数据。但我只想插入与现有记录不同的记录。所以我必须将之前的 200 万条警告与 200 万条新警告进行比较。如果它们相同,则什么也不会发生。如果它们有任何不同,它们将作为新警告插入。
一位科学家逐一检查每个警告,并将它们标记为重要或不重要。所以他们不关心完全相同的重复警告。
数据有9个字段,一些是字符串,一些是整数,如果任何字段发生变化,它必须插入一个新的警告。
问题:
目前的警告是在一个循环中一个一个计算,然后在另一个循环中插入到数据库中。
散列听起来可行,我如何创建所有字段的散列?这是 c# 手动操作还是我可以让 SQL 自动执行? (我认为我必须在代码中生成相同的散列以停止重复,因此我也需要能够在 C# 中创建它)。
是的,如果以前的版本与当前版本相同则不要插入,例如我有数据“1, 125, abcdef, 33.4, chocolate” 如果我处理一条记录并得到“1, 125, abcdef, 33.4, chocolate” 不要插入,如果我得到“1, 125, abcdef, 33.4, melon " 然后插入。
使用哈希。
我在为客户的 DWH 实施 "Delta Imports" 时遇到了类似的问题。最简单和最快的方法是比较两个数据集的哈希值。每条记录都有一个 uid (uniqueidentifier)
和一个 hash (nvarchar(400))
列。哈希是在将其插入数据库中相应的 table 之前计算的。
对于每次新的导入(即在您的场景中进行计算),将再次计算哈希值并与现有哈希值(具有相同的 uid
)进行比较。如果两者匹配,则记录将被跳过,如果两者不同,将被更新。
我有一个包含 2,200,000 条记录的数据库。我在一个 c# 程序中做了一些工作,该程序重新计算了这 2,200,000 条记录的数据,我想插入它但没有任何重复项(即如果它生成相同的记录相同的数据,不要做任何事情)。我检查了 9 个字段,看它们是否相同,如果没有差异(相同数据),我不插入。
我正在想一个快速的方法来做到这一点。我能想到的就是在所有 9 个字段中都有一个唯一的约束,但我觉得这可能是错误的方法。
之前我将整个批次加载到内存中并在那里进行了比较,但是由于它已经增加到 200 万条以上的记录,这变得不切实际。
有什么想法吗?
更详细一点:
一项收集一些科学数据的服务正在运行。如果数据符合某些标准(不重要),则它会在数据库中插入一条警告记录。程序第一次运行产生200万条警告
第二次运行时,它收集了相同的数据。但我只想插入与现有记录不同的记录。所以我必须将之前的 200 万条警告与 200 万条新警告进行比较。如果它们相同,则什么也不会发生。如果它们有任何不同,它们将作为新警告插入。
一位科学家逐一检查每个警告,并将它们标记为重要或不重要。所以他们不关心完全相同的重复警告。
数据有9个字段,一些是字符串,一些是整数,如果任何字段发生变化,它必须插入一个新的警告。
问题:
目前的警告是在一个循环中一个一个计算,然后在另一个循环中插入到数据库中。
散列听起来可行,我如何创建所有字段的散列?这是 c# 手动操作还是我可以让 SQL 自动执行? (我认为我必须在代码中生成相同的散列以停止重复,因此我也需要能够在 C# 中创建它)。
是的,如果以前的版本与当前版本相同则不要插入,例如我有数据“1, 125, abcdef, 33.4, chocolate” 如果我处理一条记录并得到“1, 125, abcdef, 33.4, chocolate” 不要插入,如果我得到“1, 125, abcdef, 33.4, melon " 然后插入。
使用哈希。
我在为客户的 DWH 实施 "Delta Imports" 时遇到了类似的问题。最简单和最快的方法是比较两个数据集的哈希值。每条记录都有一个 uid (uniqueidentifier)
和一个 hash (nvarchar(400))
列。哈希是在将其插入数据库中相应的 table 之前计算的。
对于每次新的导入(即在您的场景中进行计算),将再次计算哈希值并与现有哈希值(具有相同的 uid
)进行比较。如果两者匹配,则记录将被跳过,如果两者不同,将被更新。