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和尺寸的关系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)