1

Onderwerp: SQL - welke optie zou sneller zijn.

Tijdens de migratie van boekhoudprogje van pc naar nas, kwam ik achter dat jaaroverzicht heel langzaam was.
Van 0,05 seconde naar 18 seconden.
Nu heb ik de fout snel kunnen achterhalen door een kolom te indexeren maar vooral een outer join weg te doen. Het ging om een query bestaande uit drie joins waabij vergeten was te indexeren. Een outer join werkt met tijdelijke tabellen en versnelt wanneer een foreign key is of een index. De pagina zit nu op 1,2 seconden. Dit moet sneller kunnen. Alleen vraag ik me af welke weg beter is om in te gaan.

In plaats van data uit drie tabellen te halen. Eerst uit een tabel data klaarleggen en daarmee verder werken. De NAS heeft nietzo veel resources als mijn pc qua werkgeheugen.

Ik heb drie tabellen die van belang zijn nu.
Afschrfiten, categorie en balans

Categorie heeft kolom categorie en naam. [pk] op beide kolommen.
Afschrift heeft pk op dagid en datum en en naam is geindexeerd en uiteraard bedrag
Overige kolommen zij  niet van belang zoals omschrijving e.d..
Balans heeft [pk] categorie en vier kolommen uitgaven, inkomen, vast en variabel.
Er lopen wat foreign keys in de database. Die zijn verder niet van belang.

Een categorie kan of inkomen of uitgaven zijn of vast of variabel.
Dit houdt in dat wanneer een categorie een bedrag heeft dat niet bij zich past gelijk het tegenovergesteld wordt.
Hypotheek is vast en uitgaven. Krijg ik geld terug dan wordt dit bedrag gelijk inkomen -> onvoorzien.

Nu komt het.

Ik maak een jaaroverzicht waarin de sommen van de bedragen worden weergegeven per categorie in de volgende opties.
Uitgaven vast, uitgaven variabel, inkomen vast en inkomen variabel.
Hiervoor zat ik aan twee opties te denken.


Overzicht is vrij simpel.
12 kolommen voor de 12 maanden.
Categorien zijn ingedeeld in de rijen.

////////////Maanden -->
Categorie
  |
  |
  |

Bij beiden kan ik een lijst maken van in- uitgaven. Deze is sowieso nodig om de 1e kolom te vullen. Welke categorien hebben een bedragactiviteit en vallen onder welke lijst? Auto had ik niet in 2011 en komt niet voor. Maar in 2015 wel onder optie Uitgaven variabel. 2011 niet zichtbaar en 2015 wel.

Lijst 1: categorieen inkomen en vast met bedrag >= 0
Lijst 2: categorieen inkomen en variabel met bedrag >= 0
Lijst 3: categorieen uitgaven en vast met bedrag < 0
Lijst 4: categorieen uitgaven en variabel met bedrag < 0

Optie 1: Per categorie uit de lijst data halen per maand het totaal bedrag.
Optie 2: Per maand een lijst opahalen van de sommen per categorie.

Optie 1: onbekend aantal maar kleinere querys qua resources. Ik haal voor een categorie op, dus een kleine buffer van namen. Plus ik zal iets moeten doen om in een query per maand een som te maken. Dat lijkt met voor een database intensief.
Optie 2: 12x4 = maximaal 48 querys. Ik haal voor meerdere categorien op, dus veel tijdelijke tabellen voor MariaDB.

Bij optie 1: zal ik in PHP meer geheugen gebruiken omdat <TABLE> element per rij gaat. De data bevat inhoud voor een kolom. Nu is dit te overzien. Laat de tabel in totaal 200 getallen hebben.
Bij optie 2: kan ik per rij gelijk een rij legen. Maar ik zal een query moeten maken die per maand een som terug levert.

Persoonlijk denk ik dat optie 1 ga. Geheugengebruik mij PHP is minimaal. Het scheelt MariaDB bij haar query om in een categorie in een tabel te groeperen op datum. Mijn gevoel is dat deze query best intensief kan zijn.
Niet onbelangrijk. Ik kan de code meer ongewijzigd laten. Voor een hobbyprojectje niet onbelangrijk.

Ik twijfel. Maar krijg geen vinger echt achter waarom.
Wat ik wel weet is dat MariaDB op een NAS echt moeite heeft met JOIN's en andere opdrachten met tijdelijke tabellen. Wat op zich niet gek is.

IF not THEN toch