Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库批量更新_Sql_Database_Batch Processing_Mybatis_Batch Updates - Fatal编程技术网

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();