Sql 数据库批量更新
这三种解决方案在批更新定义和性能方面有什么区别: (一) (二) (三)Sql 数据库批量更新,sql,database,batch-processing,mybatis,batch-updates,Sql,Database,Batch Processing,Mybatis,Batch Updates,这三种解决方案在批更新定义和性能方面有什么区别: (一) (二) (三) 或者在MyBatis配置中设置Batch=true,假设数据库的语法1有效(例如MS-SQL 2008),并且假设#1和#2都在本机数据库的SQL实现中 那么你的问题的表现部分 #1是最快的,因为它将被解析/准备一次,并作为单个原子事务执行一次 #2将是下一个性能。每个插入有两条语句(txn begin)和(txn end)以及每条语句 #2a(我建议的东西)工作得更快。根据服务器支持的语法,“准备”参数化SQL并使用每个
或者在MyBatis配置中设置
Batch=true
,假设数据库的语法1有效(例如MS-SQL 2008),并且假设#1和#2都在本机数据库的SQL实现中
那么你的问题的表现部分
#1是最快的,因为它将被解析/准备一次,并作为单个原子事务执行一次
#2将是下一个性能。每个插入有两条语句(txn begin)和(txn end)以及每条语句
#2a(我建议的东西)工作得更快。根据服务器支持的语法,“准备”参数化SQL并使用每个值作为参数重复调用prepared语句(execute)。这样,实际语句只解析一次。例如
Transaction.begin();
Stmt.Prepare("insert into table1 values(:Var1, :Var2)");
Stmt.Execute('A','A1');
Stmt.Execute('B','B1');
Stmt.Execute('C','C1');
Transaction.commit();
#3是基于ORM框架的,因此它会有自己的开销,并且会比1和2a慢。但可能比#2快,这取决于它的实现方式。在极少数情况下#3可能比#1和#2a更快,“如果”ORM框架内部足够智能,可以将这种重复插入更改为特定于数据库的批量加载调用
对于批量更新定义,请参见问题的一部分
这基本上也是一个由多个部分组成的决策……#口味的主观选择。
#B它能完成手头的工作吗 我个人喜欢#2a,因为它与#1一样快,但可读性更高,并且能够处理更大的数据集,或者可以放入循环,从流/文件等读取值并插入它们,而#1有时受到特定DBMS实现的最大SQL语句大小的限制。 #3和其他变体实际上取决于您使用的ORM框架,因此很难获得更具体的内容
这是一个宽泛的问题,所以我也一直在宽泛地回答。如果有什么不清楚的地方,请发表评论,我很乐意扩展。第一个版本涉及较少的键入,但不适用于每个数据库引擎。我的意思是,它们都是批量更新?@DanBracuk:第一个版本不适用于Oracle和较旧的SQL Server版本。它也不适用于redbrick。这就是为什么我说它不适用于所有数据库引擎。preparedStatement是对Java库的引用吗?
Transaction.begin();
insert into table1 values('A','A1'); insert into table1
values('B','B1'); insert into table1 values('C','C1'); ... ... ...
Transaction.commit();
PreparedStatement.addBatch(...);
PreparedStatement.executeBatch();
Transaction.begin();
Stmt.Prepare("insert into table1 values(:Var1, :Var2)");
Stmt.Execute('A','A1');
Stmt.Execute('B','B1');
Stmt.Execute('C','C1');
Transaction.commit();