Like to match starts の代わりに使用できる他のソリューションはありますか?
これは、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)
これは、インデックス スキャンの代わりにシーケンス スキャンを行うため、非常に拡張性があります。like の性質上、提供された列にインデックスを使用することはできません。列のインデックスは次のように単純です。
"i_call_id" btree (call_id)
likeを使用せずに速度を向上させるのに役立つ特別なクラスのインデックス、または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)