如何高效地批量导入数据到SqlServer

如何高效地批量导入数据到SqlServer,第1张

SqlBulkCopy是个不错的选择,直接由DataTable可以导入到数据库,但要注意(1)列名与目标表一致(2)数据类型一致(3)空值容错处理,参考代码:///<summary///将<see cref="DataTable"/

的数据批量插入到数据库中。///</summary///<param name="dataTable"

要批量插入的

<see cref="DataTable"/。

</param///<param name="batchSize"

每批次写入的数据量。

</parampublicboolInsertBatchDataTable(DataTable dataTable,

stringtableName,

intbatchSize =10000){using(SqlConnection connection =newSqlConnection(myConnectionString)){try{connectionOpen();//给表名加上前后导符using(varbulk =newSqlBulkCopy(connection, SqlBulkCopyOptionsKeepIdentity,

null){DestinationTableName=tableName,

BatchSize=batchSize}){//循环所有列,为bulk添加映射//dataTableEachColumn(c = bulkColumnMappingsAdd(cColumnName, cColumnName), c = !cAutoIncrement);foreach(DataColumn dcindataTableColumns){bulkColumnMappingsAdd(dcColumnName, dcColumnName);}bulkWriteToServer(dataTable);

bulkClose();}returntrue;}catch(Exception exp){returnfalse;}finally{connectionClose();}}}

如果是数据量非常大,超过10W以上的数据,可以考虑生成dtsx文件,然后由C#代码直接调用,效率还是不错的。

1update table set a1= where id=

//in(,)中的id对应的a1值都相同

2update table set a1= where id in (,)

如果你希望不同的id对应的a1值都相同,那么两者都可用,至于效率如果in中的id个数和batch的大小相同的话,他们提交的次数也相同,然后就是数据库端的处理了,应该是addBatch要快,因为在测试id时不用再去像In一样匹配多个,具体可以自己测试一下。

batchsize和尺寸的关系,BatchSize 是批大小, 通常是用在数据库的批量 *** 作里面, 为了提高性能, 比如: BatchSize = 1000,就是每次数据库交互, 处理1000条数据。

在SpringBoot项目中,通过RBuckets接口实现批量 *** 作对个Bucket对象,示例如下:

方法介绍:

多个连续命令可以通过RBatch对象在一次网络会话请求里合并发送,这样省去了产生多个请求消耗的时间和资源。这在Redis中叫做管道。

RBatch管道功能就是REDIS的批量发送,实际上是客户端的功能,与服务端无关。相当于把多个请求的命令放在一个数据包通过TCP发送到服务端,然后客户端再一次性读取所有的命令回应。管道技术最显著的优势是提高了 redis 服务的性能。

执行batchDemo()后,控制台打印结果如下:

测试用例主要介绍了Hash,当然RBatch还支持List、Set、对象桶、队列、发布订阅等。

顺便介绍一下Redis中Map的使用场景

在集群模式下,所有的命令会按各个槽所在的节点,筛选分配到各个节点并同时发送。每个节点返回的结果将会汇总到最终的结果列表里。上述demo中用到的工具类如下:

参考:

>

在数据量越大的时候 越能体现前者的优势

因为数据库的处理速度是非常惊人的 单次吞吐量很大 执行效率极高

addBatch()把若干sql语句装载到一起,然后一次送到数据库执行,执行需要很短的时间

而pstmtexecuteUpdate() 是一条一条发往数据库执行的 时间都消耗在数据库连接的传输上面

举个例子可以帮助理解:

我这有一台超大功率的面粉加工机,前者相当于 把所有农户袋装的麦子收集起来用卡车一次送往加工厂 后者相当于农户排好队用同样的卡车一人一人的往加工厂送麦子 麦子加工5分钟完成,但是每个人到工厂就得3小时,我数据库执行效率再高也没用,时间都耗在传输的路上了!!

这就出现了数据传输的性能瓶颈 addBatch就是为解决这样的问题而产生的!

在使用Statement的批量SQL命令 *** 作的时候,一定要注意写入到内存中命令列表的SQL语句的数量级,在小规模的数据量下,可以将所有SQL语句添加到命令列表中,一次性执行executeBatch()方法,但是在大规模数据量的情况下,就应该分批将SQL语句添加到命令列表中,并在每次调用executeBatch()方法后,调用clearBatch()方法将命令列表中的SQL语句清空,注意了,一定要记得调用clearBatch()方法清空命令列表,不然即使分批添加SQL语句,一样要“out

of

memory”。同时由这个问题,我们也可以引申开来考虑考虑在编写将数据保存在内存中的 *** 作的时候,也应该注意实际系统运行环境的内存配置所能支持的数据量,千万不能不管三七二十一的将数据一股脑儿往内存里塞。

SQL 关键索引,在大表上创建索引

千万记录的表不算大,只要索引创建对了,性能可以正常提升,

还有一种就是比较偏的方式:先把需要批量的数据库插入临时表

这个可以防止频繁对表进行查询 *** 作,

SQL 如下:select into #Temp from Table

后面就只需要对临时表 *** 作,不允许主表性能。

以上就是关于如何高效地批量导入数据到SqlServer全部的内容,包括:如何高效地批量导入数据到SqlServer、批量更新的时候,当要更新的数据较多时,用addBatch 好还是where子句用in的好、batchsize和尺寸的关系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10199440.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存