2014-02-13 127 views
3

是什麼批量更新定義的術語和性能這三種解決方案之間的差異:數據庫批量更新

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

或設置Batch=true在MyBatis的配置

+0

第一個涉及的輸入較少,但不適用於每個數據庫引擎。 –

+0

我的意思是他們都是批量更新? – Nav

+0

@DanBracuk:第一個版本不適用於Oracle和較早的SQL Server版本。 –

回答

1

假設你的數據庫中提取語法1爲有效(2008年MS-SQL爲例),並假設#1和#2都在本地數據庫的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框架,所以很難得到更具體的。

這是一個廣泛的問題,所以我也保持廣泛的答案。如果有任何具體的不明確,請發表評論,我會很樂意擴大。