簡體   English   中英

sql替代

[英]sql Like alternate

是否有其他可用的解決方案代替“喜歡匹配”開頭?

這是我的查詢,以使用like開頭。

explain analyze select * from completedcalls where call_id like 'GWYA4NvSLzoIcvA7RAtmn_a9IelwOQeH@209.44.103.3%';
                                                    QUERY PLAN                                                    
------------------------------------------------------------------------------------------------------------------
 Seq Scan on completedcalls  (cost=0.00..52659.96 rows=112 width=228) (actual time=1.541..249.857 rows=2 loops=1)
   Filter: ((call_id)::text ~~ 'GWYA4NvSLzoIcvA7RAtmn_a9IelwOQeH@209.44.103.3%'::text)
 Total runtime: 249.893 ms
(3 rows)

這非常可擴展,因為它執行順序掃描而不是索引掃描。 由於喜歡的性質,它不能在提供的列上使用索引。 列的索引很簡單,如下所示:

"i_call_id" btree (call_id)

是否有任何特殊的索引類可以幫助您提高速度,或者通過其他任何方式不使用like即可達到相同的速度?

使用的表腳本是:

              Table "public.completedcalls"
    Column     |           Type           |  Modifiers   
---------------+--------------------------+--------------
 call_id       | character varying(128)   | 
 sip_code      | integer                  | 
 duration      | integer                  | 
 setup_time    | timestamp with time zone | not null
 authname      | character varying(30)    | 
 src_sig_ip    | character varying(20)    | 
 dst_sig_ip    | character varying(20)    | 
 cld           | character varying(22)    | 
 cli           | character varying(22)    | 
Indexes:
    "i_call_id" btree (call_id)
    "i_dst_sig_ip" btree (dst_sig_ip)

文檔中描述了這種使用LIKE索引(或缺少索引)的情況:

簡而言之,您應該將索引創建為

create index i_call_id on completedcalls(call_id varchar_pattern_ops);

但是請閱讀上面鏈接的頁面以了解警告。

假設沒有前導通配符, LIKE語句仍可以與b樹索引一起使用

優化器還可以使用B樹索引進行涉及模式匹配運算符LIKE和〜的查詢,如果模式是一個常數並且錨定在字符串的開頭,例如col LIKE 'foo%'col ~ '^foo' ,而不是col LIKE '%bar'

如果未使用您的索引,則其原因不是此處顯示的LIKE用法。

雖然我不確定這是否會對性能有所幫助,但您是否研究過使用正則表達式? 您可以使用插入號^返回位於字符串開頭的記錄。

也許是這樣的:

select * 
from completedcalls 
where call_id ~ '^GWYA4NvSLzoIcvA7RAtmn_a9IelwOQeH@209.44.103.3';

LIKE可以在后跟%的條件下使用索引。

優化器可能認為完全掃描會比索引掃描更好,因為索引掃描需要對其他列和記錄可見性范圍進行額外的表查找。

從外觀上看,您可能應該將該call_id列拆分為每個組件的單獨列。 例如,您可以在示例中添加帶有索引的其他列,這些索引看起來像ID和IP地址,然后創建這些索引,然后在這些索引上進行選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM