Databases hebben veel jargon, en cardinaliteit is een van die woorden waarvan ervaren mensen geneigd zijn te vergeten dat ze die ooit niet kenden. Maar als je het niet kent – en het duurt een tijdje om echt vertrouwd te raken met cardinaliteit – is het super verwarrend als de DBA het gewoon in het midden van een zin laat vallen zonder te vertragen! Vrees niet: Ik heb je, zoals ze zeggen. Cardinaliteit betekent twee dingen in databases. Voor onze doeleinden, is het ene veel belangrijker dan het andere. Laten we eerst de eenvoudige definitie doen, en ons dan verdiepen in de definitie die van belang is voor query performance. De definitie van cardinaliteit die van belang is voor query performance is data cardinaliteit. Dit gaat over het aantal verschillende waarden in een kolom. De eerste betekenis van cardinaliteit is wanneer je de database ontwerpt – wat data modeling wordt genoemd. In die zin betekent cardinaliteit of een relatie één-op-één, veel-op-één, of veel-op-veel is. De officiële, niet-database woordenboekdefinitie van cardinaliteit is mathematisch: het aantal waarden in een set. Toegepast op databases is de betekenis een beetje anders: het is het aantal verschillende waarden in een tabelkolom, ten opzichte van het aantal rijen in de tabel. Herhaalde waarden in de kolom tellen niet mee. We praten meestal niet over cardinaliteit als een getal. Het is gebruikelijker om te spreken over “hoge” en “lage” cardinaliteit. Veel verschillende waarden is hoge cardinaliteit; veel herhaalde waarden is lage cardinaliteit. Stel je een productbeschrijvingstabel voor in een e-commerce database: De kolom ProductID
zal een hoge cardinaliteit hebben omdat het waarschijnlijk de primaire sleutel van die tabel is, dus het is volledig uniek. Als er duizend rijen in de tabel staan, zullen er duizend verschillende ProductID
waarden zijn. De Category
kolom zal veel herhaling hebben, en het zal een lage of gemiddelde cardinaliteit zijn: misschien 50 of 100 verschillende Category
waarden. Name
is waarschijnlijk een hoge cardinaliteit, tenzij er meer in deze tabel zit dan je op het eerste gezicht zou zeggen (zoals meerdere rijen voor verschillende productkleuren en andere variaties).Cardinaliteit heeft veel invloed op de performance, omdat het het query uitvoeringsplan beïnvloedt. De planner onderzoekt kolom statistieken en gebruikt deze onder andere om uit te vinden met hoeveel waarden een query waarschijnlijk zal overeenkomen. Afhankelijk van wat hij vindt, kan hij verschillende query uitvoeringsplannen gebruiken om te proberen de beste prestatie te krijgen. Maar dat is een onderwerp voor een andere blog post, omdat het wat werk kost om uit te leggen. Dus, de volgende keer dat iemand “high cardinality” in een zin laat vallen zonder te pauzeren, weet je dat ze echt “veel verschillende waarden” bedoelen. En daar heb je het!