繁体   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