| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1867 人关注过本帖
标题:SQL语句,where (字段值 Like %子串%) 或者 (atcc(子串, 字段值)>0),该如何 ...
只看楼主 加入收藏
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:335
注 册:2013-10-4
结帖率:100%
收藏
 问题点数:0 回复次数:24 
SQL语句,where (字段值 Like %子串%) 或者 (atcc(子串, 字段值)>0),该如何尽量地Rushmore优化呢?
比方说:
update 地址汇总表 SET 已处理 = .t. , 联系地址 = strtran(联系地址, trim(地址更新表.旧串), trim(地址更新表.新串)) from 地址更新表 WHERE 联系地址 like "%"+trim(地址更新表.旧串)+"%" .and. ! 已处理
大意是,地址定期更新时,凡带有“向阳西路”的,统一更换为“爱麦斯西路”,“明水区”的,统一更换为“高新区”。“地址更新表.dbf”中保存对应表:

旧串, 新串
"向阳西路", "爱麦斯西路"
"明水区", "高新区"
...

where条件若为like、like()或者atcc(),当数据表较大,达到10W+甚至更多记录时,运行起来会狠慢。
索引“联系地址”、“旧串”等字段,好像并不管用。
搜索更多相关主题的帖子: Like 字段 子串 where 地址 
2023-03-19 12:38
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9844
专家分:27213
注 册:2012-2-5
收藏
得分:0 
REPLACE 命令不行吗

坚守VFP最后的阵地
2023-03-19 15:31
cssnet
Rank: 5Rank: 5
等 级:职业侠客
威 望:5
帖 子:351
专家分:335
注 册:2013-10-4
收藏
得分:0 
以下是引用sdta在2023-3-19 15:31:53的发言:
REPLACE 命令不行吗


replace也根本无任何速度优势啊,一样一样的:

select B
use 地址汇总表
select A
use 地址更新表
scan
    * select A
    lcOldStr = trim(A.旧串)
    lcNewStr = trim(A.新串)
    select B
    replace 已处理 with .t. , 联系地址 with strtran(联系地址, lcOldStr, lcNewStr) for atcc(lcOldStr, 联系地址)>0 .and. ! 已处理
endscan
2023-03-19 18:50
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:708
专家分:2848
注 册:2018-3-13
收藏
得分:0 
印象中只有左/右包含可以有效利用索引,这种全包含用不上
不过,把 已处理 放在 地址 like ... 前面显然没坏处

[此贴子已经被作者于2023-3-20 10:25编辑过]


这家伙很懒,啥也没留下
2023-03-20 09:01
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
地址格式不规范有可能产生的结果。
地址应该是一个完整数据(具有唯一性),不能说A包含了XXX就是B的地址,这样就带有不确定性,这样修改的结果也有可能是不对的。
2023-03-20 09:55
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:708
专家分:2848
注 册:2018-3-13
收藏
得分:0 
区县,街道改名很常见,一个县区上千个单位,手工一个一个修改也不是不行,实际上ZF部门也是这么样做的,不然要那么些公务员干哈

这家伙很懒,啥也没留下
2023-03-20 10:16
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
不要用其中含XXX新旧对照表,最好用完整的新旧地址对照表来修改,这样一次扫描对照就可以。
2023-03-20 10:24
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
新旧地址对照表应该也是人工生成,平时及时修改地址的应该也没多少功夫,主要是根据新旧地址对照表来修改总地址数据要准确高效。
2023-03-20 10:28
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
有地址编码库就更好,数据处理只认编码,地址文本只作显示用。
2023-03-20 10:31
倦猫1973
Rank: 2
等 级:论坛游民
威 望:1
帖 子:68
专家分:28
注 册:2022-11-17
收藏
得分:0 
如果(地址更新表.旧串)这个字段的值是唯一,恐怕再无任何办法。
如果(地址更新表.旧串)这个字段的值不唯一,那将有可能 join 出来一个超级大的结果集,也许这才是 Update 慢的主要原因。
2023-03-20 18:17
快速回复:SQL语句,where (字段值 Like %子串%) 或者 (atcc(子串, 字段值)>0), ...
数据加载中...
 
   



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

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