Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9855
Site web

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 smile

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9855
Site web

Re: Simplifier une requête SQL

Bonjour,

ah, c'est des problèmes de performances wink

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 wink

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9855
Site web

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 smile

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

 

Pied de page des forums

Powered by FluxBB