繁体   English   中英

批量插入相关表

[英]Batch insertion of related tables

所以我决定测试批处理语句。 这是非常简化的结构:

customer
  has many contracts
     has many payments

我的实现是基于java中的mybatis,但我相信问题更多的是关于纯sql。 我想检查数据库中的每个人是否都是最新的。 所以我正在一一检查政策,我正在检查是否有任何数据丢失/应该更新/应该删除。

因为我想加快这个过程,我决定

  1. 对每个人使用批处理以避免数百条语句
  2. 每批一笔交易,全人数据或什么都没有

因此,让我们从只有全新客户的情况开始。 所以我的代码生成类似:(每个域一个接一个,没有任何顺序)

第一批

insert into policy (name) values ('policyA')

insert into contract (personId, name) values (?, 'contractA')
insert into contract (personId, name) values (?, 'contractB')

insert into payment (contractId, name) values (?, 'ToContractA')
insert into payment (contractId, name) values (?, 'ToContractB')
insert into payment (contractId, name) values (?, 'ToContractA')
insert into payment (contractId, name) values (?, 'ToContractB')

... 批次 X

insert into policy (name) values ('policyX')
... same as above

在开始时,我发现了一个名为 SCOPE_IDENTITY() 的东西,它可以帮助我

insert into policy (name) values ('policyA')
insert into contract (personId, name) values (select SCOPE_IDENTITY(), 'contractA') //here it is working
insert into contract (personId, name) values (select SCOPE_IDENTITY(), 'contractB') //here it will broke as it will return id of newly created contract instead policy

然后我发现 SELECT IDENT_CURRENT('TableName') 这几乎是我的解决方案,但是当 session 之外的东西插入我的数据库(这是可能的)时,它会中断。

所以我有两个问题

  1. 如何动态放置这些ID
  2. 使用此类批次加速过程是否是一种好方法(上面的示例非常简化,我有更复杂的结构)

我建议先在您的应用程序中编写此代码。 我认为您低估了从您的应用程序执行 SQL 的性能。 一旦有了可测试的可重复基线,您就可以尝试对性能进行更改。 但是,您很少会关心,因为在这些情况下,性能几乎总是由 IO 性能决定的。

它不是很清楚你所说的批处理是什么意思。 如果您正在谈论在单个 mybatis 调用中对 sql 进行分组,我会说这是不必要的。

事务应谨慎使用,因为它会影响您的错误流。 您必须询问在此过程中的任何时候发生故障是否应该回滚您的一个插入或所有插入? 如果您只回滚一个插入,您是否有一种方法可以从失败的地方继续?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM