加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

algorithm – 在ORACLE中搜索最长前缀的最快方法

发布时间:2020-12-12 16:29:44 所属栏目:百科 来源:网络整理
导读:我有一个为大量区域定义的电话号码前缀列表(在由gvcode和cgi定义的查询中). 我需要有效地找到与给定数字PHONE_NR匹配的最长前缀. 我在字段数字上使用反向LIKE子句(其中包含48%,49%,1%,1232%等形式的前缀). 因此我不能在该字段上使用普通索引. 我通过在gv
我有一个为大量区域定义的电话号码前缀列表(在由gvcode和cgi定义的查询中).
我需要有效地找到与给定数字PHONE_NR匹配的最长前缀.

我在字段数字上使用反向LIKE子句(其中包含48%,49%,1%,1232%等形式的前缀).

因此我不能在该字段上使用普通索引.

我通过在gvcode和cgi字段上使用IOT(它们是主键的一部分(前两个cols))设法获得了实质性的改进.
我还查看了一些oracle文本索引,但找不到匹配表中较长前缀的较长输入的索引.

有没有其他方法来执行比这种方法更快的搜索.

这是一个查询,它给出了所有匹配前缀的列表(我在数字长度后对其进行排序).

select  t.gvcode,t.digits
                from NUMBERS t 
                    where 
                        t.gvcode=ZONE_SET_CODE 
                        and t.cgi=cgi_f
                       and ( PHONE_NR like t.digits)
                         order by length(digits) desc
除了“数字”索引之外,您还可以在rpad(substr(digits,1,length(digits)-1),10,’9′)上创建索引. “10”是您要支持的最大长度.您将为where子句添加一个附加条件:rpad(substr(digits,’9′)> = PHONE_NR

你的SQL将是:

select  t.gvcode,t.digits
from NUMBERS t 
    where 
        t.gvcode=ZONE_SET_CODE 
        and t.cgi=cgi_f
       and PHONE_NR like t.digits
       and substr(digits,length(digits)-1) <= PHONE_NR
       and rpad(substr(digits,'9') >= PHONE_NR
order by length(digits) desc

这是sqlfiddle中的一个例子

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读