Momenteel ben ik bezig een postgresql query te optimaliseren die vrij lang draait. Naar nader onderzoek blijkt dat de query vooral CPU bound-is. Nu wordt er gedraait op een dual-core quad bak zodat er in het totaal 8 cores zijn.
Echter, postgresql (ik gebruik 8.1) gebruikt voor een enkele query nooit meer dan 1 core. Na wat rondgezocht te hebben lijkt het dat dit bij bijna elke DBMS het geval is. Nu wil echter het overbekende feit dat een enkele core de komende tijd niet bijster veel sneller meer gaat worden. Alle grote processor fabrikanten gaan vooral inzetten op massive multiple core designs.
Nu kan ik natuurlijk gaan proberen handmatig te gaan paralleliseren. In mijn specificieke query komt het eigenlijk neer op een sum en wat delingen over een kleine miljard rijen. Ik zou dus 2 queries naar de DB kunnen sturen met in de ene iets in de trend van "where key < (max_key/2)" en in de andere "where key >= (max_key/2). De resultaten zou ik dan weer gewoon in Java samen kunnen voegen.
De bovengenoemde aanpak zit me echter toch niet lekker. Ten eerste moet ik alle berekeningen in Java code gaan herhalen. Dit is een maintenance issue omdat dan bij aanpassing van de sql de java code gelijk mee moet veranderen en andersom. Ten tweede moet ik voor de join eigenlijk de 'group by' clause functionaliteit van een DBMS gaan herschrijven EN onderhouden, iets wat ik opzich wel wil doen ware het niet dat de DB dit al precies kan en waarschijnlijk veel beter.
Een andere mogelijkheid is om de resultaten van de aparte queries in een view 'op te slaan' op deze een union te doen, en daar weer de originele query (zonder de extra where clause) op de draaien. Hierba moet ik wel telkens unieke view namen genereren, de table namen voor de join query dynamisch inserten, en de views weer verwijderen na afloop.
Effin, veel gedoe allemaal en ik vraag me dan af of er eigenlijk niet meer mensen zijn die tegen dit probleem zijn opgelopen en hoe die dit opgelost hebben.
Echter, postgresql (ik gebruik 8.1) gebruikt voor een enkele query nooit meer dan 1 core. Na wat rondgezocht te hebben lijkt het dat dit bij bijna elke DBMS het geval is. Nu wil echter het overbekende feit dat een enkele core de komende tijd niet bijster veel sneller meer gaat worden. Alle grote processor fabrikanten gaan vooral inzetten op massive multiple core designs.
Nu kan ik natuurlijk gaan proberen handmatig te gaan paralleliseren. In mijn specificieke query komt het eigenlijk neer op een sum en wat delingen over een kleine miljard rijen. Ik zou dus 2 queries naar de DB kunnen sturen met in de ene iets in de trend van "where key < (max_key/2)" en in de andere "where key >= (max_key/2). De resultaten zou ik dan weer gewoon in Java samen kunnen voegen.
De bovengenoemde aanpak zit me echter toch niet lekker. Ten eerste moet ik alle berekeningen in Java code gaan herhalen. Dit is een maintenance issue omdat dan bij aanpassing van de sql de java code gelijk mee moet veranderen en andersom. Ten tweede moet ik voor de join eigenlijk de 'group by' clause functionaliteit van een DBMS gaan herschrijven EN onderhouden, iets wat ik opzich wel wil doen ware het niet dat de DB dit al precies kan en waarschijnlijk veel beter.
Een andere mogelijkheid is om de resultaten van de aparte queries in een view 'op te slaan' op deze een union te doen, en daar weer de originele query (zonder de extra where clause) op de draaien. Hierba moet ik wel telkens unieke view namen genereren, de table namen voor de join query dynamisch inserten, en de views weer verwijderen na afloop.
Effin, veel gedoe allemaal en ik vraag me dan af of er eigenlijk niet meer mensen zijn die tegen dit probleem zijn opgelopen en hoe die dit opgelost hebben.