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


  共有2026人关注过本帖平板打印复制链接

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

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


加好友 发短信
等级:二尾狐 帖子:388 积分:5098 威望:0 精华:0 注册:2013/11/2 0:01:00
请教【提取表A not in 表B的行】的性能问题,表B-SQLGetComboListString后再用表A-SQLSelect (Not in) 的方法是正解吗?  发帖心情 Post By:2017/1/21 9:15:00 [只看该作者]

问题1:我有表A和表B 2个商品档案表。我现在需要找出表A不在表B的行。我用的方法是

 

Dim s As String = DataTables("表B").SQLGetComboListString("ItemID")
s= "('" & s.Replace("|","','") & "')"


Dim drs As List(of DataRow)  = DataTables("表A").SQLSelect("ItemID not in " & s )

 

但是我在想,如果我将来表B的行很多,那这个 s就会很长很大,好像性能会非常差。

 

我记得sql语言里,有个一个表join另外一个表然后not in的方法,但好像这个需要2个表全部行都做内连接,好像性能也不高哪里去。

这里使用Replace做成的数据字符串,如果我用SqlGetValues的方法后配合一个For each 做成数据字符串,这个性能高吗?

 

请问大家有什么【提取表A not in 表B的行】正确方法?

 

附:我的表B是在国外服务器数据库上,网速慢,我的表A 是本地SQL,所以我得尽可能减少提取表B的要消耗的数据传输。

 

----------------------------------

问题2:假如我的表B是一个国外服务器的总部库存流水表,表A是个本地库存流水表,每天表A需要上传自己的库存流水追加到总部的表B里。

 

①采用表A not in 表B的行都上传,哪怕这次网路不稳定传漏了,下次再传也会补上,这样就绝对可以保证不会有漏了的行。但是性能呢?流水表是一个1个月后就会膨胀很厉害的东西。

 

②采用表A增加一个逻辑字段,标记是否已经上传,传了的就设置为true。传的时候,只判断这个逻辑是否为false,是false就传。

但是有问题,如果我传输时网络出问题,这个行在总部没有新建,但是本地就认为已经传了,设置为true了,这样它下次也不会回传给总部,总部的库存就不一致。(这一般很少发生,从代码执行的顺序来说,这个情况理论上不存在,毕竟是先总部新建行,保存成功,本地行才会设置为true,并保存)

又或者总部已经新建了,但是本地刚好死机,认为还没有传,下次又再传,造成流水重复,这个问题容易发生,例如一天要传1000个行,肯定要个20秒左右,毕竟国外服务器,20秒内突然断电或者有人脑残以为软件死了强制关闭了软件,这都是有可能的。(可能有的人会叫我传的时候先检测有总部有没这个流水号,那实际上已经跟①的方法一样,而且每一行的上传都SqlFind遍历了一次总部的流水表,性能更加差)

 

大家对流水表上传,有啥看法?

 

其实我不需要性能最优化最强的,只是想要一个比较适中妥当,数据架构简单可靠的。

 

[此贴子已经被作者于2017/1/21 9:27:34编辑过]

 回到顶部