Sql 从单个表中的多个表插入数据设置过程

Sql 从单个表中的多个表插入数据设置过程,sql,database,data-integration,Sql,Database,Data Integration,我正在数据库中构建一个进程,其中多个表用于在单个表中写入数据(每个表在单个进程中)。该过程应该是容错的-如果发生错误,所有插入的数据都应该回滚。在我看来,在整个数据库系统中实现这种逻辑有两种方法 在一个进程开始时,我锁定目标数据库,所有其他进程都必须等待该进程完成(不可能进行真正的并行处理) 每个进程将数据写入tmp表,最后可以批量加载目标中的所有数据。(跟踪哪些数据已经导出等) 对于这种类型或问题,是否有更多/更好的选择 干杯考虑到行数(1m)以及每5分钟运行一次进程的事实,我认为您提到的两种

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

  • 在一个进程开始时,我锁定目标数据库,所有其他进程都必须等待该进程完成(不可能进行真正的并行处理)
  • 每个进程将数据写入tmp表,最后可以批量加载目标中的所有数据。(跟踪哪些数据已经导出等)
  • 对于这种类型或问题,是否有更多/更好的选择

    干杯

    考虑到行数(1m)以及每5分钟运行一次进程的事实,我认为您提到的两种方法都不适合-

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

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

  • 挑战在于——在整个过程成功完成之前,任何人都不能使用提交的数据。为了解决这个问题,

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

  • 您可以以较小的批提交数据
  • 没有大的提交或回滚
  • 加载过程中没有明显的锁定/暂停
  • 缺点-

  • 所有读取目标表的查询都需要额外的联接

  • 通常要插入的行数是多少?视情况而定,但可能会增加到1.000.000,并且进程每5分钟运行一次。问题的规格非常广泛,但是像SQL Server这样的引擎可以使用内置命令在出错时回滚事务。