Re: Index pour requêtes de non-existence en PostgreSQL

From: Stephane Bortzmeyer <bortzmeyer(at)nic(dot)fr>
To: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Index pour requêtes de non-existence en PostgreSQL
Date: 2010-05-20 09:02:02
Message-ID: 20100520090202.GB31420@sources.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

On Thu, May 20, 2010 at 12:02:49AM +0200,
Guillaume Lelarge <guillaume(at)lelarge(dot)info> wrote
a message of 60 lines which said:

> Elle ne passe pas par l'index car le planificateur estime qu'il va
> récupérer 800153 lignes sur une table d'un million de lignes (ie
> 80%). Dans ce cas, il serait plus coûteux d'utiliser l'index.

C'est un problème fréquent lorsqu'on veut tester si une requête peut
utiliser un index (le SGBD peut l'utiliser mais ne le veut pas car il
estime que cela ne serait pas rentable) mais, ici, ce n'est pas la
raison, car cela ne marche pas non plus pour des valeurs plus rares :

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE phone LIKE '+33%';
QUERY PLAN
----------------------------------------------------------------------
Seq Scan on phonespersons (cost=0.00..18064.00 rows=800420 width=4)
Filter: (phone ~~ '+33%'::text)
(2 rows)

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE phone LIKE '+34%';
QUERY PLAN
-------------------------------------------------------------------
Seq Scan on phonespersons (cost=0.00..18064.00 rows=163 width=4)
Filter: (phone ~~ '+34%'::text)
(2 rows)

> b7=# create index phone2_idx
> on phonespersons (phone varchar_pattern_ops);

Oui, avec cela, ça marche, merci. Par contre, l'utilisation de ce
second index semble dépendre de si la requête a un joker % au début ou
à la fin :

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE phone LIKE '+34%';
QUERY PLAN
----------------------------------------------------------------------------
Bitmap Heap Scan on phonespersons (cost=6.06..569.94 rows=163 width=4)
Filter: (phone ~~ '+34%'::text)
-> Bitmap Index Scan on phone2_idx (cost=0.00..6.02 rows=163 width=0)
Index Cond: ((phone ~>=~ '+34'::text) AND (phone ~<~ '+35'::text))
(4 rows)

essais=> EXPLAIN SELECT person FROM PhonesPersons WHERE phone LIKE '%6556676';
QUERY PLAN
------------------------------------------------------------------
Seq Scan on phonespersons (cost=0.00..18064.00 rows=13 width=4)
Filter: (phone ~~ '%6556676'::text)
(2 rows)

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Christophe Garault 2010-05-20 09:15:45 Re: Re: Index pour requêtes de non-existence en PostgreSQL
Previous Message Guillaume Lelarge 2010-05-19 22:02:49 Re: Index pour requêtes de non-existence en PostgreSQL