您的方案的一个问题是任何重复的行都会有重复的散列;您永远无法确定何时添加或删除了这些行之一
很好的一点,但不是问题。重复的行是重复的,所有重复的都在下一个处理阶段被删除。所以是的,你是对的,但这不是问题。
“差异”链接将我带到一个页面,其中描述了我认为是应用程序的内容?没有下载链接,没有任何语言的代码......我在这里错过了什么?
你们中的一些人谈到了字节级粒度。这不是必需的。只需要行级别的粒度,因为如果行中的任何内容发生了更改,则必须重新处理整行(记录),因为行内的任何更改都会影响整行。
因此,我们在两个文件(今天的快照和昨天的快照)中比较大约 1000 个字符(无二进制)的行,每个文件大约 1m 行。
因此,使用 SHA256 之类的安全哈希(MD5 有冲突,相比之下速度较慢)我可以在我的 HO 笔记本电脑上处理大约 30MB/秒。服务器当然会更快地咀嚼它。
因此,如果文件是 1GB 左右,那么制作所有的 hases 大约需要 33 秒,而使用 Windows 页面内存读取 1Gb 文件大约需要 30 秒。不可怕
现在我们有两个哈希数组,代表每个文件中的行。如果我们对它们进行排序,我们现在可以使用二进制搜索,因此我们遍历新文件哈希以寻找旧文件哈希中的匹配项。如果我们没有找到它,该行将添加到更改文件中。
请记住,行书(遗留数据库)在各个方面都是未知的。无法保证行的顺序、更改的位置、更改的类型。
逐页阅读前文的建议很好,但假设这两个文件在第一次更改之前是按 smae 顺序排列的。这是不能假设的。行(行)可以是任何顺序。选择任意块大小也违反了行的粒度。出于此任务的目的,行是不可变的。
来自关于 invrementa 加载的优秀链接:文件比较捕获:此方法也称为快照差异方法。此方法通过保留与数据仓库相关的文件的前后图像来工作。比较记录以查找更改,比较记录键以查找插入和删除。由于触发器通常不存在并且事务日志不存在或采用专有格式,因此该技术最适合遗留系统的情况。由于大多数遗留数据库都有一些将数据转储到文件中的机制,因此该技术会创建定期快照,然后比较结果以生成更改记录。当然,静态捕获的所有问题都存在于此。比较整行信息以及密钥识别和匹配的挑战引入了额外的复杂性。这种技术本质上很复杂,通常是不可取的,但在某些情况下,它可能是唯一的解决方案。
这一点在这里最为相关:随着我们进入 TB 级数据仓库领域,每晚从头开始重建数据仓库的能力将步履蹒跚。更新数据仓库的逻辑和有效方法涉及某种形式的增量更新策略。
所以我想我是在正确的轨道上?btree 索引没有优势吗?