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: Index pour requêtes de non-existence en PostgreSQL |
Date: | 2010-05-19 22:02:49 |
Message-ID: | 4BF46009.8070103@lelarge.info |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Le 19/05/2010 15:20, Stephane Bortzmeyer a écrit :
> Je suis sûr que, vue les compétences rassemblées ici, il y aura
> beaucoup de critiques sur la première partie (indexation de
> sous-chaînes avec PostgreSQL) et peut-être une solution pour la
> seconde (index pour les requêtes <>) :-)
>
> http://www.bortzmeyer.org/indexation-sous-chaine.html
>
Intéressant. Un petit ajout sur les classes d'opérateur :
Concernant la requête "SELECT person FROM PhonesPersons WHERE phone LIKE
'+33%';"
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.
Concernant la classe d'opérateur, en effet, c'est important de
l'utiliser si on n'est pas en locale C (bref tout le temps). Ze proof.
b7=# EXPLAIN SELECT person FROM PhonesPersons WHERE phone LIKE '+13%';
QUERY PLAN
------------------------------------------------------------------
Seq Scan on phonespersons (cost=0.00..18064.00 rows=99 width=4)
Filter: (phone ~~ '+13%'::text)
(2 lignes)
Il estime le résultat à 99 lignes et il fait quand même un parcours
séquentiel d'un million de lignes. Un peu overkill... Créons l'index :
b7=# create index phone2_idx
on phonespersons (phone varchar_pattern_ops);
CREATE INDEX
b7=# analyze;
ANALYZE
b7=# EXPLAIN SELECT person FROM PhonesPersons WHERE phone LIKE '+33%';
QUERY PLAN
----------------------------------------------------------------------
Seq Scan on phonespersons (cost=0.00..18064.00 rows=999901 width=4)
Filter: (phone ~~ '+33%'::text)
(2 lignes)
b7=# EXPLAIN SELECT person FROM PhonesPersons WHERE phone LIKE '+13%';
QUERY PLAN
----------------------------------------------------------------------------
Bitmap Heap Scan on phonespersons (cost=3.65..81.23 rows=99 width=4)
Filter: (phone ~~ '+13%'::text)
-> Bitmap Index Scan on phone2_idx (cost=0.00..3.62 rows=27 width=0)
Index Cond: ((phone ~>=~ '+13'::text) AND (phone ~<~ '+14'::text))
(4 lignes)
Et là, c'est bon. Question perfs aussi vu que je suis passé de 285 ms à
5 ms.
--
Guillaume.
http://www.postgresqlfr.org
http://dalibo.com
From | Date | Subject | |
---|---|---|---|
Next Message | Stephane Bortzmeyer | 2010-05-20 09:02:02 | Re: Index pour requêtes de non-existence en PostgreSQL |
Previous Message | Stephane Bortzmeyer | 2010-05-19 13:20:21 | Index pour requêtes de non-existence en PostgreSQL |