Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-fr-generale by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group