| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2294 人关注过本帖
标题:请教一个问题,需要比较2个表中不同的记录,表过大怎么处理呢?
取消只看楼主 加入收藏
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
收藏
得分:0 
以下是引用吹水佬在2021-8-20 20:38:17的发言:


对比测试一下,30W条记录
** 测试数据
CREATE CURSOR ys1 (lxfs C(10))
FOR i=1 TO 300000
    INSERT INTO ys1 VALUES (PADL(i,7,"0"))
ENDFOR
CREATE CURSOR fs1 (lxfs C(10))
APPEND FROM DBF("ys1")
SELECT ys1
GO TOP
REPLACE lxfs WITH "ys1_000001"
GO BOTTOM
REPLACE lxfs WITH "ys1_100000"

t = SECONDS()
SELECT ALLTRIM(lxfs) AS MY_KEY from fs1 DIST NOCO INTO TABLE TEMP_KEY
SELECT * FROM ys1 where ALLTRIM(lxfs) NOT in(SELECT MY_KEY FROM TEMP_KEY) NOWAIT   
?SECONDS()-t && 5.5s

** 去掉ALLTRIM
t = SECONDS()
SELECT lxfs AS MY_KEY from fs1 DIST NOCO INTO TABLE TEMP_KEY
SELECT * FROM ys1 where lxfs NOT in(SELECT MY_KEY FROM TEMP_KEY) NOWAIT   
?SECONDS()-t && 5.0s

t = SECONDS()
SELECT fs1
INDEX on lxfs TAG tag_fs1
SELECT ys1
SET RELATION TO lxfs INTO "fs1"
COPY TO tmp FOR !FOUND("fs1")
SET RELATION TO
?SECONDS()-t && 3.5s
SELECT * FROM tmp NOWAIT

谢谢你的专业指导!!确实不是数据量的问题,是语法有问题,where in()括号里面的子句不能包含alltrim,否则执行不下去。我不知道你用的什么数据测试的,我把对比数据脱敏了,你实测下看看。希望还有人能给出更多的方案!
对比数据.rar (2.08 MB)


[此贴子已经被作者于2021-8-20 21:21编辑过]


喜欢VFP,就要学懂弄通!
2021-08-20 21:01
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
收藏
得分:0 
以下是引用sdta在2021-8-20 13:09:35的发言:

用数据说话

数据已上传,已脱敏,可以试试看。

对比数据.rar (2.08 MB)

喜欢VFP,就要学懂弄通!
2021-08-20 21:03
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
收藏
得分:0 
以下是引用吹水佬在2021-8-20 21:07:01的发言:

应该是一句快点
SELECT * from ys1 WHERE lxfs NOT in (select lxfs from fs1 )

如果没有空格、制表符等特殊字符的时候,这样执行是最好的,但实际上可能会不准。
我刚才执行语句“SELECT * from fs where ALLTRIM(lxfs) NOT in  (SELECT lxfs from ys )”
发现个奇葩的现象,where lxfs 这里加了alltrim函数和不加这个函数,比较出来的结果居然差了一个记录,这个差的记录就是一个有+86,一个没有,不知道是怎么回事,没搞懂VFP里面where in语句是怎么个运行原理。贴图如下:

图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2021-8-20 21:41编辑过]


喜欢VFP,就要学懂弄通!
2021-08-20 21:25
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
收藏
得分:0 
以下是引用吹水佬在2021-8-20 21:44:34的发言:

如果只求有效的数据,肯定要先清理无效的数据。
制表符也有,数据是从其他地方批量导入的吧,最好在数据导入时就严格处理好。
有或无ALLTRIM结果可能不一样,看看有差别的数据记录有什么异常。

请问下VF里的  字段lxfs where in ()语句中,lxfs的值与in()里面lxfs的值对比的时候是精确对比还是包含关系对比?我感觉像是包含关系一样的。

喜欢VFP,就要学懂弄通!
2021-08-20 22:35
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
收藏
得分:0 
以下是引用sdta在2021-8-20 22:03:26的发言:

有ALLTRIM()函数,速度肯定慢,模拟数据与真实数据还是有差别的,字段数的多少及记录数的多少对时间都是有影响的。

是的,要考虑的因素确实还挺多的,以前少量数据不觉得。
另外请问下VF里的  字段lxfs where in ()语句中,lxfs的值与in()里面lxfs的值对比的时候是精确对比还是包含关系对比?我感觉像是包含关系一样的。

喜欢VFP,就要学懂弄通!
2021-08-20 22:36
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
收藏
得分:0 
以下是引用吹水佬在2021-8-20 22:57:01的发言:

可以随便找几个数据试一下就清楚

测试了一晚上,好像不是包含关系,但加函数和不加函数结果还是有差别,但是这个差别我没弄明白,单独开了个帖子,邀请你去探讨下,谢谢!!
帖子地址:https://bbs.bccn.net/thread-506598-1-1.html

喜欢VFP,就要学懂弄通!
2021-08-21 12:57
快速回复:请教一个问题,需要比较2个表中不同的记录,表过大怎么处理呢?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036416 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved