#1 Fri 19 June 2015 11:57
- Pierre.Brochard
- Participant occasionnel
- Date d'inscription: 8 Apr 2015
- Messages: 33
Simplifier une requête SQL
Bonjour à tous,
Voici ma requête :
select DISTINCT refte1 as type_produit, to_char(prdcrdt, 'dd/MM/YYYY') as date_création, prdidentifianttechnique_, prdcodeproduit_, prdname
from product, actor, refvalues
where prdcreid = actid and
prdtypologieid_ = refid and refte1 like '%Produit Prestation%'
and prdcodeproduit_ like '49ET%' OR prdcodeproduit_ like '49EC%'
C'est uniquement la dernière ligne qui me gène,
prdcodeproduit_ like '49ET%' OR prdcodeproduit_ like '49EC%'
La requête est bonne, le problème est que je travaille sur une base très conséquente et que le résultat ne finit pas de s'afficher,
Auriez vous une idée ?
Pierre
Hors ligne
#2 Fri 19 June 2015 12:06
Re: Simplifier une requête SQL
Bonjour,
Tu souhaites limiter le nombre de ligne ? Il faut ajouter LIMIT 10 pour afficher les 10 premières lignes.
La requête est trop large en terme de filtre ? Il faut être plus précis dans ton filtre.
Sinon je n'ai pas compris
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#3 Fri 19 June 2015 12:20
- Pierre.Brochard
- Participant occasionnel
- Date d'inscription: 8 Apr 2015
- Messages: 33
Re: Simplifier une requête SQL
Oui dans le coup j'ai essayé avec Limit 10, Limit 100 mais la requête continue de tourner. Trop large peut certainement mais ça reste une énigme car . En prenant
Le gros morceau : (pas besoin de comprendre juste pour voir que c'est déja une grosse requête)
select DISTINCT refte1 as type_produit, to_char(prdcrdt, 'dd/MM/YYYY') as date_création, prdidentifianttechnique_, prdcodeproduit_, prdname
from product, actor, refvalues
where prdcreid = actid and
prdtypologieid_ = refid and refte1 like '%Produit Prestation%'
Je rajoute :
and prdcodeproduit_ like '%VGC%' ça fonctionne très bien
Mais quand j'écrie :
and prdcodeproduit_ like '%VGC%' OR prdcodeproduit_ like '%VVI%'
limit 10
à partir de là requête en cours de traitement ...............................
Hors ligne
#4 Fri 19 June 2015 12:36
- Cornet Jérémie
- Participant assidu
- Lieu: Nouméa
- Date d'inscription: 6 Apr 2008
- Messages: 229
Re: Simplifier une requête SQL
L'opérateur AND est prioritaire sur le OR comme le multiplié est prioritaire sur le + en mathématique (et en SQL du coup ;-) )
Donc ta condition actuelle est :
( prdcreid = actid and prdtypologieid_ = refid and refte1 like '%Produit Prestation%' and prdcodeproduit_ like '%VGC%' ) OR prdcodeproduit_ like '%VVI%'
Donc la jointure va te sortir un nombre monstrueux d'enregistrements
Si tu places les parenthèses pour isoler le OR, ça va passer :
Code:
prdcreid = actid and prdtypologieid_ = refid and refte1 like '%Produit Prestation%' and (prdcodeproduit_ like '%VGC%' OR prdcodeproduit_ like '%VVI%')
4
NB : ce genre de problème est une raison parmi plein d'autres d'utiliser plutôt la syntaxe JOIN pour faire des jointures :
http://sql.sh/cours/jointures
Dernière modification par Cornet Jérémie (Fri 19 June 2015 12:41)
Hors ligne
#5 Fri 19 June 2015 12:40
Re: Simplifier une requête SQL
Bonjour,
ah, c'est des problèmes de performances
Clairement les LIKE ne sont pas très performant mais tu sembles récupérer beaucoup plus de données avec la dernière (and prdcodeproduit_ like '%VGC%' OR prdcodeproduit_ like '%VVI%') et les index ne sont pas très utile ici.
Peux tu lancer un EXPLAIN (ANALYSE) sur ta requête ? Et nous remonter les infos. Attention si tu ajoutes l'option ANALYSE la requête est réellement lancée donc ca va prendre du temps.
Une piste que je proposerai serait d'utiliser le Full Text Search en créant une colonne contenant les infos à rechercher : UPDATE matable SET t_search = t_vector(colonne);
Puis la recherche : SELECT * FROM matable WHERE t_search @@ 'VGC'::tsquery;
C'est purement théorique, il est possible que ces requêtes ne fonctionnent pas
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#6 Fri 19 June 2015 13:43
- Pierre.Brochard
- Participant occasionnel
- Date d'inscription: 8 Apr 2015
- Messages: 33
Re: Simplifier une requête SQL
Bonjour Jérémie,
Je viens effectivement d'utiliser ta solution. Je te remercie, ça change tout, j'ai le résultat de ma requête instantanément. Je vois l'idée, l'exemple des signes math me parle très bien. Je ne savais pas que la position des opérateurs SQL pouvait jouer à ce point sur la gestion-performance.
Pierre
Hors ligne
#7 Fri 19 June 2015 13:48
- Pierre.Brochard
- Participant occasionnel
- Date d'inscription: 8 Apr 2015
- Messages: 33
Re: Simplifier une requête SQL
[img]C:\Users\brocharp49r\Desktop\Rapport_Explain_Requete.png[/img]
Hors ligne
#8 Fri 19 June 2015 13:56
- Pierre.Brochard
- Participant occasionnel
- Date d'inscription: 8 Apr 2015
- Messages: 33
Re: Simplifier une requête SQL
Du coup Yves, je t'envoie le rapport requête via le explain fait sur la requête qui rapporte un nombre incalculable d'enregistrement.
J'ai été étonné de voir que la commande à très vite fonctionné, tant mieux.
"HashAggregate (cost=1328.60..1328.62 rows=1 width=80)"
" -> Nested Loop (cost=0.00..1328.59 rows=1 width=80)"
" -> Nested Loop (cost=0.00..1324.73 rows=1 width=97)"
" -> Seq Scan on product (cost=0.00..243.64 rows=133 width=106)"
" Filter: (((prdcodeproduit_)::text ~~ '%VGC%'::text) OR ((prdcodeproduit_)::text ~~ 'VVI'::text))"
" -> Index Scan using refvalues_pkey on refvalues (cost=0.00..8.12 rows=1 width=25)"
" Index Cond: (refid = product.prdtypologieid_)"
" Filter: ((refte1)::text ~~ '%Produit Prestation%'::text)"
" -> Index Scan using actor_pkey on actor (cost=0.00..3.85 rows=1 width=17)"
"
Index Cond: (actid = product.prdcreid)"
C'est ce genre de chose que tu voulais voir ?
Pierre
Hors ligne
#9 Fri 19 June 2015 14:05
Re: Simplifier une requête SQL
Pierre,
Oui mais bon, j'aurai mieux fait de faire attention au sujet et j'aurai vu la réponse de Jérémie
Vivement le week-end,
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#10 Fri 19 June 2015 16:41
- Pierre.Brochard
- Participant occasionnel
- Date d'inscription: 8 Apr 2015
- Messages: 33
Re: Simplifier une requête SQL
Ok, oui on regarde pas forcément. Je comprenais pas pourquoi. Oui sa réponse m'a bien aidée c'est sûr.
Pierre
Hors ligne