Hallo,
Nu dacht ik dat ik er was met mijn performance probleem maar nu loop ik toch tegen iets aan. Het is bestaande code waarvan ik de performance wil/moet verbeteren.
Er werd 3 voudige Foreach geneste loop gedaan waarbij iedere keer een bepaalde query werd uitgevoerd:
<?php
Foreach($this->Jur as Jur) { //5X
Foreach($this->BX as BX) { //6X
Foreach($this->Scene as SceneName) { // 49X
// voor ieder scene wordt er uit drie tabellen data gehaald.
// Deze worden dan in een array geschreven die dan weer bij de aggregatie/totalen gebruikt worden. Het aantal records loopt uiteen van enkele honderden tot 30.000 bv per jur/bx/scene
// Aggregatie van de gegevens van de 3 queries - Dit is niet de bottleneck
// Totalen bepaald - Dit is niet de bottleneck
}
}
}
?>
$this->Jur is een array met de volgende waarden: '%', 'Jur1', 'Jur2', 'Jur3', 'Jur4'
$this->BU is een array met de volgende waarden: '%', 'BU1', 'BU2', 'BU3', 'BU4', 'BU5'
$this->Scene is een array met de volgende waarden: 'SCENE1', ......, 'SCENE49'
De query die werd uitgevoerd is deze:
<?php
AND Jur LIKE Jur
AND BU LIKE BU
AND Scene = 'discrete waarde'
?>
Nu dacht ik dit kan ik simpel oplossen. Ik neem het '%' teken niet mee en door de like's en de '=' te vervangen door 'in', dan wordt iedere mogelijke combinatie op gehaald die eerder via de foreach werd opgehaald, althans dat denk ik. Dus dit:
<?php
AND Jur in (Jur waarden array)//dit zijn alle elementen van het array met uitzondering van '%'
AND BU in (BU waarden array) //dit zijn alle elementen van het array met uitzondering van '%'
AND Scene in (Scene waarden array)
?>
Bij nader inzien realiseer ik mij dat er meer in die Foreach constructie zit!
De '%' waarde die in de array's zijn opgenomen, zijn er voor om de totalen over alles te kunnen bereken en ook nog een keer afzonderlijk per Jur resp. BU entiteiten te berekenen
Mijn vraag is:
Kan ik een query maken waarbij alle mogelijke combinatie met de wildcard '%' voor resp. JUR en BU opgehaald worden, bv. met een OR (al is dat een kostbare performance actie), waarbij ik dan de volgende combi's nog een keer kan ophalen:
JUR - BU - Scene
% - % - (Scene1,... Scene49) //Alle Scene ongeacht JUR/BU
% - BU1 - (Scene1,... Scene49) //Voor BU1 + alle Scene ongeacht JUR
% - BU2 - (Scene1,... Scene49) //Voor BU2 + alle Scene ongeacht JUR
| etc. // etc t/m Jur4
Jur1 - % - (Scene1,... Scene49) // idem maar dan voor de BU
Jur2 - % - (Scene1,... Scene49)
Dit lukt niet meer met een 'in' vanwege '%'. Om alles specifiek uit te programmeren lijkt mij niet de oplossing. Maar hoe kun je dit oplossen? Of moet je UNION gaan maken?
Ik hoop dat ik het een beetje duidelijk heb kunnen maken of dat anders mensen aanvoelen wat ik bedoel of het probleem is.
****EDIT****
Nu ik dit zo opgeschreven heb en proberen uit te leggen krijg ik het gevoel dat dit (enkel) met een Union opgelost kan worden temeer omdat ik dan ook voor Jur resp. BU zelf een naam kan geven. Ik weet alleen niet wat dit met de performance doet.
<?php
SELECT
....
AND Jur in (Jur waarden array)//dit zijn alle elementen van het array met uitzondering van '%'
AND BU in (BU waarden array) //dit zijn alle elementen van het array met uitzondering van '%'
AND Scene in (Scene waarden array)
UNION
Select 'Jur_naam' as JUR //Deze UNION is vervanger als JUR = % en BU = %
,'Bu_naam' as BU
....
AND Scene in (Scene waarden array)
UNION
Select 'Jur_naam' as JUR //Is vervanger als JUR = % maar per BU
,BU
....
AND BU in (BU waarden array) //dit zijn alle elementen van het array met uitzondering van '%'
AND Scene in (Scene waarden array)
UNION
Select Jur //Is vervanger als BU = % maar per JUR
,'Bu_naam' as BU
....
AND Jur in (Jur waarden array)//dit zijn alle elementen van het array met uitzondering van '%'
AND Scene in (Scene waarden array)
?>
Volgens mij moet ik het op deze manier oplossen, in combinatie met mijn eerdere query. Of is er een expert die een betere oplossing weet of heeft?
Bedankt,
Nico.
2.312 views