数据供应过程从单个表中的多个表中插入

时间:2017-08-21 12:42:29

标签: sql database data-integration

我正在数据库中构建一个进程,其中使用多个表在单个表中写入数据(每个表都在一个进程中)。该过程应该是容错的 - 如果出现错误,所有插入的数据都应该回滚。在我看来,有两种方法可以实现这种逻辑整体数据库系统。

  1. 在一个进程开始时,我锁定目标数据库,所有其他进程必须等到此进程完成(无法进行真正的并行处理)
  2. 每个进程在tmp表中写入数据,最后他们可以批量加载目标中的所有数据。 (跟踪已经导出的数据等)
  3. 这种类型或问题是否有更多/更好的选择?

    干杯

1 个答案:

答案 0 :(得分:0)

考虑到行数(1m)以及你每5分钟运行一次这个过程的事实,我认为你提到的任何一种方法都不适合 -

  • 第一种方法会过于频繁地锁定目标表
  • 第二种方法会插入大量数据,然后在最后提交或回滚。根据您使用的数据库 - 如此大量的未提交数据可能会导致性能问题。最后的回滚也会给DB带来很大的负担。

你可以尝试的是 -

  1. 在目标表中批量插入和提交数据(比如5K记录 - 在测试各种批量大小后,您需要对其进行调整)

  2. 挑战在于 - 在整个过程成功完成之前,没有人应该能够使用提交的数据。要解决这个问题,

    • 创建一个名为process_stats(process_id,status)
    • 的表
    • 每次启动流程时,请在此表中插入一个状态为“已启动”的条目。当流程结束时,将状态更改为“SUCCESSFUL”或“FAILED”
    • 从目标表中引用此表(因此向目标表中添加一个名为process_id的列)
    • 最后,任何读取目标表的查询都应该将目标表与process_stats表连接,并仅在进程状态为“SUCCESSFUL”时选择记录
    • 如果进程失败,您可以选择从目标表中删除相应的记录
  3. 这样可以确保 -

    1. 您以较小批量提交数据
    2. 没有大的提交或回滚
    3. 加载期间无明显锁定/暂停
    4. 缺点 -

      1. 读取目标表的所有查询都需要额外的连接