Ik heb een performance probleem dat voortkomt uit beperkingen in de syntaxis van SQL, lijkt het.
Ik hoop dat ik het goed onder woorden kan brengen.
In mijn query wil ik een subquery doen die fijner ge-grouped is dan de hoofdquery. Dat kan alleen als ik de subquery in de FROM clause zet. En dat heeft weer als gevolg dat ik alle tabellen en joins, die al in de FROM clause van de hoofdquery staan, nog een keer moet opnemen in de FROM clause van de subquery.
Dat betekent dat de query als het ware twee keer gedaan moet worden, met dus een performance verlies.
Hier is de query, als er behoefte is, kan ik wel testdata posten.
Ik gebruik PostgreSQL 8.1
Dit is natuurlijk een versimpelde weergave, nu is er geen overlap meer in de joins die ik doe. In werkelijkheid heb ik in de subquery een aantal tabellen en velden nodig, die ik in de hoofdquery al heb. Maar om het begrijpelijk te maken heb ik het gereduceerd tot waar de crux zit.
Eigenlijk zou ik dus liever dit doen, maar dat kan niet, omdat ik in de subquery group op a.i, en in de hoofdquery niet:
Heeft er iemand tips??
Ik hoop dat ik het goed onder woorden kan brengen.
In mijn query wil ik een subquery doen die fijner ge-grouped is dan de hoofdquery. Dat kan alleen als ik de subquery in de FROM clause zet. En dat heeft weer als gevolg dat ik alle tabellen en joins, die al in de FROM clause van de hoofdquery staan, nog een keer moet opnemen in de FROM clause van de subquery.
Dat betekent dat de query als het ware twee keer gedaan moet worden, met dus een performance verlies.
edit:
Ik vermoed dat het sneller is als het lukt om de subquery in de SELECT clause te krijgen, maar dan zou mijn resultaat dus verder ge-grouped moeten worden dan ik wil.
Ik vermoed dat het sneller is als het lukt om de subquery in de SELECT clause te krijgen, maar dan zou mijn resultaat dus verder ge-grouped moeten worden dan ik wil.
Hier is de query, als er behoefte is, kan ik wel testdata posten.
Ik gebruik PostgreSQL 8.1
SQL:
1
2
3
4
5
6
7
8
9
10
11
| select distinct c.naam, count(distinct a.txt), count(btjes.i) from c left outer join a on c.ia = a.i left outer join (select a.i, count(b.k) as cnt from b, a where a.i = b.i group by a.i having count(b.k) >= 3 ) as btjes on btjes.i = a.i group by c.naam order by c.naam |
Dit is natuurlijk een versimpelde weergave, nu is er geen overlap meer in de joins die ik doe. In werkelijkheid heb ik in de subquery een aantal tabellen en velden nodig, die ik in de hoofdquery al heb. Maar om het begrijpelijk te maken heb ik het gereduceerd tot waar de crux zit.
Eigenlijk zou ik dus liever dit doen, maar dat kan niet, omdat ik in de subquery group op a.i, en in de hoofdquery niet:
SQL:
1
2
3
4
5
6
7
8
9
10
11
| select distinct c.naam, count(distinct a.txt), (count(*) from (select a1.i, count(b1.k) as cnt from a1, b1 where a1.i = b1.i group by a1.i having count(b1.k) >= 3 ) as btjes from c c1 left outer join a a1 on c1.ia = a1.i left outer join b b1 on b1.i = a1.i group by c1.naam order by c1.naam |
Heeft er iemand tips??
[ Voor 32% gewijzigd door Verwijderd op 21-07-2006 08:59 ]