当前位置: 首页 > 面试题库 >

有效识别差异

席嘉祯
2023-03-14
问题内容

每天,我们都会收到来自不同供应商的不同格式(CSV,XML,自定义)的巨大文件,需要将其上传到数据库中进行进一步处理。

问题在于这些供应商将发送其数据的完整转储,而不仅仅是更新。在某些应用程序中,我们仅需要发送更新(即,仅更改记录)。当前,我们要做的是将数据加载到临时表中,然后将其与以前的数据进行比较。这非常缓慢,因为数据集非常庞大,而且我们有时会缺少SLA。

有没有更快的方法来解决此问题?任何建议或帮助,不胜感激。我们的程序员用尽了所有的想法。


问题答案:

在完整的转储数据集中,有多种模式可用于检测增量,即更改的记录,新的记录和已删除的记录。

我所见过的一种更有效的方法是,为已有的数据行创建哈希值,在数据库中创建导入的哈希值,然后将现有的哈希值与传入的哈希值进行比较。

主键匹配+哈希匹配=不变的行

主键匹配+哈希不匹配=更新的行

传入数据中的主键,但现有数据集中缺少主键=新行

主键不在输入数据中,而在现有数据集中=已删除的行

哈希的方式因数据库产品而异,但是所有主要的提供程序中都有某种可用的哈希。

优点是仅需比较少量字段(主键列和哈希),而不需要通过字段分析来比较一个字段。即使是很长的哈希,也可以很快地进行分析。

这将需要对导入处理进行一些返工,但是花费的时间将一次又一次地提高处理速度。



 类似资料:
  • 我有一个简单的Flutter应用程序。 如果我将类移动到另一个文件中,例如custom_card.dart,然后执行,我会得到错误消息:。如果类留在main.dart中,那么一切都可以工作。我错过了什么?

  • 我有一个camel路由正在从一个文件中读取,它不会在路由结束后删除。camellock文件,所以我想关闭lock。Camel-File的文档说明属性是“lock”,但是当我执行时,我得到: 原因:org.apache.camel.resolveEndpointFailedException:未能解析endpoint:file:///data/in/?lock=false,原因:未能解析endpoi

  • 我正在尝试编译一个使用GLFW作为静态库的程序。我确信我已经正确链接了所有内容,因为其他GLFW函数不会抛出任何错误。这些函数仅使用GLFWwindow*作为参数。例如: 错误:无效参数'候选值为:void glfwMakeContextCurrent(*)' 这给了我一个错误。参数窗口无效。其他需要指向GLFWwindow的指针的函数也会抛出错误。但是其余的,没有GLFWwindow*作为预期参

  • 问题内容: 我知道在SO上有很多这样的问题,但似乎没有什么完全一样的。 我有一个ASP.NET页面,在该页面上添加了一个ReportViewer控件以显示和RDLC本地报告。该报表的数据源在页面上设置为SQL数据源,该数据源根据页面上的两个文本框过滤日期。但是,报表本身没有参数,它不包含显示或在其数据集中显示的日期/时间的字段,并且根本没有过滤器。 当我查看页面时,由于今天的日期(8月15日)作为

  • 问题内容: 我需要对照事务性归档表检查活动表,但我不确定执行此操作的最快方法… 例如,假设我的活动表由以下各列组成: Term CRN Fee Level Code 我的存档表将具有相同的列,但也具有存档日期,因此我可以看到活动表在给定日期具有的值。 现在…我将如何编写查询以确保活动表的值与存档表中的最新条目相同? PS我更愿意在SQL中处理此问题,但是PL / SQL如果速度更快,也是一种选择。

  • spring支持两种不同的验证方法:spring验证和JSR-303 bean验证。这两种方法都可以通过定义一个spring验证器来使用,该验证器委托给包括bean验证器在内的其他委托器。到目前为止还不错。 但当对方法进行注释以实际请求验证时,情况就另当别论了。我可以这样批注 或者像这样 这里,@valid是javax.validation.validated,@validated是org.spr