gpt4 book ai didi

sql - 数据库批量更新

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:03 25 4
gpt4 key购买 nike

这三种解决方案在批量更新定义和性能方面有何不同:

1)

Insert into table1 values ('A','A1'),('B','B1'),('C','C1'), ....

2)

Transaction.begin();

insert into table1 values('A','A1'); insert into table1
values('B','B1'); insert into table1 values('C','C1'); ... ... ...

Transaction.commit();

3)

PreparedStatement.addBatch(...);
PreparedStatement.executeBatch();

或者在 MyBatis 配置中设置 Batch=true

最佳答案

假设您的数据库将语法 1 视为有效(例如 MS-SQL 2008)并假设 #1 和 #2 都在 native 数据库的 SQL 实现中...

然后对于你问题的性能部分...

#1 是最快的,因为它将作为单个原子事务被解析/准备一次并执行一次。

#2 将是下一个表现。有两个语句 (txn begin) 和 (txn end) 以及每个插入的语句。

#2a(我建议的东西)工作得更快。根据您的服务器支持的语法,您需要“准备”一个参数化 SQL 并使用您的每个值作为参数重复调用准备好的语句(执行)。这样实际语句只被解析一次。例如。

  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 都快,"IF" ORM 框架在内部足够智能,可以将此类重复插入更改为特定于数据库的批量加载调用。

对于您问题的批量更新定义部分...

这基本上也是一个多部分决定....
#A 口味的主观选择。
#B 它能完成手头的工作吗..

我个人喜欢 #2a,因为它几乎和 #1 一样快,但可读性更好,而且能够处理更大的数据集,或者可以放在循环中,从流/文件等中读取值。并插入它们,而 #1 有时会受到特定 DBMS 实现的最大 SQL 语句大小的限制。 #3 和其他变体实际上取决于您使用的 ORM 框架,因此很难得到更具体的信息。

这是一个宽泛的问题,所以我的答案也很宽泛。如果有任何具体不清楚的地方,请发表评论,我很乐意扩展。

关于sql - 数据库批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21761050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com