ITPUB论坛-中国专业的IT技术社区

 找回密码
 注册
查看: 4883|回复: 5

一些并发度不高的数据写入应用,如下可以提高效率

[复制链接]
招聘 : 数据库管理员
认证徽章
论坛徽章:
99
技术图书徽章
日期:2014-03-27 09:30:56秀才
日期:2018-04-08 14:48:31
发表于 2018-1-12 17:55 | 显示全部楼层 |阅读模式
一些并发度不高的数据写入应用,如下可以提高效率

某系统一直存在导入数据慢的性能问题,
该系统场景: excel 数据通过应用程序,调用存储过程,写入数据库的表中,有时会存在写入要半个小时,或者1个小时,甚至 几个小时,当然数据量也很大
数据导入过程在凌晨,没有其它系统调用查询这个存储数据的表。

当前方案:
应用程序,执行如下
exec sp @p1,@p2,@p3,@p4......;exec sp @p1,@p2,@p3,@p4......;exec sp @p1,@p2,@p3,@p4......;exec sp @p1,@p2,@p3,@p4......
拼成50个字符串,发给sqlserver, 执行,然后继续读取excel,继续发,执行

修改方案
在 应用端,添加 begin transaction;
exec sp @p1,@p2,@p3,@p4......;exec sp @p1,@p2,@p3,@p4......;exec sp @p1,@p2,@p3,@p4......;exec sp @p1,@p2,@p3,@p4......
commit

执行效率会提高很多,当插入数据很大的情况下,可以提供10倍

test case:
Create table testData_insert
(id int identity(1,1),
Col1 varchar(32),
Col2 varchar(32),
Col3 varchar(32),
Col4 varchar(32),
Col5 varchar(32),
Col6 varchar(32),
Col7 varchar(32),
)
  create proc p_addData
@Col1 varchar(32),
@Col2 varchar(32),
@Col3 varchar(32),
@Col4 varchar(32),
@Col5 varchar(32),
@Col6 varchar(32),
@Col7 varchar(32)
As
Insert into testData_insert(Col1,Col2,Col3,Col4,Col5,Col6,Col7)
select @Col1,@Col2,@Col3,@Col4,@Col5,@Col6,@Col7
Go


方案1: 写入10000 条数据

declare @i int
set @i =1
while (@i < 10001)
begin
exec p_addData '11111111111','222222222222','3333333333','222222222222','3333333333','222222222222','3333333333'
set @i = @i+1

end


改进方案,写入数据10000条
begin transaction
exec p_addData '11111111111','222222222222','3333333333','222222222222','3333333333','222222222222','3333333333'
exec p_addData '11111111111','222222222222','3333333333','222222222222','3333333333','222222222222','3333333333'

.................
exec p_addData '11111111111','222222222222','3333333333','222222222222','3333333333','222222222222','3333333333'
commit

当然,这样,单个事务会占用 时间比较长,所以可能会出现死锁情况。所以 这个优化只是适合并发度不高的,有单独写入数据表时间的 系统, 程序。

欢迎大家指正。
或者在此场景下,其它更好的方案。


123.jpg
招聘 : 数据库管理员
认证徽章
论坛徽章:
99
技术图书徽章
日期:2014-03-27 09:30:56秀才
日期:2018-04-08 14:48:31
发表于 2018-1-12 17:55 | 显示全部楼层
这个优化方案,我 已写了 一个简单 C# 应用程序, 从客户端调用,到 写入数据库,进行了测试。还是不错的。

使用道具 举报

回复
认证徽章
论坛徽章:
54
秀才
日期:2017-02-22 15:18:002015年新春福章
日期:2015-03-06 11:57:31懒羊羊
日期:2015-03-04 14:48:16马上有对象
日期:2014-10-24 17:37:552014年世界杯参赛球队: 比利时
日期:2014-08-05 11:35:382014年世界杯参赛球队: 阿根廷
日期:2014-07-15 10:49:33马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11路虎
日期:2014-01-02 12:55:56ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34
发表于 2018-1-13 15:32 | 显示全部楼层
这个瓶颈应该在读取EXCEL时,而不是SQL SERVER写入时
应该先写入临时表,再从临时表插入目标表

使用道具 举报

回复
招聘 : 数据库管理员
认证徽章
论坛徽章:
99
技术图书徽章
日期:2014-03-27 09:30:56秀才
日期:2018-04-08 14:48:31
发表于 2018-1-15 09:35 | 显示全部楼层
luckyrandom 发表于 2018-1-13 15:32
这个瓶颈应该在读取EXCEL时,而不是SQL SERVER写入时
应该先写入临时表,再从临时表插入目标表

你说的这个我是没有测试这块,的确是应该考虑一下
但是可以详细说下吗,你指的 写入临时表,是指 哪步操作。

------
还有我上边的测试,就是相同数据写入,打包事务 操作,的确要快的多。你可以根据脚本,在ssms  试试的。

使用道具 举报

回复
认证徽章
论坛徽章:
9
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47技术图书徽章
日期:2017-02-09 17:05:19秀才
日期:2017-02-22 15:16:26秀才
日期:2017-02-22 15:18:00现任管理团队成员
日期:2017-06-03 02:10:11版主1段
日期:2017-06-05 09:06:08秀才
日期:2017-08-18 11:04:35秀才
日期:2017-09-18 17:02:49
发表于 2018-1-16 09:30 | 显示全部楼层
szxiaocong 发表于 2018-1-15 09:35
你说的这个我是没有测试这块,的确是应该考虑一下
但是可以详细说下吗,你指的 写入临时表,是指 哪步操 ...

如果是导入EXCEL到 数据库,为什么不用SqlBulkCopy 批量导入,其实它也是调用Bulk insert的

使用道具 举报

回复
论坛徽章:
0
发表于 2018-1-29 14:32 | 显示全部楼层
可以试试批量插入的方式

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表