千條左右的資料,保存在List中,如何批量Update到資料庫中,效率會更高一些呢??
回圈List,單條執行Update肯定是效率不會太快。
組合大一些的SQL執行好像也不是好主意。
uj5u.com熱心網友回復:
首先 千條資料 保存在List中 就不是正確的做法, 既然這么用了, 又要保存到資料庫 就只能回圈update了uj5u.com熱心網友回復:
千條資料 效率上 應該沒多大 提升空間吧, 怎么存 相差應該不大uj5u.com熱心網友回復:
單條執行有資料往返的延遲。
組合長SQL,有長度的限制。
用批量更新會有較好的效率。
如果你用mssql,可以用SqlBulkCopy。
如果你用oracle,可以用OracleBulkCopy等。
假設你的MSSQL下有一個Users表
CREATE TABLE [dbo].[Users] (
[Id] INT NOT NULL,
[Name] NCHAR(32) NULL
);
用SqlBulkCopy可以:
var connectionStr = "Data Source=...; Initial Catalog=...; Integrated Security=True;";
// 放1500條演示資料
var batchData = new DataTable("Users");
batchData.Columns.Add("Id");
batchData.Columns.Add("Name");
for(int i = 0; i < 1500; i++)
{
batchData.Rows.Add(i, "name" + i);
}
using (var con = new SqlConnection(connectionStr))
{
con.Open();
var sbc = new SqlBulkCopy(con)
{
DestinationTableName = "dbo.Users",
BatchSize = 1000,
};
sbc.WriteToServer(batchData);
}
uj5u.com熱心網友回復:
看你這標題,我還以為老p同志又發新東西呢
uj5u.com熱心網友回復:
在你們糾結這些問題的時候,應該去看php,go,python,java們是怎么玩的,人家的手段未必有你們好。so,不必如此糾結。應該怎么辦就怎么辦,越糾結這些越沒啥用處
uj5u.com熱心網友回復:
List to Array , into Arrayuj5u.com熱心網友回復:
SQL Server 還可以用表變數,用存盤程序更新uj5u.com熱心網友回復:
如果轉datatable就可以使用sqlbulkcopy。但是List轉datatable,也不快。但是千條資料好像也還可以吧
uj5u.com熱心網友回復:
3樓的方案沒問題, 如果是oracle 可以定義純SQL插入,引數傳入陣列,速度很快uj5u.com熱心網友回復:
批量操作 首選肯定是SqlBulkCopy不過你的資料源是list所以你還要轉換成datatable 然后才能執行WriteToServer
既然這樣還需要轉換 我覺得還不如直接回圈list執行sql陳述句呢.
比如一次執行10條 1000條就執行100次..
不過也就幾千條問題不大吧..
mysql insert ()()() 一秒輕松也插入一萬條啊...
幾千條資料我覺得都是瞬間的事,你不需要考慮效率..
uj5u.com熱心網友回復:
這個問題其實比較經典,不是上面幾位說的那么不堪。SQL逐次執行和批量執行,效率相差很多的(親測),比較有效的方法是(SQLServer為例):1、將資料保存到 DataTable
2、開啟事務,定義表變數
3、使用 BulkCopy 將 Datatable 的資料插入到表變數
4、使用SQL 陳述句批量處理表變數的資料
5、提交事務
這個方法比回圈逐條處理,速度會提供幾倍甚至幾十倍。
逐條處理的問題在于與資料庫互動次數太多,每次互動的開銷占了大頭。
uj5u.com熱心網友回復:
你們說的都是Insert的方案,我是考慮的Update的方案。。。
uj5u.com熱心網友回復:
原理一樣。
先批量insert到一個臨時表,
然后Merge,(或呼叫你自己寫的stored procedure)。
MERGE (Transact-SQL)參考和例子:
https://docs.microsoft.com/zh-cn/sql/t-sql/statements/merge-transact-sql
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/124766.html
標籤:C#
上一篇:layui 修改ajax請求
