问题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编辑过]