标题:请教一个问题,需要比较2个表中不同的记录,表过大怎么处理呢?
取消只看楼主
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
结帖率:100%
 问题点数:0 回复次数:15 
请教一个问题,需要比较2个表中不同的记录,表过大怎么处理呢?
比较用的语句是:
SELECT * from ys1 where ALLTRIM(lxfs) NOT in  (select ALLTRIM(lxfs) from fs1 )

说明:因为ys1和fs1这2个表的数据都已经超过了26万条,处理起来非常非常慢,一晚上都比较不完,请问有什么更好的办法吗?

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

搜索更多相关主题的帖子: 过大 比较 处理 记录 不同 
2021-08-20 10:24
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用mywisdom88在2021-8-20 12:24:33的发言:


你表有多少字段,是不是电脑原因,换电脑看看,同时,只用少量字段来测试,看是不是,时间少了。

SELECT ALLTRIM(lxfs) lxfs from ys1 where lxfs NOT in  (select ALLTRIM(lxfs) lxfs from fs1 )

字段不多,一个fs表包含(lxfs,zt)两个字段,大小9M多,ys表包括(lxfs,xm,dw)三个字段,大小46M多,运行一次根本看不到进度。

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

26万条记录不算多吧,整个文件有多大?

两个表,一个9M多,一个46M多

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

分二段试试
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)   

[b]你这个方法可行,速度比我这个快太多了。查出来7条lxfs(联系方式)不同的记录,不过语句还是有点请教的地方:
dist noco 这个语句是什么意思?求教下!


[color=#000066][此贴子已经被作者于2021-8-20 19:11编辑过]


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

用数据说话

数据涉及到敏感信息,不好提供,不好意思。意思我应该表述的比较清楚了

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


你表有多少字段,是不是电脑原因,换电脑看看,同时,只用少量字段来测试,看是不是,时间少了。

SELECT ALLTRIM(lxfs) lxfs from ys1 where lxfs NOT in  (select ALLTRIM(lxfs) lxfs from fs1 )


不是电脑的问题,我电脑配置不算差,I7-8550的cpu,好像跟函数有关系,用了alltrim函数后速度大打折扣。

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

先复制一个全的,用delete in (sele ...from   )试试。或者用
SELECT ys1.*,fs1.lxfs as lxfsb from ys1 left join fs1 on ys1.lxfs=fs1.lxfs into table tb1
dele for isnull(lxfsb)

好像不能用join,join的原理有点不适合这个场景,在VFP里join出来的结果很多重复结果。

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

示例

CREATE CURSOR ys1 (lxfs C(10))
INSERT INTO ys1 VALUES ("1001")
INSERT INTO ys1 VALUES ("1002")
INSERT INTO ys1 VALUES ("1003")
INSERT INTO ys1 VALUES ("1004")
CREATE CURSOR fs1 (lxfs C(10))
INSERT INTO fs1 VALUES ("1001")
INSERT INTO fs1 VALUES ("1003")
INSERT INTO fs1 VALUES ("1005")
INSERT INTO fs1 VALUES ("1006")

SELECT ys1
INDEX on lxfs TAG tag_ys1
SELECT fs1
INDEX on lxfs TAG tag_fs1

? "ys1 NOT IN fs1"
SELECT ys1
SET RELATION TO lxfs INTO "fs1"
LIST FOR !FOUND("fs1")
SET RELATION TO

? "fs1 NOT IN ys1"
SELECT fs1
SET RELATION TO lxfs INTO "ys1"
LIST FOR !FOUND("ys1")
SET RELATION TO

谢谢你,你这个方法看起来更高阶一点。目前来看,我原来的语句语法是没有问题的,按照2楼的办法,分两段执行也就几秒钟就可以出来结果。
经过比较,主要是用了alltrim函数拖慢了速度,如果能有一条命令快速出结果的办法当然更好了。



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


喜欢VFP,就要学懂弄通!
2021-08-20 19:06
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用xuminxz在2021-8-20 16:59:30的发言:

先复制一个全的,用delete in (sele ...from   )试试。或者用
SELECT ys1.*,fs1.lxfs as lxfsb from ys1 left join fs1 on ys1.lxfs=fs1.lxfs into table tb1
dele for isnull(lxfsb)

2楼的办法可以,出结果几秒钟。

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


你表有多少字段,是不是电脑原因,换电脑看看,同时,只用少量字段来测试,看是不是,时间少了。

SELECT ALLTRIM(lxfs) lxfs from ys1 where lxfs NOT in  (select ALLTRIM(lxfs) lxfs from fs1 )


根据经验,是子句不能包含alltrim()函数,否则执行非常慢,会卡死

喜欢VFP,就要学懂弄通!
2021-08-20 20:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506585-1-1.html




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

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