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

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

Le 20/05/2010 11:02, Stephane Bortzmeyer a écrit :
> 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 :
>

Il n'utilise pas l'index à cause du problème de locale. Il faut passer
par un index avec le varchar_pattern_ops pour régler ça.

> 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 :
>

Si un joker est en début, il n'utilisera jamais un index, quelqu'il
soit. À noter les deux excellents articles de Thomas sur le sujet :

* Utiliser un index pour les recherches sur des motifs tels que «
colonne LIKE '%chaîne' »
http://blog.postgresql.fr/index.php?post/drupal/396

* Index inversé, en C
http://blog.postgresql.fr/index.php?post/drupal/393

--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com

In response to

Responses

Browse pgsql-fr-generale by date

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