【发布时间】:2013-05-22 11:18:18
【问题描述】:
我有一个为大量区域定义的电话号码前缀列表(在由 gvcode 和 cgi 定义的查询中)。 我需要有效地找到与给定号码 PHONE_NR 匹配的最长前缀。
我在字段数字上使用倒置的 LIKE 子句(包含 +48%、+49%、+1%、+1232% 等形式的前缀)。
因此我不能在该字段上使用普通索引。
通过在 gvcode 和 cgi 字段(它们是主键的一部分(前两个列))上使用 IOT,我设法获得了实质性的改进。 我还查看了一些 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
【问题讨论】:
-
也许如果您在
substr(digits, 2, length(digits)-1)上创建一个基于函数的索引,然后将另一个条件and substr(digits, 2, length(digits)-1) <= PHONE_NR添加到查询中,您可以在某些情况下看到一些改进 -
应该是
and substr(digits, 1, length(digits)-1) <= PHONE_NR(不需要去掉'+')
标签: sql oracle algorithm string-matching