Faktataulu on tähtimallin laskennallinen ydin: jokainen rivi edustaa yhtä mitattavaa tapahtumaa — myyntiä, tilausta, klikkausta tai muuta liiketoiminnan kannalta merkityksellistä tapahtumaa. Faktataulussa on luvut, dimensiossa konteksti. Yhteys dimensioihin kulkee kokonaislukumuotoisten vierasavaimien (FK) kautta yksi-moneen-relaatiolla: yhdelle dimensioriville voi löytyä tuhansia faktataulun rivejä, mutta jokaisella faktataulun rivillä on tasan yksi vastine jokaisessa dimensiossa. Tämä relaatiorakenne on edellytys sille, että Power BI:n VertiPaq-moottori pystyy pakkaamaan datan tehokkaasti ja laskemaan mittarit oikein.
Hyvin rakennettu faktataulu on pitkä ja kapea: miljoonia rivejä, mutta vähän sarakkeita. Sarakkeet jakautuvat vierasavaimiin ja mittareihin, ei mitään muuta. Kuvailevat attribuutit kuuluvat dimensioihin, ei faktatauluun.
| Osa | Rooli | Esimerkki |
|---|---|---|
| Vierasavain (FK, Foreign Key) | INT-kokonaisluku joka linkittää dimension pääavaimeen (PK). Jokaista dimensiota kohti yksi FK-sarake. Mahdollistaa suodattamisen ja ryhmittelyn dimension attribuuteilla. | AsiakasAvain, TuoteAvain, PvmAvain, MyyjaAvain |
| Additiivinen mittari (Additive Measure) | Luku jota voi summata kaikkien dimensioiden yli — tulos on oikea riippumatta siitä, miltä kantilta katsot: maittain, kuukausittain tai tuotteittain. Yksinkertaisin ja suorituskykyisin mittarityyppi. | Myyntisumma, Kappalemäärä, Kustannus |
| Semi-additiivinen mittari (Semi-Additive Measure) | Voidaan summata joidenkin dimensioiden yli, muttei kaikkien. Useimmiten aika on se dimensio, jonka yli ei voi summata — kyseessä on silloin tilannekuva eikä tapahtuma. | Varastosaldo, Tilin saldo, Avoimet tilaukset |
| Ei-additiivinen mittari (Non-Additive Measure) | Ei voi summata minkään dimension yli. Laske aina DAX-kaavalla kontekstin mukaan. Tallenna sen sijaan komponentit (osoittaja ja nimittäjä) erillisinä additiivisina mittareina. | Kateprosentti, Yksikköhinta, Konversioprosentti |
| Degeneraatioavain (DD, Degenerate Dimension) | Lähdejärjestelmän tunniste jolla ei ole omaa dimensiotaulua eikä kuvailevia attribuutteja. Säilytetään faktataulussa hakua ja debug-työtä varten. | TilausNumero, LaskuNumero, KuittiNumero |
Viisi matalan kardinaliteetin vierasavainta ja kolme additiivista mittaria — ei mitään muuta. Pääavain (PK) ja degeneraatioavaimet on jätetty tästä esimerkistä pois: molemmat ovat korkean kardinaliteetin sarakkeita (uniikki tai lähes uniikki arvo joka rivillä), jotka eivät pakkaudu VertiPaqissa. Faktataulu ei myöskään välttämättä tarvitse omaa surrogaattipääavainta — rivin yksilöi vierasavainten yhdistelmä. Jäljelle jää siis vain matalan kardinaliteetin vierasavaimia ja mittareita.
| PvmAvain (FK) | TuoteAvain (FK) | AsiakasAvain (FK) | MyymäläAvain (FK) | MyyjaAvain (FK) | Myyntisumma | Kappalemäärä | Kustannus |
|---|---|---|---|---|---|---|---|
| 20260601 | 42 | 1042 | 7 | 18 | 149,90 | 1 | 89,50 |
| 20260601 | 17 | 1042 | 7 | 18 | 29,90 | 2 | 12,40 |
| 20260602 | 42 | 2205 | 3 | 24 | 149,90 | 1 | 89,50 |
Myyntisumma, Kappalemäärä ja Kustannus ovat additiivisia — niitä voi summata minkä tahansa dimension yli ja tulos on oikein. Kateprosentti puuttuu: se ei ole additiivinen, joten se lasketaan DAX:ssä Myyntisummasta ja Kustannuksesta.
Kaikki faktataulut eivät ole samanlaisia. Kimball jakaa faktataulut kolmeen perusarkkityyppiin sen mukaan, mitä yksi rivi edustaa ja miten rivit syntyvät ja muuttuvat ajan myötä. Valitse arkkityyppi liiketoimintatarpeen mukaan, ei teknisten preferenssien. Kimball Groupin dimensionaalisen mallinnuksen tekniikkaoppaassa käydään läpi kaikki kolme tyyppiä käytännön esimerkein.
| Tyyppi | Toiminta | Rivimäärän kasvu | Käyttötilanne |
|---|---|---|---|
| Transaktio Transaction grain |
Yksi rivi per tapahtuma. Rivejä ei koskaan päivitetä — vain lisätään uusia. | Nopea: yksi rivi per tapahtuma, voi kasvaa satoihin miljooniin | Myyntirivit, tilausrivit, verkkosivuklikkaukset, maksutapahtumat |
| Kausi Periodic snapshot |
Otetaan tilannekuva säännöllisesti (päivä, viikko, kuukausi). Yksi rivi per ajanjakso per seurattava kohde. Rivejä ei päivitetä — uusi ajanjakso luo uuden rivin. | Tasainen: rivimäärä = ajanjaksojen määrä × kohteiden määrä | Kuukausivarastosaldo, viikoittainen kassaennuste, kuukausittainen asiakassaldo |
| Kumulatiivinen Accumulating snapshot |
Yksi rivi per prosessi tai elinkaari. Rivejä päivitetään prosessin edetessä. Useita päivämäärä-FK:ta eri vaiheille — viittaa "ei tiedossa" -riviin dimensiossa jos vaihe ei ole vielä tapahtunut. | Pysyy pienenä: rivi per prosessi, ei per tapahtuma | Tilauksen elinkaari (tilaus → pakkaus → lähetys → toimitus), reklamaation käsittely, rekrytointiprosessi |
Granulariteetti on faktataulun tärkein suunnittelupäätös — se määrittää sekä mitä kysymyksiä raporteissa voi esittää että kuinka nopeasti VertiPaq-moottori pystyy vastaamaan. Mitä hienompi granulariteetti, sitä enemmän rivejä — mutta Power BI:ssä rivimäärä ei ole merkittävin suorituskykytekijä. VertiPaq on sarakepohjainen tietokanta: se pakkaa datan sarake kerrallaan RLE- ja sanakirjapakkauksella, jolloin ratkaisevaa on sarakkeiden kardinaliteetti. Matala kardinaliteetti (muutama eri arvo, kuten alue tai tuotekategoria) pakkautuu tehokkaasti pitkien toistosekvenssien ansiosta; korkea kardinaliteetti (uniikki arvo jokaisella rivillä, kuten tilausnumero) ei pakkaudu. Perinteisessä rivipohjaisessa tietovarastossa rivimäärä on sen sijaan pääasiallinen suorituskykytekijä. Power BI:ssä todelliset pullonkaulat ovat DISTINCTCOUNT-laskenta, korkean kardinaliteetin sarakkeet ja RAM:n riittävyys. Mitä karkeampi granulariteetti (vähemmän yksilöiviä arvoja), sitä pienempi malli — mutta myös sitä enemmän yksityiskohtia menetät.
| Granulariteetti | Esimerkki | Rivimäärä (esim.) | Kardinaliteetti (esim.) | Suorituskyky | Käyttötilanne |
|---|---|---|---|---|---|
| Transaktiorivi | Yksi myyntirivi | 50–500 milj. | Korkea — uniikki avain joka rivillä | Nopea INT-avaimilla ja additiivisilla mittareilla — DISTINCTCOUNT ja VARCHAR-sarakkeet hidastavat enemmän kuin rivimäärä | Tarvitaan tilausnumeron tai yksittäisen asiakkaan tarkkuudella |
| Päivätaso | Myynti per tuote per päivä | 1–10 milj. | Matala — pvm × tuote toistuu | Hyvä | Ei tarvita transaktiotason hakuja — vain päivittäisiä trendejä |
| Kuukausitaso | Myynti per tuote per kk | alle 1 milj. | Hyvin matala — kk × tuote | Erinomainen | Vain kuukausi- tai kvartaalitason raportointi, ei päiväkohtaisia trendejä tarvita |
Sama myyntidata kolmella eri granulariteetilla, 3 vuoden historia, 500 tuotetta, 50 000 myyntiä per päivä:
| Granulariteetti | Rivimäärä | Korkein kardinaliteetti (esim.) | Arvioitu muistikoko | Voi hakea yksittäisen tilauksen? |
|---|---|---|---|---|
| Transaktiorivi | ~54 700 000 | ~54,7 milj. — tilausnumero uniikki joka rivillä, ei pakkaudu | ~800 MB – 2 GB | Kyllä |
| Päivätaso | ~547 500 | ~1 095 — pvm (3 v × 365); tuote 500, pakkautuu hyvin | ~10–30 MB | Ei |
| Kuukausitaso | ~18 000 | ~500 — tuote; kk vain ~36, pakkautuu erinomaisesti | ~1–3 MB | Ei |
Ratkaisu käytännössä: Jos tarvitset sekä transaktiotason yksityiskohtia (esim. tilausnumerot) että nopeat kuukausitrendit, harkitse kahta erillistä faktataulua eri granulariteeteilla — transaktiotaulu operatiiviseen käyttöön ja aggregoitu taulu johtoryhmäraportoinnille.
Kolme asiaa, jotka on tehtävä oikein ennen kaikkea muuta: