Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#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
Pages : 1