Foxtable(狐表)用户栏目专家坐堂 → [讨论]Table复制粘贴大量数据的效率


  共有7039人关注过本帖树形打印复制链接

主题:[讨论]Table复制粘贴大量数据的效率

帅哥哟,离线,有人找我吗?
zhutangxin
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:471 积分:4042 威望:0 精华:0 注册:2016/10/14 13:40:00
[讨论]Table复制粘贴大量数据的效率  发帖心情 Post By:2022/7/18 15:54:00 [只看该作者]

需要大量数据保存至Sql Server,有二种方法,
一是从前台在相应的Table中,将数据复制粘贴进去,再保存,此方法类似Excel,用户比较容易接受。但数据量较大时(如3万行),效率太低,与Excel相差较大。
二是用Sql BulkCopy方法,编写代码,导入至数据库,此方法效率很高,局域网内部几乎可以达到1w 条/秒。此方法的劣势是需要编写代码,要求源数据的格式(特别是表头)要一致。

由于第一个方法有易用性的特点,最近想改造一下保存的代码,对新增的数据用合成Insert语句的方法进行处理,理论上可以提高前台的保存效率。
Insert into tblName (Fields list)
Values
  (1st vals list)
, (2nd vals list)
, (3rd vals list)
, ....
, (n vals list)
上述格式语句,Sql Server支持一次性插入 n<= 1000条记录,如果记录是几万条,也需分批处理。

但刚才按此思路写代码时,发现大批量粘贴数据再保存的主要效率损失可能不在保存的过程,而是在粘贴的过程。似乎Table每个单元格在接收到数据时,都会做数据验证(数据类型,对字符串型还验证长度),3w条数据(25列)从Ctrl + V开始到数据在前台完全显示出来要4分钟,而保存差不多3分钟左右。

请问,有没有方法在复制粘贴即按下CTRL + V的时候,让Table不验证数据,类似于Excel一样,直接粘贴?如果无法做到,那用合成Insert 语句的代来改善保存速度就意义不大了。
请赐教!


 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:471 积分:4042 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2022/7/18 16:00:00 [只看该作者]

补充,在粘贴的过程中CPU占用百分比很高,能达到20%,而保存的过程CPU占比约3%左右。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/7/18 16:08:00 [只看该作者]

没有办法。反正都是使用代码,为什么不使用Sql BulkCopy?Sql BulkCopy不要求表头一致,做好映射即可
[此贴子已经被作者于2022/7/18 16:08:36编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
zhutangxin
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:471 积分:4042 威望:0 精华:0 注册:2016/10/14 13:40:00
  发帖心情 Post By:2022/7/18 16:16:00 [只看该作者]

如果用前台的复制粘贴,打算写一个通用的方法,调试好了之后就不需要再写代码了。复制粘贴的灵活性会更好一些,对源数据的规范性要求要低一些,如列的次序可以通过拖动Table的列标题来实现一致,一个Excel中,如果有多个Sheet都是数据源,可以分别复制粘贴,而不需要用户先将所有的数据粘贴到一张表,再标准命名文件名,Sheet名,列名。



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111393 积分:567029 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/7/18 16:37:00 [只看该作者]

不要用使用execl的思维来使用Foxtable。我看不出来好处在哪里。粘贴的性能问题可以考虑屏蔽事件,和表达式列

不如看看:http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=105144


 回到顶部