Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Postgresql et optimisation sous requetes.

4 réponses
Avatar
Etienne
Salut.

j'aimerai juste savoir que fait postgresql lors qu'un requète comme celle-ci

SELECT idobj, ... FROM table1
LEFT OUTER JOIN (SELECT idobj, count(*) FORM table2) AS tmptable ON
table1.idobj = tmptable.idobj
WHERE iduser = 150;

ma question est est ce que
SELECT idobj, count(*) FORM table2
va parcourir toute la base ou va t il réussir a limiter ses calculs aux
idobj qui sont eux meme retournés par la requete principale.

Sinon je pourrai faire un
SELECT idobj, ..., count(*) FROM table1
LEFT OUTER JOIN table2 ON table1.idobj = table2.idobj
GROUP BY idobj, ...
WHERE iduser = 150;

mais bon comme le
idobj, ... peut être treeeees treeeees long.
je me demandais si cela avait un impact au niveau des performance.

merci
Etienne

4 réponses

Avatar
Sebastien Lardiere
Le 29/06/2010 15:59, Etienne a écrit :
Salut.

j'aimerai juste savoir que fait postgresql lors qu'un requète comme
celle-ci

SELECT idobj, ... FROM table1
LEFT OUTER JOIN (SELECT idobj, count(*) FORM table2) AS tmptable ON
table1.idobj = tmptable.idobj
WHERE iduser = 150;




Il manque un group by, non ?

SELECT idobj, ...
FROM table1
LEFT OUTER JOIN
(SELECT idobj, count(*) FORM table2 group by idobj ) AS tmptable
ON table1.idobj = tmptable.idobj
WHERE iduser = 150;



ma question est est ce que
SELECT idobj, count(*) FORM table2
va parcourir toute la base ou va t il réussir a limiter ses calculs aux
idobj qui sont eux meme retournés par la requete principale.



Je ne pense pas que cette requete fonctionne, en fait.



Sinon je pourrai faire un
SELECT idobj, ..., count(*) FROM table1
LEFT OUTER JOIN table2 ON table1.idobj = table2.idobj
GROUP BY idobj, ...
WHERE iduser = 150;

mais bon comme le
idobj, ... peut être treeeees treeeees long.
je me demandais si cela avait un impact au niveau des performance.



Je ne sais pas si ça peut marcher. Par contre, l'écriture suivante
peut-être juste :

SELECT
idobj,
...,
(select count(*)
from table2
where table2.idobj = table1.idobj ) as count

FROM table1
WHERE iduser = 150
;

Pas sûr que ça soit mieux la première requête proposée.

Avec la commande EXPLAIN de PostgreSQL, il est assez facile de savoir
comment PostgreSQL interprète la requête.

--
Sébastien
Avatar
Alain Montfranc
Etienne a écrit :
Salut.

j'aimerai juste savoir que fait postgresql lors qu'un requète comme celle-ci




La commande "explain" est souvent bien utile :-D
Avatar
Etienne
Le 29/06/2010 16:09, Sebastien Lardiere a écrit :
Le 29/06/2010 15:59, Etienne a écrit :
Il manque un group by, non ?

SELECT idobj, ...
FROM table1
LEFT OUTER JOIN
(SELECT idobj, count(*) FORM table2 group by idobj ) AS tmptable
ON table1.idobj = tmptable.idobj
WHERE iduser = 150;



Oui! j'ai taper ca directement dans le message...
question de simplifier la requete qui etait un peu longue!

Je ne pense pas que cette requete fonctionne, en fait.



oui enfin avec le group by !!!

Je ne sais pas si ça peut marcher. Par contre, l'écriture suivante
peut-être juste :

SELECT
idobj,
...,
(select count(*)
from table2
where table2.idobj = table1.idobj ) as count

FROM table1
WHERE iduser = 150
;



ah ben voila super. il me semblait bien que c'etait possible. je vais
tester.

Avec la commande EXPLAIN de PostgreSQL, il est assez facile de savoir
comment PostgreSQL interprète la requête.



Merci
Etienne
Avatar
Etienne
Le 29/06/2010 17:18, Alain Montfranc a écrit :
La commande "explain" est souvent bien utile :-D



Oui pour peu qu'on arrive a y comprendre quelqueschose au explain analyze :)

Etienne