有效识别差异
Identifying Differences Efficiently
每天,我们都会收到来自不同供应商的不同格式(CSV、XML、自定义)的大量文件,我们需要将这些文件上传到数据库中以供进一步处理。
问题是这些供应商将发送他们数据的完整转储,而不仅仅是更新。我们有一些应用程序,我们只需要发送更新(即仅更改的记录)。我们目前所做的是将数据加载到暂存 table 中,然后将其与之前的数据进行比较。由于数据集庞大而且我们偶尔会遗漏 SLA,因此速度非常慢。
有没有更快的方法解决这个问题?非常感谢任何建议或帮助。我们的程序员 运行 没有想法..
在完整转储数据集中,有多种检测增量的模式,即更改的记录、新记录和删除的记录。
我见过的一种更有效的方法是为您已有的数据行创建散列值,在导入到数据库中后创建散列值,然后将现有散列值与传入的散列值进行比较。
Primary key match + hash match = Unchanged row
Primary key match + hash mismatch = Updated row
Primary key in incoming data but missing from existing data set = New row
Primary key not in incoming data but in existing data set = Deleted row
如何散列因数据库产品而异,但所有主要提供商都提供某种散列。
优势在于只需比较少量字段(主键列和散列),而不是逐个字段进行分析。即使是很长的散列也可以很快被分析。
这将需要对您的导入处理进行一些返工,但所花费的时间会随着处理速度的提高而一次又一次地得到回报。
对此的标准解决方案是散列函数。您所做的是能够获取每一行,并计算一个标识符 + 其内容的哈希值。现在你比较散列,如果散列相同,那么你假设该行是相同的。这是不完美的——理论上不同的值可能会给出相同的哈希值。但实际上,与哈希函数无法按承诺工作相比,您更需要担心宇宙射线导致计算机中的随机位翻转。
rsync
和 git
都是广泛使用的以这种方式使用哈希的软件示例。
一般来说,在将哈希值放入数据库之前计算哈希值比在数据库内部执行一系列比较要快。此外,它允许处理分布在多台机器上,而不是数据库中的瓶颈。并且比较哈希比比较许多字段要少工作,无论您是在数据库中还是在数据库外进行。
有 many hash functions 个可以使用。根据您的应用程序,您可能想要使用加密散列,尽管您可能不必这样做。位多总比位少好,但是 64 位散列应该适合您描述的应用程序。在处理了 1 万亿个增量后,您犯意外错误的机会仍然不到 1000 万分之一。
每天,我们都会收到来自不同供应商的不同格式(CSV、XML、自定义)的大量文件,我们需要将这些文件上传到数据库中以供进一步处理。
问题是这些供应商将发送他们数据的完整转储,而不仅仅是更新。我们有一些应用程序,我们只需要发送更新(即仅更改的记录)。我们目前所做的是将数据加载到暂存 table 中,然后将其与之前的数据进行比较。由于数据集庞大而且我们偶尔会遗漏 SLA,因此速度非常慢。
有没有更快的方法解决这个问题?非常感谢任何建议或帮助。我们的程序员 运行 没有想法..
在完整转储数据集中,有多种检测增量的模式,即更改的记录、新记录和删除的记录。
我见过的一种更有效的方法是为您已有的数据行创建散列值,在导入到数据库中后创建散列值,然后将现有散列值与传入的散列值进行比较。
Primary key match + hash match = Unchanged row
Primary key match + hash mismatch = Updated row
Primary key in incoming data but missing from existing data set = New row
Primary key not in incoming data but in existing data set = Deleted row
如何散列因数据库产品而异,但所有主要提供商都提供某种散列。
优势在于只需比较少量字段(主键列和散列),而不是逐个字段进行分析。即使是很长的散列也可以很快被分析。
这将需要对您的导入处理进行一些返工,但所花费的时间会随着处理速度的提高而一次又一次地得到回报。
对此的标准解决方案是散列函数。您所做的是能够获取每一行,并计算一个标识符 + 其内容的哈希值。现在你比较散列,如果散列相同,那么你假设该行是相同的。这是不完美的——理论上不同的值可能会给出相同的哈希值。但实际上,与哈希函数无法按承诺工作相比,您更需要担心宇宙射线导致计算机中的随机位翻转。
rsync
和 git
都是广泛使用的以这种方式使用哈希的软件示例。
一般来说,在将哈希值放入数据库之前计算哈希值比在数据库内部执行一系列比较要快。此外,它允许处理分布在多台机器上,而不是数据库中的瓶颈。并且比较哈希比比较许多字段要少工作,无论您是在数据库中还是在数据库外进行。
有 many hash functions 个可以使用。根据您的应用程序,您可能想要使用加密散列,尽管您可能不必这样做。位多总比位少好,但是 64 位散列应该适合您描述的应用程序。在处理了 1 万亿个增量后,您犯意外错误的机会仍然不到 1000 万分之一。