不確定MySQL,但我發現與SQL服務器迄今爲止插入的最快方式類似於@Rahautos,但將值列表分隔爲單獨的查詢。 我知道這聽起來很奇怪,但是這使得速度從每秒1200到12000次插入速度提高了10倍。 不知道有什麼區別。 交易也非常有幫助。
INSERT INTO tbl_name
(a,b,c)
VALUES
(1,2,3);
INSERT INTO tbl_name
(a,b,c);
VALUES
(4,5,6);
INSERT INTO tbl_name
(a,b,c);
VALUES
(7,8,9);
示例代碼
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var constring = (new SqlConnectionStringBuilder
{
DataSource = "someserver",
InitialCatalog = "12trunk",
IntegratedSecurity = true
}).ToString();
using (var con = new SqlConnection(constring))
{
con.Open();
using (var trans = con.BeginTransaction(isolationLevel: System.Data.IsolationLevel.ReadUncommitted) as SqlTransaction)
using (var cmd = new SqlCommand())
{
cmd.Transaction = trans;
cmd.Connection = con;
var start = DateTime.Now;
Console.WriteLine("Start = " + start);
const int inserts = 100000;
var builder = new StringBuilder();
cmd.CommandText = "delete from test";
for (int i = 0; i < inserts; i++)
{
Guid[] guids = new Guid[7];
for (int j = 0; j < 7; j++)
{
guids[j] = Guid.NewGuid();
}
var sql = $"insert into test (f0, f1, f2, f3, f4, f5, f6) values ('{guids[0]}', '{guids[1]}', '{guids[2]}','{guids[3]}', '{guids[4]}', '{guids[5]}', '{guids[6]}');\n";
builder.Append(sql);
if (i % 1000 == 0)
{
cmd.CommandText = builder.ToString();
cmd.ExecuteNonQuery();
builder.Clear();
}
}
cmd.CommandText = builder.ToString();
cmd.ExecuteNonQuery();
trans.Commit();
var ms = (DateTime.Now - start).TotalMilliseconds;
Console.WriteLine("Ms to run = " + ms);
Console.WriteLine("inserts per sec = " + inserts/(ms/1000));
Console.ReadKey();
}
}
}
}
}
確實是幫助手動啓動交易,在更新前? – Jens
@Thomas - 批量插入似乎只能在MySQL中使用外部文件,但是正確嗎? –