本文转载自:http://richorama.github.io/2017/11/28/sql-bulk-copy/
将数据批量插入sql Server假设在sql Server中有一个简单的表
CREATE table [dbo].test]( Value] varchar](36) NOT NulL)
…我们要在其中插入.NET应用程序中的数千个值(GuID)。
逐个天真的方法是一次插入一个,如下所示:
public voID OneByOne(){ const string sql = "INSERT INTO [Test] ([Value]) Values (@Value)"; for (var i = 0; i < count; i++) { connection.Execute(sql,new { Value = GuID.NewGuID().ToString()}); }}
(请注意,此代码使用Dapper)
在本地sql Express数据库上插入10,000条记录需要54,533毫秒,即每秒183条记录。慢:¬(
一次1000sql Server允许您在单个插入语句中插入多个记录,实际上我们一次最多可以插入1,000条。
BatchOf1000(){ foreach (var batch in Enumerable.Range(0,count).Chunk(1000)) { if (batch.Length == 0) continue; var sql = INSERT INTO [Test] ([Value]) VALUES \r\n" + string.Join(,\r\n",batch.Select(x => $('{GuID.NewGuID().ToString()}'))); connection.Execute(sql); }}
在本地sql Express数据库上插入1,000,000条记录需要22,256毫秒,即每秒44,931条记录。必须更快。
批量复制我们可以快点走吗?当然,我们可以。
sql Server(和Azure中的sql数据库)支持批量插入,您过去可能使用过bcp。
本sqlBulkcopy
类提供了从.NET方便地访问此。
Bulkcopy(){ var table = new Datatable(); table.Columns.Add(Valuetypeof(string)); ) { table.Rows.Add(GuID.NewGuID().ToString()); } using (var bulk = new sqlBulkcopy(this.connection)) { bulk.Destinationtablename = test; bulk.WritetoServer(table); }}
在本地sql Express数据库上插入1,000条记录需要9,315毫秒,即每秒107,353条记录。甚至更快。
关于sqlBulkcopy的说明上面的代码示例显示,在C#中,您必须首先创建一个Datatable
,然后将其告知目标表的架构。然后,根据值在表中的位置添加值。
这段代码对表结构的更改有些脆弱,因此另一种方法是从数据库中加载表结构,然后按名称而不是位置插入值:
Datatable(); // read the table structure from the database var adapter = new sqlDataAdapter($SELECT top 0 * FROM test.connection)) { adapter.Fill(table); }; ) { var row = table.NewRow(); row["] = GuID.NewGuID().ToString(); table.Rows.Add(row); } ; bulk.WritetoServer(table); }}
我注意到使用sqlBulkcopy
会产生少量开销,因此我不会将其用于插入少量记录(即少于100条),但是您的里程可能会有所不同。
插入愉快!
总结以上是内存溢出为你收集整理的将数据批量插入SQL Server全部内容,希望文章能够帮你解决将数据批量插入SQL Server所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)