Altijd een beetje schimmig die titels maar ik leg 't eventjes uit hieronder.
Ik heb een view op een vrij grote tabel in Oracle 9. Hiervan moet ik per categorie een telling geven en een percentage van die categorie t.o.v. het totaal.
Op zich geen probleem voor mij.
Zonder percentageberkening loopt ie in ongeveer een halve seconde (soms ietsje meer):
Het veld CATEGORIE is overigens geen databaseveld, maar een waarde die tijdens uitvoering wordt bepaald in de view (gecategoriseerde aantal werkdagen: <20 dagen, 20-30 dagen, 30 dagen en meer).
Maar om de percentages te bepalen moet ik die view dus nogmaals aanroepen om eerst het totaal aantal records uit die view te krijgen. In het explain plan zie je dat ook terug overigens: de view wordt twee keer aangeroepen, wat de doorlooptijd verhoogt naar iets over de 1 seconde.
Ik heb wat zitten klooien met Max(ROWID) ipv TOTAALATL. Werkt wel sneller, maar die geeft vreemde getallen, dus da's ook geen optie.
Waarom dit getob? Dit is één van de (op dit moment) zes queries op die view ('t worden er nog meer). Ik kan dus kiezen tussen 3 seconden wachten voor de gebruiker en meer dan 6 seconden wachten. Dat laatste is voor mij niet meer acceptabel om de gebruikers voor te schotelen.
Is wat ik nou wil onmogelijk (dus percentageberekening doen en de view maar één keer benaderen) en moet ik me er maar bij neerleggen? Of heb ik verkeerd gezocht op internet? Want daar vind ik alleen maar SQL%ROWCOUNT (die ik volgens mij niet kan gebruiken in SQL) en de normale COUNT.
De database is niet van mij, dus daar mag ik verder ook niet teveel in rommelen...
Hopelijk is het allemaal een beetje duidelijk hier boven.
Ik heb een view op een vrij grote tabel in Oracle 9. Hiervan moet ik per categorie een telling geven en een percentage van die categorie t.o.v. het totaal.
Op zich geen probleem voor mij.
Zonder percentageberkening loopt ie in ongeveer een halve seconde (soms ietsje meer):
code:
1
2
3
| select CATEGORIE, COUNT(*) from VIEWNAAM group by CATEGORIE |
Het veld CATEGORIE is overigens geen databaseveld, maar een waarde die tijdens uitvoering wordt bepaald in de view (gecategoriseerde aantal werkdagen: <20 dagen, 20-30 dagen, 30 dagen en meer).
Maar om de percentages te bepalen moet ik die view dus nogmaals aanroepen om eerst het totaal aantal records uit die view te krijgen. In het explain plan zie je dat ook terug overigens: de view wordt twee keer aangeroepen, wat de doorlooptijd verhoogt naar iets over de 1 seconde.
code:
1
2
3
| select CATEGORIE, COUNT(*), COUNT(*)/TOTAALATL as PERCENTAGE from VIEWNAAM, (COUNT(*) as TOTAALATL from VIEWNAAM) group by CATEGORIE |
Ik heb wat zitten klooien met Max(ROWID) ipv TOTAALATL. Werkt wel sneller, maar die geeft vreemde getallen, dus da's ook geen optie.
Waarom dit getob? Dit is één van de (op dit moment) zes queries op die view ('t worden er nog meer). Ik kan dus kiezen tussen 3 seconden wachten voor de gebruiker en meer dan 6 seconden wachten. Dat laatste is voor mij niet meer acceptabel om de gebruikers voor te schotelen.
Is wat ik nou wil onmogelijk (dus percentageberekening doen en de view maar één keer benaderen) en moet ik me er maar bij neerleggen? Of heb ik verkeerd gezocht op internet? Want daar vind ik alleen maar SQL%ROWCOUNT (die ik volgens mij niet kan gebruiken in SQL) en de normale COUNT.
De database is niet van mij, dus daar mag ik verder ook niet teveel in rommelen...
Hopelijk is het allemaal een beetje duidelijk hier boven.
Vlinders moet je volgen, niet vangen...