Ik zit met het volgende probleem.
Ik heb een oracle 10g database die behoorlijk ver genormaliseerd is. Dat is in heel veel gevallen heel handig maar om op te selecteren, waarbij je van veel verschillende tabellen afhankelijk bent om de juiste data er weer uit te halen, een ramp. Zeker als je die tabellen ook weer een aantal keer met andere moet joinen om daar ook op te filteren. Met andere woorden we komen op monster query's uit die niet uitermate snel zijn.
Om dit op te lossen is er ooit een design beslissing gemaakt om de select (zoek) query op te bouwen uit verschillende brokken strings in PL/SQL en deze dan met een Execute immediate uit te voeren. Dit had als voordeel dat men dynamisch kon bepalen welke tabellen aan elkaar gejoined werden aan de hand van de ingevoerde zoekwaarden. Tot nu toe werkt dit en door af en toe aan deze constructie te sleutelen hebben we de resultaten altijd binnen toelaatbare tijd op het scherm weten te krijgen.
Echter moet deze data straks ontsloten worden via een website. Het idee is dat je begint met alle resultaten en dan steeds verder door filtert (waarbij je ook te zien krijgt hoeveel resultaten er nog over zijn) tot je uiteindelijke gewenste resultaat overblijft. Dat gaat met de huidige query niet lukken. Ten eerste is hij al te traag, maar door steeds meer criteria toe te voegen wordt hij alleen maar trager.
Nu hadden we zelf al een tweetal mogelijke oplossingen bedacht.
De eerste optie. Je doet eerst een globale zoek opdracht, stopt dit in een datastructure en gaat er dan in pl/sql overheen lopen om alle overige criteria er uit te filteren. Is een relatief snelle oplossing (we gebruiken het ergens anders ook al), maar niet als je 100-1000 concurrent gebruikers hebt, omdat je memory usage veel te groot wordt.
De andere optie die we hadden was. We joinen de altijd benodigde en meest gebruikte data aan elkaar en slaan dit plat op in een soort van cache tabel. Het probleem hierbij is dat die tabel exponentieel groeit bij elke join.
VB: De tabel waar we uit selecteren bestaat uit iets van 50.000 rijen. Gaan we echter wat belangrijke tabellen daar aan joinen dan zitten we na het toevoegen van 4 andere tabellen op een rijen count van 218miljoen en dan heb ik nog maar een klein gedeelte van de benodigde tabellen gejoined. De vraag is dan of we ons doel hiermee niet voorbij schieten. Helemaal omdat die cache ook nog eens relatief vaak/bijna realtime moet worden bijgewerkt.
Zijn hier standaard oplossingen voor? Of is dit een kwestie van trial en error tot je een gegevens set hebt die niet te groot is, maar wel de meest belangrijke informatie bevat waar je achteraf nog op gaat filteren?
Ik heb een oracle 10g database die behoorlijk ver genormaliseerd is. Dat is in heel veel gevallen heel handig maar om op te selecteren, waarbij je van veel verschillende tabellen afhankelijk bent om de juiste data er weer uit te halen, een ramp. Zeker als je die tabellen ook weer een aantal keer met andere moet joinen om daar ook op te filteren. Met andere woorden we komen op monster query's uit die niet uitermate snel zijn.
Om dit op te lossen is er ooit een design beslissing gemaakt om de select (zoek) query op te bouwen uit verschillende brokken strings in PL/SQL en deze dan met een Execute immediate uit te voeren. Dit had als voordeel dat men dynamisch kon bepalen welke tabellen aan elkaar gejoined werden aan de hand van de ingevoerde zoekwaarden. Tot nu toe werkt dit en door af en toe aan deze constructie te sleutelen hebben we de resultaten altijd binnen toelaatbare tijd op het scherm weten te krijgen.
Echter moet deze data straks ontsloten worden via een website. Het idee is dat je begint met alle resultaten en dan steeds verder door filtert (waarbij je ook te zien krijgt hoeveel resultaten er nog over zijn) tot je uiteindelijke gewenste resultaat overblijft. Dat gaat met de huidige query niet lukken. Ten eerste is hij al te traag, maar door steeds meer criteria toe te voegen wordt hij alleen maar trager.
Nu hadden we zelf al een tweetal mogelijke oplossingen bedacht.
De eerste optie. Je doet eerst een globale zoek opdracht, stopt dit in een datastructure en gaat er dan in pl/sql overheen lopen om alle overige criteria er uit te filteren. Is een relatief snelle oplossing (we gebruiken het ergens anders ook al), maar niet als je 100-1000 concurrent gebruikers hebt, omdat je memory usage veel te groot wordt.
De andere optie die we hadden was. We joinen de altijd benodigde en meest gebruikte data aan elkaar en slaan dit plat op in een soort van cache tabel. Het probleem hierbij is dat die tabel exponentieel groeit bij elke join.
VB: De tabel waar we uit selecteren bestaat uit iets van 50.000 rijen. Gaan we echter wat belangrijke tabellen daar aan joinen dan zitten we na het toevoegen van 4 andere tabellen op een rijen count van 218miljoen en dan heb ik nog maar een klein gedeelte van de benodigde tabellen gejoined. De vraag is dan of we ons doel hiermee niet voorbij schieten. Helemaal omdat die cache ook nog eens relatief vaak/bijna realtime moet worden bijgewerkt.
Zijn hier standaard oplossingen voor? Of is dit een kwestie van trial en error tot je een gegevens set hebt die niet te groot is, maar wel de meest belangrijke informatie bevat waar je achteraf nog op gaat filteren?