Foxtable(狐表)用户栏目专家坐堂 → 请教【提取表A not in 表B的行】的性能问题,表B-SQLGetComboListString后再用表A-SQLSelect (Not in) 的方法是正解吗?


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

主题:请教【提取表A not in 表B的行】的性能问题,表B-SQLGetComboListString后再用表A-SQLSelect (Not in) 的方法是正解吗?

帅哥,在线噢!
有点蓝
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110572 积分:562750 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/1/21 9:41:00 [显示全部帖子]

1、使用事务,如果不喜欢出错后一次性回滚全部,可以把上传的数据分批处理,比如一天要传1000个行,分成10次,每次100行,这100行在一个事务中,这样出错就只回滚100行。

2、如果上传后表B数据都是新增的可以考虑使用SqlBulkCopy:http://foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=91737

3、2个表都增加一个时间列,所有新增的行都记录新增时的服务器时间,表B增加一个标记列,标记是哪个客户端上传的数据。
那么客户端在上传表A数据的时候只需要上传比之前本客户端上传的数据时间晚的数据即可,无需通过“ItemID not in”查询再上传。

4、数据同步可以做到一个独立的项目中,在服务器后台定时上传,或者手工通知后上传。这样就不会存在普通操作人员认为软件假死的现象了

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110572 积分:562750 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/1/21 10:27:00 [显示全部帖子]

不同的数据源,也就只能这样子了。

或者考虑使用join,join比not in高效多了,完全不是一个级别的,数据越多效率差别越明显
1、使用存储过程,把表B,SQLGetComboListString获取的ID传入,在存储过程生成ID的临时表,然后使用join连接取数据

2、把表B,SQLGetComboListString获取的ID保存到表A数据库的一个缓存数据表中,同样使用join连接取数据,然后清空缓存数据表数据

 回到顶部
帅哥,在线噢!
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110572 积分:562750 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/1/21 10:31:00 [显示全部帖子]

其实使用事务也多不了多少代码,这种数据同步的操作应该可以批量处理的,无需逐行处理,除非还要逐个做数据加工。

作为一个开发者怕写多代码也不应该了。

 回到顶部