我有一個爲大量區域定義的電話號碼前綴列表(在gvcode和cgi中定義的查詢中)。 我需要有效地找到匹配給定號碼PHONE_NR的最長前綴。在ORACLE中搜索最長前綴的最快方法
我對字段數字(包含表單+ 48%,+ 49%,+ 1%,+ 1232%等等)中的前綴使用反向的LIKE子句。
因此我無法在該字段上使用正常的索引。
我設法通過在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)'上創建一個基於函數的索引,然後在查詢where子句中添加另一個條件'substr(digits,2,length(digits)-1 )<= PHONE_NR'你可以在某些情況下看到一些改進 –
應該是'和substr(數字,1,長度(數字)-1)<= PHONE_NR'(不需要刪除'+') –