Bonjour j'essaye d'optimiser la requete suivante
SELECT id_pres AS id, (SELECT nomrue FROM rue WHERE id_rue = idrue ) AS nomrue,LOWER(nom) AS nom, ((CASE WHEN numrue != '' THEN numrue ELSE '' END) || ' ' || (SELECT nomrue FROM rue WHERE id_rue = idrue )) AS rue , (SELECT nomoperation FROM operation WHERE id_operation = idop) AS nomoperation, ( CASE WHEN etat=2 THEN 'En cours' WHEN etat=3 THEN 'Réalisé' ELSE 'En attente' END ) AS etat, dateprestation, (SELECT nomville FROM ville WHERE id_ville = idville ) AS ville FROM prestation WHERE id_pres != 0
Mon explain me donne ceci (les tables ne contiennent pas encore beaucoup de donnees)
1 2 3 4 5 6 7 8 9 10 11
| "Seq Scan on prestation (cost=0.00..6968.50 rows=269 width=154)"
" Filter: (id_pres <> 0)"
" SubPlan"
" -> Seq Scan on ville (cost=0.00..1.04 rows=1 width=32)"
" Filter: (id_ville = $5)"
" -> Index Scan using pk_operation on operation (cost=0.00..8.27 rows=1 width=32)"
" Index Cond: (id_nontrait = $3)"
" -> Index Scan using pk_rue on rue (cost=0.00..8.27 rows=1 width=21)"
" Index Cond: (id_rue = $0)"
" -> Index Scan using pk_rue on rue (cost=0.00..8.27 rows=1 width=21)"
" Index Cond: (id_rue = $0)" |
Je me rends bien compte que je lance deux fois la meme requete
SELECT nomrue FROM rue WHERE id_rue = idrue
(vu que je recupere tout dans un datatable ca m'evitait de faire un traitement dans le code)
C'est un peu couillon de faire ca. Donc je voulais savoir si en sql c'etait possible de l'ameliorer?
Je suis bien sur preneur d'autre piste pour ameliorer ce genre de requete.
Merci
Partager