PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 22/10/2010 17:29:55

dbigand
Membre

que fait l'optimiseur de requete

bon une autre question ?

explain analyse SELECT subscriberid, listid FROM email_list_subscribers WHERE listid IN (2) AND emailaddress ILIKE 'email@server.fr' AND unsubscribed=0 AND bounced=0;
                                                                             QUERY PLAN                                                                             
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using email_list_subscribers_listid_idx on email_list_subscribers  (cost=0.00..28338.91 rows=1 width=8) (actual time=1074.862..1074.862 rows=0 loops=1)
   Index Cond: (listid = 2)
   Filter: (((emailaddress)::text ~~* 'email@server.fr'::text) AND (unsubscribed = 0) AND (bounced = 0))
 Total runtime: 1074.8

comme indiqué ci-dessus on voie qu'il passe par un idex qui contient que l'id de list

mais pourtant j'ai créé un index

 CREATE INDEX opti_2_test ON email_list_subscribers USING btree (listid, lower(emailaddress), bounced, unsubscribed)  TABLESPACE "tbs_index" WHERE unsubscribed = 0 AND bounced = 0  ;

alors pourquoi il n'utilise pas cette index???

merci pour vos retours

cdlt

david

Dernière modification par dbigand (22/10/2010 18:21:42)

Hors ligne

#2 22/10/2010 17:40:29

Marc Cousin
Membre

Re : que fait l'optimiseur de requete

Aucune chance d'utiliser l'index puisque vous faites un emailaddress ILIKE 'report4CBD4F2A@mail059.serveurs-jrcg.fr'

Faites lower(emailaddress)= lower('report4CBD4F2A@mail059.serveurs-jrcg.fr'). Ça ça utilisera l'index

Par ailleurs, pas la peine de déclarer :
CREATE INDEX opti_2_test ON email_list_subscribers USING btree (listid, lower(emailaddress), bounced, unsubscribed)  TABLESPACE "tbs_index" WHERE unsubscribed = 0 AND bounced = 0  ;

CREATE INDEX opti_2_test ON email_list_subscribers USING btree (listid, lower(emailaddress))  TABLESPACE "tbs_index" WHERE unsubscribed = 0 AND bounced = 0  ;
Suffit, les colonnes de la clause WHERE n'ont pas besoin d'être dans l'index.


Marc.

Hors ligne

#3 22/10/2010 19:05:58

dbigand
Membre

Re : que fait l'optimiseur de requete

Est ce que ça marche avec un like ou c'est pareil il n'utilise pas les index ? Et est ce qu'avec un tsvector ou gin on pourrais faire quelques optimisations ?

Hors ligne

#4 22/10/2010 19:57:24

Marc Cousin
Membre

Re : que fait l'optimiseur de requete

ça marche avec un like, mais si vous n'utilisez pas de % (le caractère joker) je ne vois pas l'intérêt d'utiliser de like.

Un index sur like ne fonctionnera qu'à une condition: que la chaîne à rechercher ne commence pas par %:
like 'toto%' ou like 'to%to' pourront utiliser l'index, pas like '%toto'

Évidemment, like 'toto%' sera plus efficace que like 'to%to'

Un tsvector ne correspond pas à ce que vous voulez faire. La recherche plein texte sert à indexer des articles, les découper en lexemes (mots), etc. Ça n'es pas approprié pour rechercher des chaînes ressemblant à une adresse email.


Marc.

Hors ligne

Pied de page des forums