In deze serie van blogposts bekijken we hoe we op een aantal eenvoudige manieren de grootte van een model kunnen beperken.
De vorige blogposts:
- Hoe kan je de grootte van een model checken?
- Verborgen datumtabellen verwijderen
- Overbodige kolommen verwijderen
De impact van dubbels in een kolom
In de vorige blogposts hebben we gezien hoe je met een aantal eenvoudige ingrepen het model al wat lichter kan maken. Een niet te onderschatten ingreep is het verwijderen van overbodige kolommen. Dit dien je te doen omdat Power BI voornamelijk kolomgericht is.
Maar soms moet je net het tegenovergestelde doen. In plaats van het aantal kolommen te verminderen kan het efficiënter zijn om een kolom te splitsen in verschillende kolommen. Dit lijkt tegenstrijdig met de vorige post, maar dat is het niet.
Laat ons nog even kijken naar het eindresultaat dat we verkregen bij de vorige post:
Toen hebben we ons vooral toegespitst op de totale grootte en hebben we minder aandacht gespendeerd aan de grootte van de individuele kolommen. In bovenstaande screenshot zie je dat het totaal van de kolommen ongeveer 16,8MB is, maar dat 1 kolom voor bijna 14MB van het totale geheugen verantwoordelijk is: SalesDate.
Om dit te begrijpen moeten we ook naar de eerste waarde in de PivotTable kijken: de cardinality of het aantal unieke waarden in die kolom. Zo zul je een correlatie zien tussen het aantal unieke waarden en de grootte van de kolom. Op de achtergrond houdt Power BI voor de meeste kolommen een tabel bij waar enkel de unieke waarden van die kolom staan. Dus hoe meer dubbels, hoe kleiner die achterliggende tabel wordt en hoe minder geheugen die kolom in beslag zal nemen.
Ook al is de naam van het veld SalesDate, het veld bevat een combinatie van datums en tijden.
Stel dat de gegevens over de laatste 10 jaar handelen, dan heb je in theorie: 10 * 365 (# dagen in jaar) * 86400 (# jaar * # dagen/jaar * # seconden/dag) verschillende waarden in deze kolom. Als deze kolom gesplitst wordt in 2 kolommen: SalesDate en SalesTime zal het feit dat er nu 2 kolommen zijn een veel kleinere impact omdat er veel minder dubbels zijn.
Daarnaast moet je je eerst de vraag stellen of de salestime wel nuttig is. Want anders zou je die kolom kunnen verwijderen. Als je de salestime toch nodig hebt, dan kan je je afvragen of je dit echt wel tot op het niveau van een seconde nodig hebt. Stel dat het volstaat om te weten of de verkoop tussen 10 en 11 of tussen 11 en 12 plaatsvond, dan heb je slechts 24 unieke waarden nodig in de kolom.
Door verschillende functionaliteiten van Power Query te gebruiken kunnen we deze gegevens splitsen en kunnen we de tijd aanpassen naar iets als 14:00-15:00. Het resultaat:
Als we nu het geheugen in Excel checken dan is het resultaat ongelofelijk. Van 16,8MB wordt de grootte van ons datamodel herleid naar net geen 4BM.
De kolom SalesID
In de vorige post hebben we het gehad over kolommen die je moet verwijderen als je ze niet nodig hebt. Toen had ik eigenlijk ook de kolom SalesID moeten verwijderen, maar ik heb die bewaard voor deze post.
Op de screenshot zie je dat de kolom SalesID een grootte heeft van 1,7MB. En dit ten opzichte van een totaal van 3,9MB. Dat is natuurlijk omdat SalesID de primaire sleutel van deze tabel is, met andere woorden, elke waarde in de kolom SalesID is uniek. Vandaar dat de kardinaliteit van deze kolom zo groot is.
Stel jezelf de vraag: “Wat is het nut van SalesID in mijn model? Heb ik die kolom nodig voor een relatie? Ga ik die kolom weergeven in mijn rapport?” Als je op deze vraag geen zinvol antwoord kan geven dan moet die kolom uit het model verwijderd worden.
Dus denk ook niet: “Die kolom kan later misschien nog handig zijn, ik laat hem in mijn model.” Bij die redenering verwijder je ook best de kolom. Hoe minder kolommen er zijn, hoe minder Power BI werk heeft en hoe sneller de gegevens vernieuwd zullen worden.”