Re: 'like' refuses to use an index??? - Mailing list pgsql-general

From Dima Tkach
Subject Re: 'like' refuses to use an index???
Date
Msg-id 3FF1FD3B.2020300@openratings.com
Whole thread Raw
In response to Re: 'like' refuses to use an index???  ("Keith C. Perry" <netadmin@vcsn.com>)
Responses Re: 'like' refuses to use an index???
List pgsql-general
Nah...
This is a different story - for teh index to be useful, the *beginning*
of your search string must be known.
So "like '00423%" and "~ '^00423'" should both work, but "like '%423'"
and "~ '00423'" both won't - it's like searching a telephone book for
somebody, whose last name ends with "erry" (as opposed to begins with
"Perr").

Dima


Keith C. Perry wrote:

>I wanted to know this too because I notice that using like with wildcards
>appears to be similar to a regular expression in that the index is not used.
>This is what I have...
>
>ethernet=# select version();
>                               version
>----------------------------------------------------------------------
> PostgreSQL 7.4 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.2.2
>(1 row)
>
>ethernet=# \d vendors
>           Table "public.vendors"
> Column  |         Type          | Modifiers
>---------+-----------------------+-----------
> header  | character(6)          |
> company | character varying(80) |
>Indexes:
>    "vender_id_idx" btree (header)
>
>
>ethernet=# explain select * from vendors where header like '000423';
>                                   QUERY PLAN
>---------------------------------------------------------------------------------
> Index Scan using vender_id_idx on vendors  (cost=0.00..113.26 rows=36 width=68)
>   Index Cond: (header = '000423'::bpchar)
>   Filter: (header ~~ '000423'::text)
>(3 rows)
>
>
>Ok, that made sense-
>
>ethernet=# explain select * from vendors where header like '%000423%';
>                        QUERY PLAN
>----------------------------------------------------------
> Seq Scan on vendors  (cost=0.00..151.15 rows=3 width=68)
>   Filter: (header ~~ '%000423%'::text)
>(2 rows)
>
>This didn't make sense until I did...
>
>ethernet=# explain select * from vendors where header like '0004%';
>                                   QUERY PLAN
>---------------------------------------------------------------------------------
> Index Scan using vender_id_idx on vendors  (cost=0.00..113.26 rows=36 width=68)
>   Index Cond: ((header >= '0004'::bpchar) AND (header < '0005'::bpchar))
>   Filter: (header ~~ '0004%'::text)
>(3 rows)
>
>which again made sense because of the header's size but both-
>
>ethernet=# explain select * from vendors where header ~* '0004';
>                        QUERY PLAN
>-----------------------------------------------------------
> Seq Scan on vendors  (cost=0.00..151.15 rows=58 width=68)
>   Filter: (header ~* '0004'::text)
>(2 rows)
>
>ethernet=# explain select * from vendors where header ~* '000423';
>                        QUERY PLAN
>----------------------------------------------------------
> Seq Scan on vendors  (cost=0.00..151.15 rows=3 width=68)
>   Filter: (header ~* '000423'::text)
>(2 rows)
>
>are sequentially scanned which means that regex's do not use indexes.  Is that
>right also?
>
>
>



pgsql-general by date:

Previous
From: "Keith C. Perry"
Date:
Subject: Re: 'like' refuses to use an index???
Next
From: Mike Nolan
Date:
Subject: Re: 'like' refuses to use an index???