Tietovarastot ja SQL Virpi Myllylahti Helsingissä 15. maaliskuuta 2003 Relaatiokannat nyt seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
Sisällysluettelo 1 JOHDANTO... 2 2 SQL JA TIETOVARASTOT... 2 2.1 SQL... 2 2.2 TIETOVARASTOT... 3 2.3 SQL99 JA TIETOVARASTOT... 3 3 GROUP BY -LAAJENNUS SQL3:SSA... 4 3.1 GROUP BY... 4 3.2 GROUP BY GROUPING SETS... 5 3.3 GROUP BY ROLLUP... 6 3.4 GROUP BY CUBE... 8 4 YHTEENVETO... 10 5 LÄHTEET... 11 1
1 Johdanto Tietovarastot on voimakkaasti kasvava sovellusalue. Suuria tietovarastoja käytetään valtavan tietojoukon keräämiseen, tehokkaisiin kyselyihin, tietojen analysointiin ja raportointiin. Tietovarastot toimivat päätöksenteko- ja johtamisprosessin tukena. Tässä työssä käsittelen vuoden 1999 SQL3-standardin laajennuksia, jotka mahdollistavat tietovarastotoimintojen toteuttamisen SQL:llä. Luvussa 2 esittelen ensin lyhyesti aiheeni kannalta keskeiset käsitteet ja problematiikan. Kappaleessa 3 esittelen SQL3-standardin tarjoamat laajennukset GROUP BY-ryhmittelymääreeseen. GROUPING SETS -määrettä käytetään tulosjoukon ryhmittelyyn usean ryhmittelytekijän suhteen. ROLLUP-määreellä (suom. karkeistus) poraudutaan kyselyn tulosjoukkoon ja muodostetaan välisummauksia tulosjoukon riveistä. CUBE määreellä saadaan aikaan moniuloitteisia tulosjoukkoja. 2 SQL ja tietovarastot 2.1 SQL SQL (Structured Query Language) on IBM:n tutkimuskeskuksen kehittämä relaatiotietokantojen käsittelyyn kehitetty kyselykieli, jonka ensimmäinen standardi (SQL-86 tai SQL1) on vuodelta 1986. Standardia on kehitetty ja laajennettu ensin vuonna 1992 (SQL-92 tai SQL2) ja viimeksi vuonna 1999 (SQL-99 tai SQL3) [ElmNa]. SQL3- standardiin lisättiin vuonna 1999 mm. oliopiirteitä, joita on tarkemmin käsitelty Relaatiokannat nyt seminaarin muissa seminaaritöissä. Tässä työssä käytän vuoden 1999 SQL-standardista nimeä SQL3. SQL on tietokantakieli, jolla luodaan ja muokataan objekteja (esimerkiksi taulut, indeksit ja funktiot) sekä kysellään ja päivitetään (insert, delete, update) kannassa olevaa tietoa. SQL-kieli sisältää myös tietokannan näkymien, tietokannan käyttöoikeuksien ja viiteeheyksien määrittelyn ja transaktion hallinnan [ElmNa]. SQL:ssä ei ole tietovarastoissa tarvittavia raportointiominaisuuksia. 2
2.2 Tietovarastot Tietovarasto (a data warehouse) on yksi, täydellinen ja yhdenmukainen tiedon varastointipaikka. Tietovarastoon ladataan tietoa erilaisista lähteistä ja erilaisilta alustoilta. Talletettava tieto voi olla hyvin monenmuotoista. Tietovaraston tarkoituksena on, että peruskäyttäjät ymmärtävät tietovarastoon kerätyn tiedon helposti ja voivat käyttää tietoja perusliiketoiminnassa hyödyksi monella eri tavalla [Devlin]. Tietovarastona olevaa tietoa ei yleensä päivitetä, vaan sinne talletetaan jatkuvasti uutta tietoa. Talletettua tietoa säilytetään tietty aika, jonka jälkeen tiedot siirretään esimerkiksi nauhalle tai toiseen järjestelmään tai tiedot tuhotaan. Koska tietoja säilytetään usein tietovarastoissa pitkiäkin aikoja, tietovaraston koko kasvaa helposti hyvin suureksi [ElmNa]. Tietovarastoa käytetään talletetun tiedon analysointiin, raportointiin ja muokkaamiseen. Tietoa jalostetaan tekemällä tiedosta erilaisia summauksia ja poimintoja. Analyyseja ja raportteja käytetään erityisesti pätöksenteko- ja johtamisprosessin tukeminen. Tietovarastomarkkinat ovat kasvaneet voimakkaasti 1990-luvun loppupuolelta lähtien. Talletettujen tietojen määrä on kasvanut valtavasti sekä analysointivälineet että tekniikat ovat kehittyneet. Kaupalliset sovellukset ovat tarjonneet erilaisia välineitä yritysten tietovarastointitarpeisiin ja sekä SQL-standardia että relaatiotietokantoja on kehitetty vastaavasti [ElmNa]. 2.3 SQL99 ja tietovarastot SQL on kehitetty erityisesti kyselytarpeita varten, eikä kieli sisällä tietovarastojen analysointi- ja raportointitarpeita vastaavia toimintoja. SQL ei sovellu esimerkiksi tietojen muokkaukseen tai yhdistelyyn eikä suurien tietomäärien tehokkaaseen kyselyyn [Devlin]. SQL:llä ei ole mahdollista käsitellä kannassa olevaa tietoa moniulotteisesti eikä kyseltyyn tietoon voida porautua. Monet tietovarastotoiminnoissa käytetyt monimutkaiset kyselyt on vaikeita toteuttaa tehokkaasti SQL:llä. 3
SQL3-versiossa SQL:ää kehitettiin tietojen analysointiin ja summauksiin paremmin soveltuvaksi. SQL:n tietojen ryhmittelyyn käytettyä GROUP BY-lauseketta laajennettiin GROUPING SETS-, ROLLUP- ja CUBE-määreillä. Uusilla määreillä voidaan toteuttaa porautuvia raportteja, histogrammeja, välisummien (sub totals) ja loppusummien (grand total) laskemista sekä ristiinviittauksia (gross tabulation) [GRAY, 34]. Käsittelen GROUP BY - toimintoa laajennuksineen seuraavassa luvussa. 3 GROUP BY -laajennus SQL3:ssa 3.1 GROUP BY SQL-standardissa on viisi summausfunktiota (an aggregate function), joita käytetään kyselyssä tulosjoukon rivien muodostamiseen: COUNT(): palauttaa lukumäärän SUM(): palauttaa summa-arvon MIN(): palauttaa pienimmän arvon MAX():palauttaa suurimman arvon AVG(): palauttaa keskiarvon Kannasta kyseltyä tietoa halutaan usein ryhmitellä eri tavoilla. Summausfunktioiden lisäksi kyselyssä käytetään tällöin ryhmittelyattribuutteja, joilla tulosjoukon rivejä jaetaan ali-ryhmiin. Ryhmittelyattribuuteilla voidaan esimerkiksi kysellä yrityksen työntekijöiden keskipalkkaa osastoittain tai tietyn tavaran myynnin kehitystä kuukausittain. [ElmNa] GROUP BY on SQL-standardissa käytetty ryhmittelymääre, jolla kyselyssä ryhmitellään tulosjoukkoa taulun sarakkeiden suhteen. GROUP BY-määreen ryhmittelyattribuuttien on esiinnyttävä myös lauseen SELECT-osassa [ElmNa]. GROUP BY määreen sisältämän SQL-kyselyn syntaksi on seuraava: SELECT Column1, Column2, SUM (Column1, Column2) FROM Table GROUP BY Column1, Column2; 4
Käytän tässä työssä esimerkkinä Asukkaat-taulua, jossa on sarakkeet: Sotu, Sukupuoli, Nimi, Postinumero, Kaupunki ja Lääni. Kyselyn, jossa ryhmittelytekijänä on lääni- ja kaupunki sarakkeet, saadaan seuraava tulos: SELECT lääni, kaupunki, COUNT (*) FROM Asukkaat GROUP BY lääni, kaupunki; LÄÄNI KAUPUNKI COUNT(*) Pirkanmaa Tampere 2 TuPo Märynummi 1 TuPo Turku 1 Uusimaa Helsinki 4 Uusimaa Kauniainen 1 Kyselyn tuloksena saadaan joukko, jossa uniikit tietorivit on ryhmitelty ensin ensimmäisen ryhmittelytekijän (lääni) ja sitten toisen ryhmittelytekijän (kaupunki) mukaan. 3.2 GROUP BY GROUPING SETS SQL3:ssa GROUP BY-määrettä laajennettiin GROUPING SETS lisämääreellä, jolla tulosjoukkoa voidaan ryhmitellä usealla ryhmittelymääreellä yhdessä SQL-lauseessa. GROUP BY GROUPING SETS lauseen syntaksi on seuraava: SELECT Column1, Column2, SUM (Column3) FROM Table GROUP BY GROUPING SETS (Column1, Column2) Käyttämästäni Asukkaat-taulusta saadaan GROUPING SETS - lisämääreellä tehdyn kyselyn tuloksena on tulosjoukko, joka on ryhmitelty useiden eri joukkojen mukaan. Ensin tulosjoukon tiedot ryhmitellään (lääni, kaupunki)-tekijän, sitten läänin ja viimeiseksi kaupungin mukaan. 5
SELECT lääni, kaupunki, COUNT (*) FROM Asukkaat GROUP BY GROUPING SETS ((lääni, kaupunki), lääni, kaupunki); LÄÄNI KAUPUNKI COUNT(*) Pirkanmaa Tampere 2 TuPo Märynummi 1 TuPo Turku 1 Uusimaa Helsinki 4 Uusimaa Kauniainen 1 Pirkanmaa 2 TuPo 2 Uusimaa 5 Helsinki 4 Kauniainen 1 Märynummi 1 Tampere 2 Turku 1 Ryhmittelytekijä (lääni, kaupunki) tuo tässä tapauksessa GROUP BY lääni, kaupunki lausetta vastaavan tuloksen ryhmiteltynä tulosjoukon alkuun. Seuraavaksi tulosjoukko ryhmitellään lääni-tekijän ja viimeiseksi kaupunki-ryhmittelytekijän mukaan. Lääniryhmittelytekijä summaa (COUNT) yhteen kaikki rivit, joissa lääni-sarakkeessa on sama arvo ja kuapunki-ryhmittelytekijä puolestaan rivit, joissa kaupunkirivissä on samat arvot. 3.3 GROUP BY ROLLUP ROLLUP on GROUP BY-määreen laajennus, jolla tulosjoukon rivejä ryhmitellään monelle eri tasolle. Kyselyn tulosjoukko sisältää tavallisten rivien lisäksi myös välisummausrivit (SUB-TOTALS), joille lasketaan kumuloidut summat. ROLLUP:lla siirrytään tulosjoukossa hierarkiatasolla ylöspäin esimerkiksi siirtymällä aikadimensiossa viikosta kuukauteen tai vuoteen tai sijaintidimensiossa postinumerosta kaupunkiin tai 6
lääniin. ROLLUP:lla ryhmitellään tulosjoukkoa yhä suurempiin ryhmiin karkeammalle tasolle. ROLL UP:n vastakohtana on DRILL DOWN-määre [ElmNa]. ROLLUP määreen sisältämän kyselyn syntaksi on seuraava: SELECT Column1, Column2, SUM (Column3) FROM Table GROUP BY ROLLUP (Column1, Column2); ROLL UP -määre on oikeastaan kokoelma GROUPING SET - määreitä. Edellinen ROLLUP voidaan toteuttaa GROUPING SETS-määreillä seuraavasti: SELECT Column1, Column2, SUM (Column3) FROM Table GROUP BY GROUPING SETS ( (Column1, Column2) (Column1); ( ) ); ROLL UP määreen sisältämällä SQL-lauseella kysellään esimerkkinä olevasta Asukkaat-taulusta asukkaiden määrää ryhmiteltynä kaupungin ja läänin mukaan seuraavasti: SELECT lääni, kaupunki, COUNT (*) FROM Asukkaat GROUP BY ROLLUP (lääni, kaupunki); Kyselyn tuloksena on tulosjoukko, jossa rivit on ryhmitelty ensisijaisesti läänin ja toissijaisesti kaupungin mukaan. Tulosjoukossa on mukana myös välisummat (SUB TOTALS), jossa toinen ryhmittelytekijä on NULL sekä tulosjoukon kokonaismäärä, jossa molempien ryhmittelytekijöiden arvona on NULL. NULL tarkoittaa tässä sitä, että tieto on kyseisellä rivillä epäoleellinen. 7
LÄÄNI KAUPUNKI COUNT(*) Uusimaa Helsinki 4 Uusimaa Kauniainen 1 Uusimaa 5 TuPo Turku 1 TuPo Märynummi 1 TuPo 2 Pirkanmaa Tampere 2 Pirkanmaa 2 9 Tulosjoukko on muodostaa 4 ryhmää läänisarakkeen mukaan (Uusimaa, TuPo, Pirkanmaa, NULL= kaikki läänit). Kukin lääniryhmä ryhmitellään vielä kaupunkisarakkeen mukaan. Viimeisenä rivi, jossa sekä lääni, että kaupunkisarakkeiden arvo on NULL. 3.4 GROUP BY CUBE CUBE on SQL3-standardin summausoperaatio, jolla laajennettiin SQL:n GROUP BYmäärettä. CUBE:n esitteli ensimmäisenä John Gray vuonna 1997. CUBE-operaatio tuottaa tulosjoukon, joka sisältää sekä ROLLUP:n että ristiviittaustaulut. CUBE:lla saadaan taulusta esille sekä monitasoisia ryhmittelyjä että välisummausrivejä [GBLP]. CUBE:lla ryhmitellään tulosjoukon rivit kaikkien mahdollisten ryhmittelyjoukkojen mukaan: CUBE onkin eräänlainen laajennus ROLL UP-määreestä. CUBE-määreen sisältämän SQL-lauseen syntaksi on seuraava: SELECT Column1, Column2, SUM (Column3) FROM Table GROUP BY CUBE (Column1, Column2); Edellinen CUBE-lause voidaan toteuttaa GROUPING SETS-määreillä seuraavasti: 8
SELECT Column1, Column2, SUM (Column3) FROM Table GROUP BY GROUPING SETS ( (Column1, Column2) (Column1) (Column2) ()); Esimerkkinä käytetystä Asukkaat-taulusta saadaan seuraavalla CUBE-määreen sisältämällä SQL-lauseella tulosjoukko, jossa taulusta on haettu kaikki mahdolliset CUBE-määreessä olevien dimensioiden kombinaatiot: SELECT lääni, kaupunki, COUNT (*) FROM Asukkaat GROUP BY CUBE (lääni, kaupunki); LÄÄNI KAUPUNKI COUNT(*) 9 Turku 1 Tampere 2 Helsinki 4 Märynummi 1 Kauniainen 1 Pirkanmaa 2 Pirkanmaa Tampere 2 Tupo 2 TuPo Turku 1 TuPo Märynummi 1 Uusimaa 5 Uusimaa Helsinki 4 Uusimaa Kauniainen 1 9
Tässä tapauksessa tulosjoukon ensimmäisellä rivillä on dataa tarkasteltu lääni- ja kaupunkidimensioiden suhteen (millä tahansa arvoilla). Seuraavaksi tulosjoukko ryhmitellään läänidimension mukaan ja viimeiseksi kaupunkidimension mukaan. Lääniryhmittely jaetaan vielä kaupunkidimension mukaan aliryhmiin ja kaupunkidimensio läänidimension mukaisiin aliryhmiin. CUBE-määreellä saadaan esille myös ristiinviittaukset, joita tässä esimerkissä ei ole. 4 Yhteenveto Tässä työssä on käsitelty SQL:n GROUP BY-määreen laajennuksia SQL3-standardissa. SQL3-standardin laajennukset mahdollistavat tietovarastotoimintojen toteuttamisen SQL:llä tehtävissä kyselyissä. GROUP BY-määreellä voidaan ryhmitellä kyselyn tulosjoukkoa useiden ryhmittelytekijöiden mukaan, ja määreen laajennuksilla saadaan esille tarkempaa tietoa kannasta. GROUP BY GROUPING SETS määreellä saadaan yhdellä kyselyllä useiden ryhmittelyjen tulokset ja GROUP BY ROLLUP mahdollistaa porautumisen ja välisummausten tekemisen tulosjoukosta. GROUP BY CUBE mahdollistaa moniuloitteisten kyselyjen ja ristiinviittausten toteuttamisen SQL:llä. Kaupalliset sovellukset tarjoavat kasvaviin tietovarastotarpeisiin erilaisia uusia ratkaisuja ja sovelluksia, joita voidaan käyttää mm. yritystoiminnassa päätöksenteon ja johtamisprosessien tukemiseen. Tämä tarkoittanee myös SQL-standardin kehittämistä edelleen kohti monipuolisempaa tietojen analysointi- ja raportointitoimintoja. 10
5 Lähteet [AgChN] Agrawal, S, Chaudhuri, S, Narasayya, V: Automated selection of materialized views and indexes for SQL databases. S. 496-506. ftp://ftp.research.microsoft.com/users/autoadmin/vldb00.pdf (10.3.2003) [ChDa] Chaudhuri, S, Dayal, U: An overview of data warehousing and OLAP technology. SIGMOD Record 26(1) 1997. S. 65-74. ftp://ftp.research.microsoft.com/users/surajitc/sigrecord.pdf (9.3.2003) [Devlin] Devlin, B: Data warehouse from Archtitecture to implementation. Addison-Wesley. 1997 [ElmNa] Elmasri, R, Navathe, S: Fundamentals of database systems. Addison-Wesley.Third edition. 2000 [GBLP] Gray, J, Bosworth, A, Layman, A, Pirahesh, H: Data Cube: A Relational Aggregation Operator Generalizing Group-By, Cross-Tab and Sub-Totals. ICDE USA 1995. s. 152-159. http://research.microsoft.com/~gray/datacube.doc (9.3.2003) 11