所以我决定测试批处理语句。这是非常简化的结构:
customer
has many contracts
has many payments
我的实现是基于java中的mybatis,但我相信问题更多的是关于纯sql。我想检查数据库里的每个人是否都是最新的。因此,我正在逐一检查策略,并检查是否有任何数据丢失/应更新/应删除。
为了加快这一进程,我决定
对每个人使用批处理以避免成百上千的语句
每批处理一个事务,完整的个人数据或什么都没有
所以,让我们从案例开始,当我们只有全新的客户。因此,我的代码生成如下内容:(每个域一个接一个,没有任何顺序)
第一批
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
在begginig我发现了一个叫做scope\u 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'),这几乎是我的解决方案,但是当会话之外的内容插入到我的数据库中时,它会中断(这是可能的)。
所以我有两个问题
如何动态放置这些ID
使用这样的批处理是否是加快处理速度的好方法(上面的例子非常简单,我有更复杂的结构)
1条答案
按热度按时间lf3rwulv1#
我建议您先在应用程序中编写此代码。我认为您低估了从应用程序执行sql的性能。一旦有了可测试的可重复基线,就可以尝试对性能进行更改。但是,很少有人会在意,因为在这些情况下,性能几乎总是由io性能决定的。
你所说的批处理实际上并不清楚。如果您谈论的是在一个mybatis调用中对sql进行分组,我会说这是不必要的。
事务应该小心使用,因为它会影响错误流。您必须询问在该过程中的任何一点上的失败是否应该回滚您的一个插入或所有插入?如果只回滚一个插入,是否有方法从失败处继续?