17.03.2015 Views

2. Füüsiline disain

2. Füüsiline disain

2. Füüsiline disain

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Sisukord<br />

Teema 1<strong>2.</strong> Andmebaasi füüsiline <strong>disain</strong><br />

1.Eesmärgid.......................................................................................................2<br />

<strong>2.</strong>Füüsiline <strong>disain</strong>...............................................................................................2<br />

<strong>2.</strong>1Loogilise andmemudel konkreetse andmebaasisüsteemi jaoks tõlkimine<br />

........................................................................................................................3<br />

<strong>2.</strong>1.1Tabelite <strong>disain</strong>.....................................................................................4<br />

<strong>2.</strong>1.2Tuletatud väärtuste esitamise <strong>disain</strong>..................................................5<br />

<strong>2.</strong>1.3Kitsenduste (piirangute) täpsustamine ja lisamine.............................6<br />

<strong>2.</strong>1.3.1Välisvõtmetega seotud kompenseerivad tegevused...................8<br />

<strong>2.</strong>1.3.2CHECK kitsendused..................................................................11<br />

<strong>2.</strong>2Füüsilise esitusviisi <strong>disain</strong>.......................................................................14<br />

<strong>2.</strong><strong>2.</strong>1Transaktsioonanalüüs......................................................................15<br />

<strong>2.</strong><strong>2.</strong>2Salvestusruumi <strong>disain</strong>.......................................................................16<br />

<strong>2.</strong><strong>2.</strong><strong>2.</strong>1Andmete paigutus failides..........................................................16<br />

<strong>2.</strong><strong>2.</strong><strong>2.</strong>2Failide paigutuse valimine.........................................................17<br />

<strong>2.</strong><strong>2.</strong><strong>2.</strong>3Plokis lubatud vaba ruumi hulga valimine.................................17<br />

<strong>2.</strong><strong>2.</strong><strong>2.</strong>4Andmebaasi suuruste hindamine..............................................18<br />

<strong>2.</strong><strong>2.</strong>3Indeksite valimine.............................................................................18<br />

<strong>2.</strong><strong>2.</strong>3.1Indeksite loomine tabeli veerule või veergudele........................19<br />

<strong>2.</strong><strong>2.</strong>3.2Indeksi kustutamine...................................................................20<br />

<strong>2.</strong><strong>2.</strong>3.3Automaatne indeksi loomine......................................................20<br />

<strong>2.</strong><strong>2.</strong>3.4Indeksi kasutamine....................................................................20<br />

<strong>2.</strong><strong>2.</strong>3.5Indeksite klassifikatsioon...........................................................21<br />

<strong>2.</strong><strong>2.</strong>3.6Indeksi sisemise ülesehituse viisid............................................22<br />

<strong>2.</strong><strong>2.</strong>3.7Lihtne tihe indeks.......................................................................23<br />

<strong>2.</strong><strong>2.</strong>3.8Lihtne hõre indeks......................................................................24<br />

<strong>2.</strong><strong>2.</strong>3.9B-puu indeks..............................................................................24<br />

<strong>2.</strong><strong>2.</strong>3.10Soovitused B-puu indeksi kasutamiseks.................................27<br />

<strong>2.</strong><strong>2.</strong>3.11B-puu indeksi täiendamine......................................................31<br />

<strong>2.</strong><strong>2.</strong>3.12Kahendpuu...............................................................................32<br />

<strong>2.</strong><strong>2.</strong>3.13Räsiväärtustel põhinev indeks.................................................33<br />

<strong>2.</strong><strong>2.</strong>3.14Indeksi struktuuri järgi organiseeritud tabelid..........................33<br />

<strong>2.</strong><strong>2.</strong>3.15Joini indeks..............................................................................36<br />

<strong>2.</strong><strong>2.</strong>3.16Bitmap-indeks..........................................................................37<br />

<strong>2.</strong><strong>2.</strong>3.17Bitmap join indeks....................................................................39<br />

<strong>2.</strong><strong>2.</strong>3.18Tabeli läbiskaneerimine vs. indeksi kasutamine.....................40<br />

<strong>2.</strong><strong>2.</strong>3.19Indekseerimise rusikareeglid...................................................41<br />

<strong>2.</strong><strong>2.</strong>3.20Indeksi kasutamine andmebaasisüsteemi poolt......................42<br />

<strong>2.</strong>3Klassifikaatorite tabelid...........................................................................43<br />

<strong>2.</strong>4Vaadete <strong>disain</strong>.........................................................................................45<br />

<strong>2.</strong>5Julgeolekumehhanismide <strong>disain</strong>.............................................................45<br />

3.Mõisted..........................................................................................................45<br />

4.Kasutatud materjalid.....................................................................................46<br />

Joonised<br />

Joonis 1Tühjade stringide keelamine MS Accessi tabeli veerus.....................11<br />

1


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Joonis 2Veateade MS Accessis, mis kuvatakse, kui lisada tühi string veergu,<br />

kus see pole lubatud........................................................................................11<br />

Joonis 3Lihtne tihe indeks...............................................................................23<br />

Joonis 4Lihtne hõre indeks..............................................................................24<br />

Joonis 5B-puu indeksi ülesehituse põhimõte..................................................25<br />

Joonis 6Indeksipuu tasakaalustamine.............................................................25<br />

Joonis 7B-puu indeksi näide............................................................................27<br />

Joonis 8Kahendpuu näide...............................................................................32<br />

Joonis 9Räsiväärtustel põhinev indeks...........................................................33<br />

Joonis 10Klasterdatud indeks MS SQL Serveri näitel.....................................35<br />

Joonis 11Joini indeks.......................................................................................36<br />

1. Eesmärgid<br />

1. Anda ülevaade SQL-andmebaaside füüsilisest <strong>disain</strong>ist.<br />

<strong>2.</strong> Anda ülevaade indeksitest.<br />

<strong>2.</strong> Füüsiline <strong>disain</strong><br />

Disainietapi ülesandeks on analüüsi etapis väljatoodud nõuetele vastavate<br />

tehniliste lahenduste väljatöötamine.<br />

Eristatakse loogilist ja füüsilist <strong>disain</strong>i. Loogilisest <strong>disain</strong>ist oli juttu teemas nr.<br />

10.<br />

Füüsiline <strong>disain</strong> optimeerib / häälestab loogilise <strong>disain</strong>i lahendusi<br />

konkreetsete “füüsiliste” keskkondade jaoks. Füüsiliseks keskkonnaks on ka<br />

andmebaasisüsteem. Erinevate andmebaasisüsteemide pakutav<br />

funktsionaalsus erineb detailides üksteisest küllaltki palju.<br />

Sisend.<br />

• Loogilise <strong>disain</strong>i dokumentatsioon.<br />

• Teadmised kasutatava andmebaasisüsteemi ja rakenduse ehitamise<br />

vahendite kohta.<br />

Connolly ja Begg (2001) poolt esitatud metoodika põhjal on andmebaasi<br />

füüsilise <strong>disain</strong>i sammud järgnevad.<br />

1. Loogilise andmemudel konkreetse andmebaasisüsteemi (näiteks Oracle,<br />

Microsoft SQL, PostgreSQL, MySQL jne.) jaoks tõlkimine.<br />

- Tabelite <strong>disain</strong>.<br />

• Tabelite ja kitsenduste nimede täpsustamine.<br />

• Tabelite, veergude ning kitsenduste nimede täpsustamine vastavalt<br />

valitud andmebaasisüsteemi võimalustele.<br />

• Veergude tüüpide täpsustamine vastavalt valitud<br />

andmebaasisüsteemi võimalustele.<br />

- Tuletatud andmete <strong>disain</strong>.<br />

- Kitsenduste täpsustamine ja lisamine lisaks veergude tüüpide<br />

määramisele. Veeru tüübi määramine on samuti kitsenduse<br />

2


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

deklareerimine, sest veeru tüüp määrab ära lubatud väärtused selles<br />

veerus – need peavad kuuluma veeru tüübiga määratud väärtuste<br />

hulka.<br />

- Disainitaseme abitabelite leidmine.<br />

<strong>2.</strong> Füüsilise esitusviisi <strong>disain</strong>imine.<br />

- Transaktsioonide analüüs ja <strong>disain</strong>.<br />

- Failide sisemise organisatsiooni ja paigutuse valimine.<br />

- Indeksite valimine.<br />

- Tabelite sektsioonideks jagamise (partitioning) projekteerimine.<br />

- Tabelite andmete sisemisel tasemel ühendamise otsustamine.<br />

- Kettamahu vajaduste hindamine.<br />

3. Vaadete e. virtuaalsete tabelite <strong>disain</strong>imine.<br />

4. Andmebaasisüsteemi poolt pakutavate lisavõimaluste analüüs ja<br />

kasutuselevõtt.<br />

- Arvujada generaatorid.<br />

- Salvestatud protseduurid.<br />

- Trigerid.<br />

- Paketid.<br />

5. Julgeolekumehhanismide <strong>disain</strong>imine.<br />

6. Kontrollitud liiasuse sissetoomine (denormaliseerimine).<br />

Denormaliseerimine tähendab (mõnede) tabelite normaliseerituse astme<br />

vähendamist pragmaatilistel kaalutlustel. et parandada mõne päringu<br />

töökiirust. Kui üks mure (päring on liiga aeglane) saab ehk lahenduse, siis<br />

tekivad tänu denormaliseerimisele kohe uued mured (mõni teine päring või<br />

andmemuudatus muutub aeglasemaks, tekib andmete liiasus, andmete<br />

võivad tekkida vastuolud). Andmete denormaliseerimise vajadused<br />

selgitatakse välja transaktsioonianalüüsi käigus. Transaktsioonanalüüsi<br />

käigus selguvad erinevate andmebaasioperatsioonide täitmissagedused ja<br />

täitmisajad.<br />

Andmebaasi projekteerimine eeldab ka andmebaasi kasutavate/uuendavate<br />

rakenduste projekteerimist (<strong>disain</strong>i).<br />

Registri tüüpi rakenduse füüsiline <strong>disain</strong> sisaldab.<br />

• Kasutajaliideste füüsiline projekteerimine.<br />

• Andmebaasioperatsioonide füüsiline projekteerimine. Operatsioonide<br />

füüsiline projekteerimine toimub tavaliselt SQL keele ning viimast<br />

laiendava protseduurse keele (näiteks PL/SQL, Java,..) vahenditega.<br />

<strong>2.</strong>1 Loogilise andmemudel konkreetse andmebaasisüsteemi<br />

jaoks tõlkimine<br />

Disainer peab teadma andmebaasisüsteemi omadusi, mille jaoks <strong>disain</strong><br />

tehakse. SQL-andmebaasisüsteemi puhul tuleb uurida järgnevat.<br />

• Kuidas saab tabeleid luua? Kas tabeli loomisel saab määrata ka andmete<br />

salvestamist juhtivate parameetrite väärtuseid (nt. et tabelis sisalduvad<br />

andmed on ühes andmefailis, järjestikku ja sorteeritud jne.)?<br />

• Kas süsteemis saab kirjeldada primaarvõtmeid, välisvõtmeid,<br />

alternatiivvõtmeid?<br />

3


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

• Kas saab määrata veergude kohustuslikkust? Kas unikaalses veerus võib<br />

olla null, üks või rohkem NULLi?<br />

• Kas saab kirjeldada domeeni objekte (vt. teema nr. 5)?<br />

• Kas saab kirjeldada üldise kitsenduse (assertion) objekte (vt. teema nr. 5)?<br />

• Kas saab kirjeldada täiendavaid ridade terviklikkuse reegleid (CHECK<br />

kitsendus)?<br />

Loogilise <strong>disain</strong>i käigus loodud andmemudel peab olema stabiilsem (aja<br />

jooksul vähem muudatusi nõudev) kui füüsiline andmemudel. See tähendab,<br />

et aja jooksul arenevad andmebaasisüsteemid edasi ning võtavad kasutusele<br />

uusi võimalusi, mida tuleb füüsilise <strong>disain</strong>i juures arvesse võtta. Samas jääb<br />

andmebaasi struktuur samaks, või muutub vähe.<br />

<strong>2.</strong>1.1 Tabelite <strong>disain</strong><br />

Võimalikud variandid.<br />

• CASE vahendi kasutamisel luuakse vahendiga andmebaasi struktuuri<br />

füüsilise <strong>disain</strong>i täpsusega kirjeldus ja genereeritakse sellest SQL laused.<br />

Rational Rose CASE vahendis genereeritakse kontseptuaalsest<br />

andmemudelist tegelikult füüsilise <strong>disain</strong>i täpsusega andmemudel.<br />

Andmemudeli genereerimisel tuleb valida andmebaasisüsteem. Vastavalt<br />

valitud andmebaasisüsteemile saab füüsilise <strong>disain</strong>i mudeli kirjeldamisel<br />

kasutada selle andmebaasisüsteemi poolt pakutavate tüüpide kirjeldusi.<br />

• Kui CASE vahendit ei ole, siis tuleb SQL laused luua käsitsi.<br />

SQL keeles kuuluvad tabelite loomise laused andmekirjelduskeelde (Data<br />

Definition Language), mis on SQL keele alamkeel.<br />

Tabelite loomise lausete käivitamiseks pakuvad andmebaasisüsteemid<br />

mitmeid võimalusi. Serveri andmebaasisüsteemide koosseisu kuulub<br />

tavaliselt käsurea programm, kus on võimalik käivitada SQL lauseid.<br />

PostgreSQLis kannab selline programm nime plsql ja Oracle's SQL*Plus.<br />

Selline programm võib ka võimaldada SQL lausete lugemist tekstifailist ja<br />

nende käivitamist. Lisaks sellele on serveri andmebaasisüsteemide jaoks<br />

olemas eraldi administreerimisprogramme (nad võivad kuuluda<br />

andmebaasisüsteemiga ühte komplekti või olla ka eraldi juurde hangitavad),<br />

mis võimaldavad andmebaasiga töötamist kasutades graafilist kasutajaliidest.<br />

PostgreSQL andmebaasisüsteemi kasutaja võib eraldi alla-laadida programmi<br />

PgAdmin, mis pakub graafilist kasutajaliidest andmebaasi haldamiseks.<br />

Programm phpPgAdmin on veebipõhine programm, mis lubab teha samu<br />

tegevusi kui PgAdmin.<br />

Oracle andmebaasisüsteemiga tuleb kaasa programm nimega Database<br />

Manager. Lisaks pakuvad paljud tarkvarafirmad oma programme Oracle<br />

andmebaasiga töötamiseks.<br />

4


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

MS Accessis (2007) saab tabeleid luua kasutades graafilist <strong>disain</strong>erit, või<br />

käivitades ükshaaval tabelite loomise lauseid. Sisse-ehitatud võimalust mitme<br />

tabeli loomise lause korraga loomiseks ei ole.<br />

Erinevates andmebaasisüsteemides on lubatud andmebaasiobjekti<br />

identifikaatori maksimaalne pikkus erinev!<br />

• SQL standard määrab identifikaatori maksimaalseks pikkuseks 128 märki.<br />

• MS Accessis on identifikaatori maksimaalne pikkus 64 märki.<br />

• PostgreSQLis on identifikaatori maksimaalne pikkus vaikimisi kuni 63<br />

märki, aga seda saab muuta NAMEDATALEN parameetri väärtuse<br />

muutmise abil.<br />

• Oracles on identifikaatori maksimaalne pikkus üldjuhul 30 märki. Kui<br />

soovida anda kitsendustele sisukaid nimesid, siis 30 märki võib olla liiga<br />

vähe.<br />

Näide: Andmebaasisüsteemis MS Access (2000) ei saa CREATE TABLE<br />

lauses määrata DEFAULT väärtust. Seda saab teha graafilise kasutajaliidese<br />

(Table Designer) abil. Samuti ei saa CREATE ja ALTER TABLE lausetes<br />

määrata CHECK kitsendust ja välisvõtmega seotud kompenseerivaid<br />

tegevusi. Kuid tabeli <strong>disain</strong>ivaates graafilise kasutajaliidese kaudu saab<br />

tabeliga siduda valideerimisreegleid (ingl. k. validation rule) ja määrata<br />

välisvõtmega seotud kompenseeriva tegevuse tüübiks CASCADE.<br />

MS Access (2003) andmebaasisüsteemis saab eelmainitud tegevusi teha ka<br />

SQL lausete abil, kuid selleks peab andmebaasi kasutaja märkima: Tools=><br />

Options=> Tables/Queries=> SQL Server Compatible Syntax (ANSI 92).<br />

MS Access (2007) andmebaasisüsteemis saab eelmainitud tegevusi teha ka<br />

SQL lausete abil, kuid selleks peab andmebaasi kasutaja märkima: Office<br />

Button => Access Options => Object Designers => Query design => SQL<br />

Server Compatible Syntax (ANSI 92).<br />

MS Access (2010) andmebaasisüsteemis saab eelmainitud tegevusi samuti<br />

teha ka SQL lausete abil, kuid selleks peab andmebaasi kasutaja märkima:<br />

File => Options => Object Designers => Query design => SQL Server<br />

Compatible Syntax (ANSI 92).<br />

<strong>2.</strong>1.2 Tuletatud väärtuste esitamise <strong>disain</strong><br />

Näide: Tellimus koosneb tellimuse ridadest. Iga tellimuse rida on seotud<br />

kaubaga millel on hind. Tellimuse real määratakse kauba kogus ja<br />

arvutatakse rea summa. Tellimuse kui tervikule kehtib juurdehindlusi<br />

(käibemaks, transpordikulu) ja allahindlusi (soodustused). Kui kogu see info<br />

on andmebaasis olemas, siis saaks tellimuse summa vajadusel päringuga<br />

arvutada. Kas hoida tellimuse summat ka eraldi veerus tabelis Tellimus?<br />

Vastandlikud kaalutlused.<br />

Tuletatud väärtuse kasutamine.<br />

• Tuletatud väärtuste hoidmiseks kulub andmebaasis lisaruumi.<br />

5


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

• Tuleb tagada, et andmebaasi ei satuks vastandlikku informatsiooni –<br />

näiteks registreeritud tellimuse summa ei lange kokku andmebaasis<br />

olevate andmete põhjal arvutatud tellimuse summaga. Antud näite korral<br />

on valikud.<br />

• Keelata kinnitatud tellimuste ridade muutmine, uute ridade lisamine,<br />

ridade kustutamine. Samuti tuleb keelata tellimuse summa käsitsi<br />

muutmine.<br />

• Kirjutada programm, mis tellimuse ridade muutmisel arvutab ümber<br />

tellimuse summa. Andmetes tehtud muudatuste tulemusel tuleb väärtus<br />

ümber arvutada ja muudatus andmebaasi kanda, mis suurendab<br />

andmete muutmise transaktsioonid töö pikkust. NB! (kui lubate tellimusi<br />

muuta, siis tuleks kindlasti salvestada andmed selle kohta, kes ja<br />

milliseid muudatusi on teinud).<br />

Tuletatud väärtuse mittekasutamine.<br />

• Väärtus tuleb arvutada iga kord uuesti, kui seda küsitakse ja see võtab<br />

aega.<br />

• Andmebaasi <strong>disain</strong>i juures tuleb mõelda sellele, et ka tulevikus oleks<br />

päringutega võimalik taastada tuletatud väärtus sellisena nagu see oli<br />

andmete tekkimise hetkel. Punkti alguses toodud näide – kui tabelis Kaup<br />

on veerg hind ja kauba hinna muutudes kirjutatakse see hind üle, siis<br />

edaspidistes päringutes ei saa enam seda hinda kasutada, et minevikus<br />

tehtud tellimuse summat arvutada. Seega tuleb muuta andmebaasi <strong>disain</strong>i<br />

ja hoida andmebaasis ka hindade ajalugu.<br />

Kulkarni (2003) kohaselt kirjeldab SQL:2003 võimaluse luua genereeritud<br />

veerge.<br />

Näide:<br />

CREATE TABLE Tootaja (<br />

tootaja_kood INTEGER,<br />

palk DECIMAL(7,2),<br />

boonus DECIMAL(7,2),<br />

kogutulu GENERATED ALWAYS AS (palk + boonus)<br />

);<br />

Kogutulu väärtus arvutatakse alati, kui lisada tabelisse uus rida.<br />

<strong>2.</strong>1.3 Kitsenduste (piirangute) täpsustamine ja lisamine<br />

Andmebaasisüsteem kontrollib andmetega seotud kitsenduste täidetust.<br />

Kitsendused on vajalikud eelkõige selleks, et garanteerida andmete täielikkus<br />

andmebaasi tasemel, s.t. vältida vigaste andmete sattumist andmebaasi.<br />

Kitsendused garanteerivad andmete täielikkuse ka siis, kui andmeid ei lisata<br />

ekraanivormist, vaid muul moel otse andmebaasi (garanteerib andmete<br />

täielikkuse programmikoodi väliselt).<br />

Kitsenduste liigid on järgmised.<br />

• Tühjade väljade lubamine / mittelubamine (kohustuslikud/<br />

mittekohustuslikud veerud).<br />

• Primaarvõtmed.<br />

6


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

• Unikaalsuse nõue.<br />

• Välisvõtmed.<br />

• Arendaja poolt kirjutatud kontrollkitsendused.<br />

Vajalik on surrogaatvõtmete väärtuste genereerimine serveris<br />

(andmebaasisüsteemi poolt), sest see garanteerib võtmeväärtuste<br />

genereerimise ka andmete otse andmebaasi sisestamisel ja vähendab võrgu<br />

koormust.<br />

Järgnev näide illustreerib väidet, et ühe andmebaasisüsteemi kasutamisel<br />

omandatud teadmised ei pruugi olla 100% rakenduvad mõne teise<br />

andmebaasisüsteemi juures. NULLide kasutamine kitsendustes erinevates<br />

andmebaasisüsteemides (Gutuluzan & Pelzer, 2003). Võrreldavad<br />

andmebaasisüsteemid.<br />

• IBM DB2 Universal Database 7.2<br />

• IBM Informix Dynamic Server 9.3<br />

• Ingres II <strong>2.</strong>5<br />

• InterBase 6.0<br />

• Microsoft SQL Server 2000<br />

• MySQL 3.23<br />

• Oracle 9i<br />

• Sybase ASE 1<strong>2.</strong>5<br />

Automaatselt<br />

NOT<br />

NULL?<br />

NOT NULL<br />

kitsenduse<br />

kustutamine<br />

on võimalik?<br />

Mitu NULLi<br />

on lubatud<br />

unikaalsuse<br />

kitsendusega<br />

veerus?<br />

Kas NOT<br />

NULL<br />

kitsendus on<br />

vajalik veeru<br />

taseme<br />

primaarvõtme<br />

kitsenduse<br />

juures?<br />

ANSI ei jah mitu ei ei<br />

SQL<br />

IBM DB2 ei ei üks jah jah<br />

Informix ei jah üks ei ei<br />

Ingres ei ei null jah jah<br />

InterBase ei ei null jah jah<br />

MS SQL jah jah üks ei ei<br />

Server<br />

MySQL ei jah mitu ei jah<br />

Oracle ei jah mitu ei ei<br />

Sybase jah jah üks ei jah<br />

Kas NOT<br />

NULL<br />

kitsendus on<br />

vajalik tabeli<br />

taseme<br />

primaarvõtme<br />

kitsenduse<br />

juures?<br />

• Automaatselt NOT NULL.<br />

- jah, kui veerg on vaikimisi kohustuslik<br />

- ei, kui veerg on vaikimisi mittekohustuslik<br />

• NOT NULL kitsenduse kustutamine.<br />

- jah, kui saab kustutada veeruga seotud NOT NULL kitsendust (pole<br />

kooskõlas SQL standardiga)<br />

- ei, kui ei saa kustutada veeruga seotud NOT NULL kitsendust<br />

• Mitu NULLi on lubatud unikaalsuse kitsendusega veerus.<br />

7


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

- null, kui unikaalsuse kitsendusega veerule vastavates ridade väljades<br />

peab alati väärtus olema<br />

- üks, kui unikaalsuse kitsendusega veerule vastavate ridade väljade<br />

seas tohib olla maksimaalselt üks väli, kus väärtust ei ole.<br />

- mitu, kui unikaalsuse kitsendusega veerule vastavate ridade väljade<br />

seas tohib olla mitu välja, kus väärtust ei ole.<br />

• Kas NOT NULL on vajalik veeru taseme primaarvõtme kitsenduse juures.<br />

- jah, kui on nõutud "CREATE TABLE T1 (veerg1 INTEGER NOT NULL<br />

PRIMARY KEY)<br />

- ei, kui piisab "CREATE TABLE T1 (veerg1 INTEGER PRIMARY KEY)<br />

(kooskõlas SQL standardiga)<br />

• Kas NOT NULL on vajalik tabeli taseme primaarvõtme kitsenduse juures.<br />

- jah, kui on nõutud CREATE TABLE T1 (veerg1 INTEGER NOT NULL,<br />

CONSTRAINT T1 PRIMARY KEY)<br />

- ei, kui piisab CREATE TABLE T1 (veerg1 INTEGER, CONSTRAINT<br />

T1 PRIMARY KEY) (kooskõlas SQL standardiga)<br />

<strong>2.</strong>1.3.1 Välisvõtmetega seotud kompenseerivad tegevused<br />

Siin on mõeldud välisvõtmetega seotud tabelites sooritatavaid tegevusi ridade<br />

muutmisel, kustutamisel ühes seotud tabelitest. See tähendab, kas:<br />

1. Kustutatakse (muudetakse sõltuva tabeli välisvõtme veerus olevat<br />

väärtust) vastavad read sõltuvast tabelist, kui kustutatakse (muudetakse<br />

andmeid peremeestabeli primaarvõtme veerus) peremeestabeli rida<br />

(DELETE / UPDATE CASCADE).<br />

<strong>2.</strong> Keelatakse peremeestabeli rea kustutamine (peremeestabeli<br />

primaarvõtme veerus andmete muutmine) seni, kuni eksisteerib seotud<br />

ridu sõltuvas tabelis (DELETE / UPDATE NO ACTION või RESTRICT).<br />

3. Lisaks eespool toodud variantidele võidakse veel kustutada väärtused<br />

sõltuva tabeli vastavatest välisvõtme väljadest (või anda neile mingi muu<br />

väärtus), kui peremeestabeli vastav rida kustutatakse (või muudetakse<br />

väärtust primaarvõtme veerus).<br />

Nimetatud variantide vahel valiku tegemisel võib lähtuda järgmistest<br />

printsiipidest:<br />

• Primaarvõtme veergudes andmete muutmise puhul lähtuda<br />

1. variandist 2, kui primaarvõtme veerg on genereeritud puhtalt ridade<br />

unikaalsuse tagamiseks ning ei oma kasutaja jaoks mingit sisulist<br />

tähendust ja seega puudub ka vajadus väärtuste muutmiseks neis<br />

veergudes,<br />

<strong>2.</strong> variandist 1, kui primaarvõtme veerg omab kasutaja jaoks sisulist<br />

tähendust.<br />

• Ridade kustutamisel kasutada nii variandis 1 kui ka 2 toodud printsiipe.<br />

Igal konkreetsel juhul lähtutakse variandi valikul:.<br />

1. Analüüsi käigus formuleeritud soovitustest.<br />

<strong>2.</strong> Andmete kokkukuuluvuse loogikast (vt. järgnevaid näiteid).<br />

Näited:<br />

• Tugeva olemi andmete kustutamisel kustutatakse sellega seotud nõrkade<br />

olemite andmed (vt. teema 6). Nt. Tellimus koosneb Tellimuse ridadest.<br />

8


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Iga Tellimuse rida on seotud ühe kindla Tellimusega. Tellimuse<br />

kustutamisel kustutatakse ka sellega seotud Tellimuse read, sest nad ei<br />

oma iseseisvana mõtet.<br />

• Kui kaks tugevat (teistest olemitest sõltumatut) olemit on omavahel<br />

seotud, siis ühe olemi andmete kustutamine ei tohi tingida teise olemi<br />

andmete kustutamise:<br />

• Tänavate tabelist tänava kustutamine keelatakse aga seniks, kuni<br />

eksisteerib isikuid, firmasid jms., mis selle tänavaga seotud on.<br />

• Klassifikaatorite andmeid sisaldavas tabelis keelatakse ridade<br />

kustutamine, kui seotud tabelis leidub ridu.<br />

Järgnevalt on välja toodud võrdlev tabel, mis näitab erinevate<br />

andmebaasisüsteemide poolt toetatavaid kompenseerivaid tegevusi.<br />

MS Access 2007 Oracle 11g PostgreSQL 9.0<br />

ON UPDATE NO<br />

ACTION (vaikimisi)<br />

ON UPDATE CASCADE<br />

ON UPDATE SET NULL<br />

ON DELETE NO<br />

ACTION (vaikimisi)<br />

ON DELETE CASCADE<br />

ON DELETE SET NULL<br />

ON UPDATE NO<br />

ACTION (vaikimisi)<br />

ON DELETE NO<br />

ACTION (vaikimisi)<br />

ON DELETE CASCADE<br />

ON DELETE SET NULL<br />

ON UPDATE NO<br />

ACTION (vaikimisi)<br />

ON UPDATE RESTRICT<br />

ON UPDATE CASCADE<br />

ON UPDATE SET NULL<br />

ON UPDATE SET<br />

DEFAULT<br />

ON DELETE NO<br />

ACTION (vaikimisi)<br />

ON DELETE RESTRICT<br />

ON DELETE CASCADE<br />

ON DELETE SET NULL<br />

ON DELETE SET<br />

DEFAULT<br />

Siin välja pakutud kolmes andmebaasisüsteemis vastab vaid PostgreSQL<br />

kompenseerivate tegevuste osas SQL standardile.<br />

Näide: Juhul, kui andmebaasisüsteem ei toeta kõiki välisvõtmega seotud<br />

lisakitsendusi (nt. MS SQL Server 7.0 ei võimaldanud kaskaadset<br />

kustutamist), võib probleemi lahendada kasutades trigereid.<br />

Tabeliga Oppejoud on seotud triger, mis käivitud juhul kui tabelist Oppejoud<br />

mõni rida kustutatakse. Selle peale kustutatakse seotud read tabelis Aine.<br />

CREATE TRIGGER D_OPPEJOUD ON dbo.OPPEJOUD<br />

FOR DELETE<br />

AS<br />

DELETE AINE FROM deleted, AINE WHERE deleted.oppejoud_id =<br />

AINE.looja<br />

9


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

DELETE AINE FROM deleted, AINE WHERE deleted.oppejoud_id =<br />

AINE.kinnitaja;<br />

Nagu näete on trigeri kirjutamine töömahukam ja tülikam (erinevates<br />

andmebaasisüsteemides on erinev trigeri kehandis oleva protseduuri<br />

kirjutamiseks mõeldud keel) võrreldes selle kompenseeriva tegevuse<br />

deklareerimisega välisvõtme kitsenduse loomisel.<br />

Näide. MS Accessis on Text, Memo ja Hüperlink andmetüübiga veergude<br />

väärtustamiseks võimalik kasutada ka nullpikkusega stringi e. tühja stringi<br />

(ingl. k. zero lenght string). See võimaldab tähistada väärtuse puudumist<br />

kahel erineval viisil (ja selle kaudu eristada põhjuseid, miks väärtus puudub):<br />

• NULL,<br />

• nullpikkusega string.<br />

Näiteks NULL tähistab olukorda, kus ei teata seda, kas väärtus on olemas või<br />

mitte. Kui väärtuse puudumine on kindlalt teada, kasutatakse nullpikkusega<br />

stringi.<br />

MS Accessis saab tabeli <strong>disain</strong>ivaates määrata, kas lubada mingis veerus<br />

NULLe ja nullpikkusega stringe. Veerul on omadused.<br />

• Required – kas välja täitmine on kohustuslik? (yes – on kohustuslik; no<br />

– ei ole kohustuslik). Kohustuslik veerg ei tohi sisaldada NULLe,<br />

mittekohustuslik tohib.<br />

• Allow Zero Length – kas lubada nullpikkusega stringe (yes – lubada; no<br />

– mitte lubada);<br />

Väärtuse puudumise kindlakstegemiseks tuleb kasutada IS NULL predikaati.<br />

Nullpikkusega stringi otsimiseks tuleb WHERE klauslis kasutada literaali ''<br />

(kaks järjestikus ülakoma mille vahel ei tohi olla tühikut).<br />

Seega, kui kontseptuaalses andmemudelis on mingi atribuudi<br />

spetsifikatsioonis öeldud, et selle väärtus ei tohi olla tühi string, siis vastava<br />

veeru spetsifitseerimisel MS Accessi andmebaasis tuleb määrata Allow Zero<br />

Length=no.<br />

10


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Joonis 1Tühjade stringide keelamine MS Accessi tabeli veerus.<br />

INSERT INTO Amet (ameti_kood, nimetus) VALUES (99,'');<br />

Lisamine ebaõnnestus, sest nimetus ei tohi olla tühi string.<br />

Joonis 2Veateade MS Accessis, mis kuvatakse, kui lisada tühi string<br />

veergu, kus see pole lubatud.<br />

<strong>2.</strong>1.3.2 CHECK kitsendused<br />

Tabeli rida lükatakse andmebaasisüsteemi poolt tagasi, kui see annab<br />

CHECK kitsenduse täidetuse kontrollil tulemuseks VALE (FALSE). Kui<br />

kitsenduse kontrolli tulemuseks on ÕIGE (TRUE) või MÄÄRAMATA<br />

(UNKNOWN), siis rida ei lükata tagasi.<br />

Kitsenduste kontrolli tulemus on UNKNOWN, kui jätta kontrollitavatele<br />

veergudele vastavad väärtused määramata.<br />

CREATE TABLE Test(id INTEGER,<br />

a INTEGER,<br />

CONSTRAINT pk_test PRIMARY KEY(id),<br />

CONSTRAINT chk_test_a CHECK(a>2));<br />

11


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

--Lisamine õnnestub<br />

INSERT INTO test (id, a) VALUES (1, NULL);<br />

--sest NULL>2 => UNKNOWN<br />

INSERT INTO test (id, a) VALUES (2, 3);<br />

-- sest 3>2 => TRUE<br />

--Lisamine ebaõnnestub<br />

INSERT INTO test (id, a) VALUES (3, 1);<br />

-- sest 1>2 => FALSE<br />

Näited:<br />

ALTER TABLE Leping ADD (<br />

CONSTRAINT chk_lepingu_rida_perioodi_paeva<br />

CHECK (<br />

(tyyp=1 AND tasumise_periood BETWEEN 1 AND 5) OR<br />

(tyyp=2 AND tasumise_periood BETWEEN 1 AND 15))<br />

);<br />

Lepingul võib olla kuni 100 rida:<br />

ALTER TABLE Lepingu_rida ADD (<br />

CONSTRAINT chk_lepingu_rida_ridade_arv<br />

CHECK (NOT EXISTS (SELECT lepingu_nr<br />

FROM Lepingu_rida<br />

GROUP BY lepingu_nr<br />

HAVING COUNT(*)>100))<br />

)<br />

);<br />

Kaare lahendamine kitsenduse abil – kommentaar võib olla seotud kauba või<br />

teenusega, aga mitte mõlemaga korraga.<br />

ALTER TABLE Lepingu_rida ADD CONSTRAINT chk_lepingu_rida_kaar<br />

CHECK ((kaup IS NULL AND teenus IS NOT NULL) OR<br />

(kaup IS NOT NULL AND teenus IS NULL));<br />

ALTER TABLE Table_1 ADD CONSTRAINT constraint_1<br />

CHECK (column_1>(SELECT Max(column_2) AS maks FROM Table_2));<br />

CHECK kitsendus ei tohi olla mitte-deterministlik, st. anda samade andmete<br />

kontrollimisel erinevatel aegadel erineva tulemuse.<br />

Järgnev kitsendus on illegaalne (mittelubatud):<br />

ALTER TABLE Leping ADD CONSTRAINT chk_solmimise_kp<br />

CHECK(solmimise_kp=CURRENT_DATE);<br />

Paljud andmebaasisüsteemid (nt. Oracle, PostgreSQL) ei luba CHECK<br />

kitsendustes kasutada alampäringuid. Sellisel juhul saab CHECK kitsendusi<br />

12


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

kasutada vaid selliste kitsenduste jõustamiseks, mille kontrollimiseks on vaja<br />

teada ainult andmeid lisatavas/muudetavas reas (näiteks<br />

kinnitamise_aeg>=#01/01/2000# või kinnitamise_aeg>=loomise_aeg). Kui<br />

tabeli T rea r kitsendusele vastamise kontrollimiseks on vaja lugeda teisi T<br />

ridu või teiste tabelite ridu, siis tuleb kitsendus jõustada trigerite abil (vt.<br />

teema 13).<br />

Kitsendusi saab kirjeldada ka domeeni objektides:<br />

CREATE DOMAIN d_eesti_isikukood AS CHAR(11) NOT NULL<br />

CONSTRAINT Isikukood_koosneb_11_numbrist CHECK(VALUE ~<br />

'^([[:digit:]]{11})$')<br />

CONSTRAINT Esimene_number_peab_olema_vahemikus_3_ja_6<br />

CHECK(VALUE ~ '^([3-6]{1}.*)$')<br />

CONSTRAINT Neljas_number_peab_olema_0_voi_1 CHECK(VALUE ~ '^(.<br />

{3}[0-1]{1}.*)$')<br />

CONSTRAINT Kuues_number_peab_olema_vahemikus_0_ja_3<br />

CHECK(VALUE ~ '^(.{5}[0-3]{1}.*)$');<br />

CREATE TABLE Isik<br />

(isikukood d_isikukood,<br />

...<br />

);<br />

Kitsendusi saab kirjeldada ka assertion objektides:<br />

CREATE ASSERTION assertion_1<br />

CHECK ((SELECT Avg(column_1) FROM Table_1)>(SELECT<br />

Avg(column_2) FROM Table_2));<br />

Assertion objekti kirjeldatav kitsendus peab hõlmama üks või rohkem tabelit.<br />

CREATE ASSERTION assertion_1<br />

CHECK ((SELECT Avg(column_3) FROM Table_3)>40);<br />

Paljudes andmebaasisüsteemides selliseid objekte luua ei saa.<br />

Näide: Kuidas vältida tühja stringi kasutamist PostgreSQL (9.0) veeru<br />

väärtustamisel?<br />

CREATE TABLE Amet (ameti_kood SMALLINT NOT NULL,<br />

nimetus VARCHAR(50) NOT NULL,<br />

CONSTRAINT pk_amet PRIMARY KEY (ameti_kood),<br />

CONSTRAINT chk_nimetus CHECK (nimetus!=''));<br />

INSERT INTO Amet (ameti_kood, nimetus) VALUES (99,'');<br />

ERROR: new row for relation "amet" violates check constraint "chk_nimetus"<br />

Näide: Andmebaasisüsteemis MS Access (2000) ei saa kasutada CHECK<br />

kitsendusi. Graafilise kasutajaliidese (Tabel Designer) abil saab tabeli ja<br />

13


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

veergudega seostada valideerimisreegleid (Validation Rules ja Validation<br />

Text). Tabeli tasemel defineeritud valideerimisreegel võimaldab kontrollimisel<br />

kasutada kõiki tabeli veerge (nt. kontrollida, kas alguse aeg on varasem kui<br />

lõpu aeg). Keerukamaid andmete kontrolli reegleid tuleb realiseerida VBA-s<br />

kirjutatud sündmusprotseduuride abil.<br />

MS Access (2003) võimaldab luua SQL lausete abil CHECK kitsendusi (kui on<br />

määratud Tools=> Options=> Tables/Queries=> SQL Server Compatible<br />

Syntax (ANSI 92)). MS Access (2007) võimaldab luua SQL lausete abil<br />

CHECK kitsendusi (kui on määratud Office Button => Access Options =><br />

Object Designers => Query design => SQL Server Compatible Syntax (ANSI<br />

92)). Kuid huvitava puudusena, ei saa tabeleid, millele on selline kitsendus<br />

loodud läbi graafilise kasutajaliidese ära kustutada.<br />

Näide: Andmebaasisüsteemides PostgreSQL, Oracle ei saa CHECK<br />

kitsenduses kasutada alampäringuid. See ei võimalda keerukamaid kitsendusi<br />

CHECK kitsenduste abil jõustada. Küll aga saab CHECK kitsenduses<br />

kasutada alampäringut andmebaasisüsteemis MS Access (2007).<br />

Näide andmebaasisüsteemis MS Access (2007). Defineerin kitsenduse, et<br />

tabelis Kaibemaks tohib olla maksimaalselt üks rida.<br />

CREATE TABLE Kaibemaks(suurus SMALLINT PRIMARY KEY);<br />

ALTER TABLE Kaibemaks ADD CONSTRAINT chk_kaibemaksu_max_1<br />

CHECK((SELECT Count(*) AS arv FROM Kaibemaks)


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

<strong>2.</strong><strong>2.</strong>1 Transaktsioonanalüüs<br />

Selleks, et leida andmebaasi osad, mis võivad põhjustada probleeme<br />

töökiiruses tuleb leida:<br />

• Transaktsioonid, mis käivituvad sageli ja millel on töökiirusele suur<br />

mõju.<br />

• Transaktsioonid, mis on organisatsiooni toimimiseks hädavajalikud.<br />

• Ajaperioodid päeva/nädala jooksul, millal andmebaasi kõige rohkem<br />

kasutatakse (ingl. k. peak load)<br />

80/20 reegel – 20% kasutajate transaktsioonidest)annavad 80% andmebaasi<br />

kasutamise mahust.<br />

Selleks, et leida tabelite kasutamine transaktsioonide poolt, koostatakse<br />

CRUD maatriksi (Transaktsioonide / tabelite risttabel).<br />

CRUD maatriksi alusel leitakse tabelid, mida kasutavad kõige rohkem<br />

transaktsioone. Neid tabeleid kasutavaid transaktsioone uuritakse lähemalt.<br />

Transaktsiooni analüüsimise käigus leitakse järgmine informatsioon.<br />

• Tabeli kasutamise tüüp (andmete lisamine, muutmine, kustutamine,<br />

lugemine)<br />

• Kasutatavad tabelid ja veerud. Veergudes, milles andmeid<br />

muudetakse võib olla kasulik indeksi kasutamisest loobuda.<br />

• SQL lause WHERE klausli tingimustes määratud veerud<br />

(indekseerimise kandidaadid).<br />

• Veerud, mis osalevad SQL lausetes tabelite ühendamisel<br />

(indekseerimise kandidaadid).<br />

• Veerud, mida kasutatakse SQL lausetes sorteerimisel (indekseerimise<br />

kandidaadid).<br />

• Veerud, mida kasutatakse SQL lausetes grupeerimisel (indekseerimise<br />

kandidaadid).<br />

• Transaktsiooni keskmine päevase töötamise sagedus.<br />

• Transaktsiooni poolt keskmiselt kasutatav ridade hulk.<br />

• Transaktsiooni maksimaalse kasutamise ajaperiood ja sagedus.<br />

• Transaktsiooni poolt maksimaalselt kasutatav ridade hulk.<br />

• Nõudmised transaktsiooni töökiirusele (nt. peab kestma alla 1 sekundi).<br />

Näiteid transaktsioonanalüüsi põhjal tehtavatest järeldustest.<br />

• Päringu tingimustes sageli kasutatavatele veergudele, kus on palju<br />

unikaalseid väärtuseid, tuleks luua B-puu tüüpi indeks. Indeks tuleb luua<br />

vaid juhul, kui sellist indeksit ei ole eelnevalt loodud.<br />

• Tabelitele, milles ridade arv on väike või mida sageli muudetakse, ei ole<br />

mõtet täiendavalt indekseerida.<br />

• Tabelid, mida kasutatakse sageli päringus koos, võiks Oracles võimalusel<br />

koondada ühte kobrasse (klastrisse).<br />

15


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

<strong>2.</strong><strong>2.</strong>2 Salvestusruumi <strong>disain</strong><br />

<strong>2.</strong><strong>2.</strong><strong>2.</strong>1 Andmete paigutus failides<br />

Failide organiseerimine on andmete füüsiline korrastamine plokkideks<br />

püsisalvestusega andmekandjal. Tuleb valida optimaalne failide<br />

organisatsioon. Sageli ei võimalda andmebaasisüsteem seda <strong>disain</strong>eril<br />

määrata. Sellisel juhul jääb see samm vahele.<br />

Andmeid hoitakse ühes või mitmes failis. Fail sisaldab üks või rohkem kirjet,<br />

millest igaühes on üks või rohkem välja. Sisemisel tasemel võib fail sisaldada<br />

mitut füüsilist kirjet (lehekülge e. plokki), millest igaüks sisaldab ühte või<br />

rohkemat loogilist kirjet (ühe tabeli üks rida). Andmefailis sisaldab iga plokk<br />

tüüpiliselt andmeid ühest tabelist. Lisaks on andmefaili alguses info selle<br />

kohta milliste tabelite andmed on millistes plokkides. See kiirendab andmete<br />

otsimist, sest nt. päringu<br />

SELECT * FROM Aine;<br />

täitmiseks pole vaja enam üle vaadata kõigi tabeliplokke vaid ainult selliseid,<br />

mis sisaldavad tabeli Aine andmeid. Andmete lugemine/kirjutamine<br />

kõvakettale toimub plokkide kaupa<br />

• Andmefail võib olla sorteerimata (ingl. k. heap file). Plokid kirjutatakse täis<br />

andmete laekumise järjekorras ja mingit sisulist järjestust tabeliplokkidesse<br />

kirjutatud andmed ei oma.<br />

Eelised:<br />

• Lisamine kiire. Väärtused lisatakse faili lõppu (lõpus olevatesse<br />

plokkidesse).<br />

Puudused:<br />

• Konkreetse rea otsimine aeglane. Fail/failid tuleb jadamisi läbi käia<br />

ning lugeda mällu kõik failis sisalduvad plokid.<br />

• Kustutamine aeglane, sest kustutatavat rida sisaldav plokk tuleb<br />

jadamisi otsinguga üles otsida.<br />

• Kustutamise tulemusel jäävad plokkidesse tühjad kohad, mida ei<br />

taaskasutata. Sellega seoses väheneb töökiirus. Andmebaasisüsteem<br />

peab perioodiliselt selliseid faile ümber-organiseerima.<br />

• Andmefail võib olla sorteeritud mingi väärtuse (ingl. k. ordering key) järgi.<br />

Eelised:<br />

• Konkreetse rea otsimine kiire. Saab rakendada kahendotsingut (ingl. k.<br />

binary search).<br />

Puudused:<br />

• Andmete lisamine/muutmine on aeglane, sest järjekorda tuleb hoida.<br />

Andmete otsimiseks tabelist on andmebaasisüsteemil kaks põhilist<br />

strateegiat:<br />

• Tabeli läbiskaneerimine (tabeli plokkide lugemine ja läbivaatamine) ilma<br />

indeksit kasutamata.<br />

• Vaadatakse läbi kõik plokid (ingl. k. full table scan)<br />

16


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

• Vaadatakse läbi osa plokke – võimalik nt. siis kui tabeli andmed on<br />

plokkides sorteeritud.<br />

• Indeksi kasutamine vajalike ridu sisaldavate tabeli plokkide leidmiseks (ingl.<br />

k. index scan).<br />

Rea loogiline aadress = tabeli nimi + kandidaatvõtme hõlmatud veergude<br />

nimed + kandidaatvõtme väärtus<br />

Korteeži loogiline aadress = relvari nimi + kandidaatvõtme hõlmatud<br />

atribuutide nimed + kandidaatvõtme väärtus<br />

Rea füüsiline aadress = faili identifikaator + ploki identifikaator + rea<br />

positsioon plokis<br />

Rea loogilist aadressi kasutab rea ülesleidmiseks andmebaasi kasutaja. Rea<br />

füüsilist aadressi kasutab rea ülesleidmiseks andmebaasisüsteem.<br />

<strong>2.</strong><strong>2.</strong><strong>2.</strong>2 Failide paigutuse valimine<br />

Juhul kui andmebaas asub arvutis, milles on mitu kõvaketast, siis tuleb<br />

mõelda ka faile paigutamisele. Järgnevaid soovitusi esitab Rationali<br />

unifitseeritud protsessi kirjeldus.<br />

• Paigutada üheaegselt kasutatavad andmed erinevatele kõvaketastele, et<br />

jagada ketaste vahel töökoormust ning võimaldada andmete paralleelset<br />

lugemist.<br />

• Paigutada indeksid ja andmefailid erinevatele kõvaketastele, et jagada<br />

töökoormust ning võimaldada andmete paralleelset lugemist.<br />

• Keerukate päringute puhul tasuks kaaluda päringu poolt kasutatavate<br />

andmete paigutamist mitmele erinevale kõvakettale. See tähendab, et<br />

tabeliplokid on jaotatud erinevate kõvaketaste vahel ja nende poole<br />

pöördumine saab toimuda paralleelselt.<br />

Parima failide paigutuse leidmine on korduslik ja eksperimentaalne protsess.<br />

Kuidas määrata, millise tabeli andmed on millises failis? Mõned<br />

andmebaasisüsteemid (nt. Oracle, PostgreSQL) võimaldavad luua<br />

tabeliruume (sisemise taseme objektid), mis seovad ära tabelid ja<br />

andmefailid. Tabeliruumi loomisel saab määrata sellega seotud failid ja tabeli<br />

loomisel saab määrata selle mingisse tabeliruumi.<br />

Seega tabeliruumide kasutamine võimaldab määrata failid, kuhu tabeli<br />

andmed salvestada ja seega ka kaudselt määrata, millisele kõvakettale ühe<br />

või teise tabeli andmed salvestada. Tabeliruumi objekt ei ole SQL standardi<br />

poolt kirjeldatud.<br />

<strong>2.</strong><strong>2.</strong><strong>2.</strong>3 Plokis lubatud vaba ruumi hulga valimine<br />

Andmefail koosneb plokkides e. lehekülgedest. Mida tihedamalt on plokk<br />

andmetega täidetud, seda vähem on plokis vaba ruumi. See võib osutuda<br />

probleemiks, kui plokis olevaid andmeid sageli muudetakse, sest muudatus ei<br />

pruugi enam plokki ära mahtuda ja muudetud rea või selle osa tuleb kirjutada<br />

17


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

teise plokki. See aga omakorda põhjustab tabeli andmete hajumist erinevatele<br />

plokkidele üle kogu kõvaketta. Loomulikult väheneb sellega seoses ka tabeli<br />

andmete lugemise kiirus.<br />

Teisest küljest on tihedalt täis pakitud plokkide puhul (kus on vähe vaba<br />

ruumi) vaja andmete salvestamiseks vähem plokke ja sellega hoitakse kokku<br />

salvestusruumi. Samuti käib andmete otsimine kiiremini, sest<br />

andmebaasisüsteem peab lugema kõvakettalt vähem plokke.<br />

Rational Unified Processi kirjeldus soovitab tabelid ja indeksid jaotada<br />

vastavalt sellele, kui sageli muutuvad nendes olevad andmed:<br />

• väga sageli muudetavad,<br />

• suhteliselt sageli muudetavad,<br />

• harva muudetavad.<br />

• Väga sageli muudetavate tabelite ja indeksite andmed peaksid olema<br />

plokkides, kus on vaba ruumi 30%.<br />

• Suhteliselt sageli muudetavate tabelite ja indeksite andmed peaksid olema<br />

plokkides, kus on vaba ruumi 15%.<br />

• Harva muudetavate tabelite ja indeksite andmed peaksid olema plokkides,<br />

kus on vaba ruumi 5%.<br />

<strong>2.</strong><strong>2.</strong><strong>2.</strong>4 Andmebaasi suuruste hindamine<br />

Andmebaasi suuruse hindamise aluseks on iga tabeli kohta leitav kirjete arv.<br />

Rationali unifitseeritud protsessi kirjeldus märgib, et tabeli suuruse<br />

arvutamiseks saab kasutada valemit:<br />

tabeli suurus = (fikseeritud täiendav suurus tabeli kohta) + (tabeli<br />

ridade arv * (keskmine rea suurus/keskmine andmete tihedus))<br />

Suuruse mõõtühikuks võivad nt. olla baidid.<br />

Andmebaasi suuruse hinnang aitab määrata vajalikku kõvaketta/kõvaketaste<br />

suurust.<br />

<strong>2.</strong><strong>2.</strong>3 Indeksite valimine<br />

Indeks on andmebaasiobjekt, mis sisaldab indekseeritava(te) veeru<br />

(veergude) väärtust ning viidet (e. aadressi) neid väärtuseid sisaldavate<br />

ridade asukohale (ROWID). ROWID on tabeli rea füüsiline aadress. Selle<br />

struktuur on erinevates andmebaasisüsteemides erinev kuid see võiks<br />

sisaldada andmefaili identifikaatorit, tabeliploki identifikaatorit ja<br />

identifikaatorit, mis näitab rea positsiooni plokis.<br />

Indeksite eesmärgiks on kiirendada andmete otsimist ja sorteerimist, juhul kui<br />

otsimine toimub mingi kriteeriumi järgi.<br />

18


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Temast võib mõelda, kui analoogiast raamatu lõpus oleva indeksiga. Indeksit<br />

võidakse hoida eraldi failis (ingl. k. index file). Indeksid sisaldavad viiteid<br />

tabelite ridadele, mida hoitakse andmefailis (ingl. k. data file).<br />

Indekseid ei kirjeldata SQL standardis, kuid praktiliselt igas<br />

andmebaasisüsteemis on nad olemas. Tüüpilise B-puu indeksi loomiseks<br />

mõeldud lause on erinevates andmebaasisüsteemides vaata et sarnasemgi,<br />

kui mitmed SQL standardis kirjeldatud lausendid.<br />

Füüsilise <strong>disain</strong>i käigus tuleb määrata, kas indeksite lisamine suurendab<br />

süsteemi töökiirust. Kõigepealt tuleb koostada nimekiri veergudest, mida võiks<br />

indekseerida ja seejärel eemaldada sealt veerud, mille indekseerimine<br />

muudab andmete muutmise liiga aeglaseks.<br />

Päringu täitmisel on alternatiiviks indeksi kasutamisele täielik tabeli<br />

läbikäimine (ingl. k. full table scan). See tähendab, et kui otsitakse tabelist<br />

mingile tingimusele vastavaid ridu, siis tuleb vaadata ükshaaval läbi kõik selle<br />

tabeli ridu sisaldavad plokid.<br />

Indeksi kasutamise üle mingi andmebaasi operatsiooni täitmisel otsustab<br />

andmebaasisüsteem.<br />

<strong>2.</strong><strong>2.</strong>3.1 Indeksite loomine tabeli veerule või veergudele<br />

Indeksid mingite veergude jaoks luuakse kas automaatselt<br />

andmebaasisüsteemi poolt või andmebaasi programmeerija või<br />

administraatori poolt CREATE INDEX lausega.<br />

Indekseeritakse baastabelite veerge.<br />

SQL standard ei täpsusta CREATE INDEX käsu struktuuri, kuid see on<br />

enamikus andmebaasisüsteemides olemas.<br />

CREATE [UNIQUE] INDEX index_name<br />

ON table (column [, ]…);<br />

Näiteks:<br />

CREATE INDEX index_pnimi<br />

ON tootaja (pnimi);<br />

Indeksit ei saa luua virtuaalsele tabelile e. vaatele. See tähendab, et indeksit<br />

ei saa siduda vaate objektiga. Erandiks on materialiseeritud vaated, mis on<br />

tegelikult vaate e. päringu põhjal loodud baastabelid ja millele võib luua<br />

indekseid.<br />

Nii ei saa:<br />

CREATE VIEW hinded AS<br />

SELECT pnimi, enimi, hinne FROM tudeng,oppim<br />

WHERE tudeng.tkood=oppim.tudkood;<br />

19


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

CREATE INDEX pn_ind ON hinded (pnimi);<br />

SELECT * FROM hinded ORDER BY pnimi;<br />

Vaate põhjal päringut tehes konstrueerib päringu täitmise programm vaate ja<br />

päringu põhjal uue SQL lause, mis täidetakse vaate aluseks olevatel tabelitel<br />

ja selle täitmiseks võidakse kasutada indekseid.<br />

<strong>2.</strong><strong>2.</strong>3.2 Indeksi kustutamine<br />

DROP INDEX index;<br />

<strong>2.</strong><strong>2.</strong>3.3 Automaatne indeksi loomine<br />

Andmebaasisüsteem võib kasutada indekseid, et kiirendada kitsenduste<br />

täidetuse kontrolli.<br />

Kui tabeli loomisel või muutmisel defineerida tabelile primaarvõti (PRIMARY<br />

KEY kitsendus) või lisada mõnele veerule lihtsalt unikaalsuse nõue (UNIQUE<br />

kitsendus), siis peaaegu kõik andmebaasisüsteemid loovad nendele<br />

veergudele automaatselt indeksi.<br />

Tänu indeksi olemasolule saab andmebaasisüsteem indekseeritud veergu<br />

väärtuse lisamisel või väärtuse muutmisel kiiresti kontrollida, kas unikaalsuse<br />

nõue on peale seda täidetud.<br />

NB! Unikaalsuse kitsendus != Indeks<br />

Unikaalsuse kitsenduse loomine ei pea tingimata tähendama indeksi loomist<br />

(st. indeksi loomine võib olla otstarbekas, aga andmebaasisüsteem ei pea<br />

seda looma, kui see kasutab mingit efektiivsemat meetodit unikaalsuse<br />

kitsenduse täidetuse kontrolliks).<br />

Mõned andmebaasisüsteemid (aga mitte enamik) nagu Informix, Ingres ja<br />

InterBase loovad automaatselt indeksid ka välisvõtmetele.<br />

Enamik andmebaasisüsteeme ei kontrolli indeksi loomisel, kas indekseeritava<br />

veeru põhjal pole juba indeksit loodud. Niimoodi võivad tekkida kattuvad ja<br />

seega liigsed indeksid. See on halb sest sellised indeksid:<br />

- raiskavad salvestusruumi;<br />

- aeglustavad andmete muutmiseks mõeldud lausete täitmist;<br />

- ajavad päringu optimeerimise programmi segadusse, kuna sellel<br />

on valida mitme samaväärse indeksit kasutava täitmisplaani<br />

vahel.<br />

<strong>2.</strong><strong>2.</strong>3.4 Indeksi kasutamine<br />

Andmebaasisüsteeme otsustab ise, millal kasutada andmete otsimiseks<br />

indeksit ja millal mitte. Selleks peavad andmebaasisüsteemile teada olema<br />

20


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

statistilised väärtused, mis iseloomustavad tabelites olevaid andmeid (nt. kui<br />

palju on tabelis ridu, kui palju on veerus erinevaid väärtuseid, milline on nende<br />

jaotus). Regulaarse statistika värskendamise tagamine, on üks andmebaasi<br />

administraatori põhiülesannetest.<br />

Indeksite kasutamise reeglid on järgmised:<br />

• Andmebaasisüsteem kaalub indeksi kasutamist, kui päringus on WHEREklausel<br />

ja selles klauslis on märgitud see indekseeritud veerg. Kui veerul<br />

on indeks ei tähenda see, et andmebaasisüsteem seda tingimata kasutab.<br />

Andmebaasisüsteem otsustab indeksi kasutamise SQL lause füüsilise<br />

täitmisplaani koostamise käigus, võttes arvesse andmebaasis olevate<br />

andmete kohta kogutud statistika.<br />

• Funktsioonil mitte-põhinevat indeksit ei kasutata, kui WHERE-klauslis<br />

toodud veerg on osa mingist funktsioonist või avaldisest (ingl. k.<br />

expression). Näiteks:<br />

SELECT *<br />

FROM tootaja<br />

WHERE UPPER(pnimi) = ‘KASK’;<br />

SELECT *<br />

FROM Laud<br />

WHERE pikkus-1 >100;<br />

Lahenduseks oleks kasutada funktsioonil põhinevat indeksit. Funktsioonil<br />

põhineva indeksi korral arvutatakse indeksisse paigutatavad väärtused<br />

tabelisse pandavatele väärtustele rakendatava funktsiooni tulemusena.<br />

CREATE INDEX fidx_tootaja_pnimi ON Tootaja (Upper(pnimi));<br />

Funktsioonil põhinevat indeksit saab nt. luua nii andmebaasisüsteemis<br />

PostgreSQL kui ka Oracle.<br />

<strong>2.</strong><strong>2.</strong>3.5 Indeksite klassifikatsioon<br />

Indekseid võib klassifitseerida mitmel erineval viisil. Üks indeks võib kuuluda<br />

korraga mitmesse klassi. Järgnevalt on toodud näiteid võimalikest liigitustest:<br />

Osalevate veergude arv<br />

• Lihtindeks – indeksisse on võetud väärtused ühest veerust.<br />

• Liitindeks – mitu veergu võib olla ühe indeksiga indekseeritud kas siis<br />

otsimise kiiruse või ridade unikaalsuse kindlustamise eesmärgil.<br />

Osalevate tabelite arv<br />

• Üks tabel (tüüpiline olukord).<br />

• Mitu tabelit (vt. joini indeks).<br />

Veeru tüüp, millele on loodud<br />

21


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

• Primaarne indeks – primaarvõtmes osalevate veergude põhjal. Tabelile<br />

saab olla loodud maksimaalselt üks primaarne indeks.<br />

• Sekundaarne indeks – primaarvõtmes mitteosalevate veergude põhjal.<br />

Tabelile võib olla loodud mitu sekundaarset indeksit.<br />

Indekseeritud veerus olevate väärtuste unikaalsus<br />

• Unikaalne indeks (primaarvõtme või unikaalsuse kitsendusega hõlmatud<br />

veergudele)<br />

• Mitteunikaalne indeks (primaarvõtme või unikaalsuse kitsenduse poolt<br />

mitte hõlmatud veergudele)<br />

Indeksis olevate väärtuste leidmine<br />

• Väärtus otse veerust.<br />

• Väärtus veerust. Enne indeksisse lisamist on väärtusele rakendatud<br />

süsteemi poolt pakkimisalgoritmi.<br />

• Funktsioonil põhinev indeks. Funktsiooni argumendiks on väärtus<br />

veerule vastavast rea väljast. Indeks luuakse funktsiooni tagastatava<br />

väärtuse põhjal.<br />

Funktsioonil põhinevat indeksit saab luua nt. Oracle ja PostgreSQL<br />

andmebaasisüsteemides. Näiteks järgneva päringu:<br />

SELECT *<br />

FROM Tudeng<br />

WHERE Upper(perenimi)='TAMM';<br />

puhul, ei kasuta andmebaasisüsteem veerule perenimi loodud indeksit, mis<br />

on loodud käsuga:<br />

CREATE INDEX tudeng_perenimi_idx ON Tudeng(perenimi);<br />

Selleks, et otsinguks kasutada indeksit tuleb luua funktsioonil põhinev indeks:<br />

CREATE INDEX tudeng_upper_perenimi_idx ON Tudeng(Upper(perenimi));<br />

Indeksi tihedus<br />

• Tihe indeks – Iga indekseeritud tabeli rea kohta on indeksis üks rida.<br />

• Hõre indeks – Indeksis on vähem ridu, kui indekseeritud tabelis.<br />

<strong>2.</strong><strong>2.</strong>3.6 Indeksi sisemise ülesehituse viisid<br />

Järgnevalt vaadeldakse mõningaid erinevaid indeksi ülesehituse viise:<br />

• Lihtne tihe indeks<br />

• Lihtne hõre indeks<br />

• B-puu indeks<br />

• Kahendpuu indeks<br />

• Räsiväärtustel põhinev indeks<br />

22


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

• Bitmap indeks<br />

• Bitmap-join indeks<br />

• Indeksi järgi organiseeritud tabel<br />

<strong>2.</strong><strong>2.</strong>3.7 Lihtne tihe indeks<br />

Kõige lihtsam indeksi vorm koosneb spetsiaalsest failist, kus hoitakse<br />

sorteerituna kõiki indekseeritud veerus/veergudes olevaid väärtuseid ning<br />

viiteid vastavata tabeli ridade tegelikule asukohale kõvakettal. Nagu tabeli<br />

andmeid sisaldav fail koosneb tabeliplokkidest nii koosneb indeksi andmeid<br />

sisaldav fail indeksiplokkidest.<br />

Olgu näiteks tabel Isik, kus veerule perenimi on loodud indeks:<br />

Indeksiplokk<br />

Aav<br />

Avi<br />

Aamer<br />

Brown<br />

Bush<br />

Hunt<br />

...<br />

...<br />

...<br />

Aav<br />

Avi<br />

Aamer<br />

Aamer<br />

Brown<br />

Brown<br />

Brown<br />

Brown<br />

Bush<br />

Bush<br />

Tabeliplokk<br />

Joonis 3Lihtne tihe indeks.<br />

Kui teha päring, millega otsitakse isikut, kelle perenimi on Aamer, siis peab<br />

andmebaasisüsteem lugema indeksifaili (mis on eeldatavalt andmefailist palju<br />

väiksem).<br />

Andmebaasisüsteem peab leidma indeksist kirje, mis sisaldab väärtust<br />

"Aamer". Kuna indeks on sorteeritud, saab kasutada kahendotsingut.<br />

Indeksist leiab see vastavate kirjete aadressid andmefailides.<br />

23


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

<strong>2.</strong><strong>2.</strong>3.8 Lihtne hõre indeks<br />

Andmed on failides indekseeritud veeru väärtuste järgi sorteeritud. Andmefail<br />

on jaotatud plokkideks. Indeksipuu lehtedeks on viited plokkidele. Näiteks on<br />

andmefail sorteeritud isiku perenime järgi.<br />

Indeksiplokk<br />

Indeks<br />

Aav<br />

Brown<br />

Hunt<br />

...<br />

...<br />

...<br />

Aav<br />

...<br />

...<br />

...<br />

Brown<br />

...<br />

...<br />

...<br />

Tabeliplokk<br />

Hunt<br />

...<br />

...<br />

...<br />

...<br />

Joonis 4Lihtne hõre indeks.<br />

SELECT *<br />

FROM Isik<br />

WHERE perenimi='Aav';<br />

Kui otsitakse tudengit perenimega "Aav", siis indeksi alusel leitakse, et selle<br />

isiku andmed peavad olema tabeliplokis nr. 1 (kuna plokis nr. 2 on juba isikud,<br />

kelle perenimed on alates perenimest 'Brown'). See plokk loetakse mällu ja<br />

mällu loetud plokis toimub otsimine juba kiiresti.<br />

<strong>2.</strong><strong>2.</strong>3.9 B-puu indeks<br />

Tavaliselt on indeksi struktuurina kasutusel B-puu struktuur. B-puu indeksi<br />

(ingl. k. balanced tree) struktuur on tasakaalustatud puustruktuur (hierarhiline<br />

struktuur).<br />

Seega – B-puu tähendab "tasakaalustatud puu" (ingl. k. balanced tree) mitte<br />

kahendpuu (ingl. k. binary tree). Kahendpuu on B-puu erandjuhtum.<br />

24


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

<br />

TABELiplokid<br />

Juur<br />

KING<br />

Leht<br />

BLAKE<br />

JAMES<br />

MILLER<br />

TURNER<br />

ADAMS<br />

ALLEN<br />

BLAKE<br />

CLARK<br />

FORD<br />

JAMES<br />

JONES<br />

KING<br />

MARTIN<br />

MILLER<br />

SCOTT<br />

SMITH<br />

TURNER<br />

WARD<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

ROWID<br />

Joonis 5B-puu indeksi ülesehituse põhimõte.<br />

SMITH<br />

ALLEN<br />

WARD<br />

JONES<br />

MARTIN<br />

BLAKE<br />

CLARK<br />

SCOTT<br />

KING<br />

TURNER<br />

ADAMS<br />

JAMES<br />

FORD<br />

MILLER<br />

B-puu indeks koosneb indeksiplokkidest, mis on organiseeritud<br />

tasakaalustatud puu põhimõttel. Puu koosneb sõlmede (tippude) hierarhiast.<br />

Igal sõlmel (v.a. juur) on üks vanem sõlm ja null või rohkem järglassõlme.<br />

Leheks nimetatakse sellist sõlme, millel pole ühtegi järglast. Puu sügavus on<br />

maksimaalne tee pikkus juureks olevast sõlmest leheks olevasse sõlme.<br />

Tasakaalustatud puus on juureks olevast sõlmest ühesuguse pikkusega tee<br />

kõigisse lehtedeks olevatesse sõlmedesse.<br />

Tasakaalustatud puu<br />

perenimega isikuid)<br />

Tasakaalustamata puu<br />

(kui lisatud palju<br />

A-tähega algava<br />

Blake<br />

Adams<br />

Johnson Blake Appelby<br />

King Johnson Archer<br />

King King King<br />

Miller<br />

Turner<br />

Miller<br />

Turner<br />

Joonis 6Indeksipuu tasakaalustamine.<br />

Iga B-puu indeksiplokk sisaldab endas:<br />

• Võtmeväärtusi (indekseeritava veeru väärtusi). See võtmeväärtus on<br />

enamasti täpne koopia indekseeritava veeru väärtustest või arvutatakse<br />

25


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

selle põhjal. Seega – kuna nt. primaarvõtmele luuakse indeks<br />

automaatselt, siis mida suurem on primaarvõti, seda suuremaks kujuneb<br />

ka indeks. Mõnikord kasutatakse pakkimisalgoritme, et vähendada<br />

võtmeväärtuse suurust. Nt. väärtus, mis salvestatakse indeksiplokki, võib<br />

endast kujutada arvväärtust, mis arvutatakse lähtuvalt vastavast veeru<br />

väärtusest.<br />

• Viiteid teistele indeksiplokkidele.<br />

• Kõige madalama taseme indeksiplokid sisaldavad veeru väärtusi ja viita<br />

vastavaid andmeid sisaldavate asukohale andmebaasis (tabeli plokkides).<br />

B-puu indeksi plokkides on indeksi kirjed võtmeväärtuse järgi sorteeritud.<br />

Samuti sisaldavad need plokid viiteid eelmisele ja järgmisele<br />

indeksiplokile, mis võimaldab käia indeks läbi kasvavas või kahanevas<br />

järjekorras ja kasutada ">", "


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Joonis 7B-puu indeksi näide.<br />

Kui soovitakse lugeda väärtuseid mitteindekseeritud veergudest tuleb neid<br />

leitud aadressi alusel lugeda teisest ketta piirkonnast (võrreldes sellega, kust<br />

loeti indeksi andmeid). See põhjustab palju kõvaketta mittejärjestikusi I/O<br />

operatsioone. Kui tabelid ja B-puu indeks on mahukad võib juhtuda, et<br />

andmeid tuleb lugeda isegi teiselt kõvakettalt. Hüpped teistesse ketta<br />

piirkondadesse ja sellest tulenev ajakulu ongi põhjuseks, miks B-puu indeksid<br />

sobivad paremini selliste SQL päringute jaoks, mis toovad välja vähe ridu.<br />

<strong>2.</strong><strong>2.</strong>3.10 Soovitused B-puu indeksi kasutamiseks<br />

Indekseerimine on üks võtetest, mille abil on võimalik oluliselt tõsta<br />

andmetega opereerimise kiirust. Indekseerimise pealt maksimaalse efekti<br />

saavutamiseks tuleb indekseeritavaid veerge valida teatavate kriteeriumite<br />

alusel:<br />

27


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

• Tabel on suur ning tüüpilised päringud toovad välja vaid väikese osa<br />

tabeli ridade koguarvust. Tüüpiliselt tõstab B-puu indeks oluliselt<br />

päringutele vastamise kiirust juhul, kui päringud indekseeritud veeru<br />

põhjal toovad välja kuni 4 % tabeli ridade koguarvust.<br />

• Indekseerida tuleks kõik veerud, milles peavad olema unikaalsed<br />

väärtused või milles olevad väärtused on suhteliselt unikaalsed (vähe on<br />

korduvaid väärtusi). See tähendab, et indekseeritava veeru selektiivsus<br />

peab olema suur.<br />

veeru selektiivsus (protsentides) =(veerus olevate erinevate väärtuste<br />

arv)*100 / (kõigi veerus olevate väärtuste arv)<br />

• Indekseerida kõik primaarvõtmete poolt hõlmatud veerud ning veerud<br />

millele on loodud unikaalsuse kitsendus. Tegelikult loovad paljud<br />

andmebaasisüsteemid (nt. Oracle) taoliste veergude jaoks indeksid<br />

automaatselt, kuid iga DBMSi puhul tuleb see üle kontrollida. Selliste<br />

veergude indekseerimise põhjus on toodud eelmises punktis – need<br />

veerud on kõige selektiivsemad, s.t. neis korduvad väärtused puuduvad.<br />

• Veeru V indekseerimist võib põhjendatult kaaluda, kui veerus V on küll<br />

palju korduvaid väärtusi, kuid tüüpilised päringud kasutavad (WHERE<br />

tingimuses) just neid väärtusi, mille esinemissagedus on teiste väärtuste<br />

omast väiksem. Statistika tabeli veerus olevate väärtuste jaotuse kohta<br />

annab andmebaasisüsteemile aluse otsustada, milliste päringute puhul<br />

kasutada indeksit ja milliste puhul mitte. Kui võimalik, võiks taolise veeru<br />

korral luua tingimusliku indeksi – indeks luuakse vaid teatud<br />

(vähemesinevate) väärtuste kohta veerus V.<br />

• Veeru V indekseerimist võib põhjendatult kaaluda, kui veerg sisaldab palju<br />

määramatusi (NULL), kuid päringus küsitakse tavaliselt ridu, milles antud<br />

veerus on väärtus olemas. Indeksites enamasti NULLe ei salvestata ja<br />

seetõttu päring:<br />

SELECT *<br />

FROM Tabel1<br />

WHERE veerg1 IS NULL;<br />

indeksit ei kasuta, kuigi see on veerule veerg1 loodud.<br />

• Indekseerida veerud, mida kasutatakse sageli kitsendustes (SELECT<br />

lause WHERE klauslis) või tabelite ühendamisel (tüüpiliselt samuti<br />

päringutega seoses). Indeksit kasutav päring saab väga kiiresti vastata<br />

EXISTS() või NOT EXISTS() kasutatavatele päringutele, kui päring<br />

tehakse ainult indekseeritud veergude põhjal. Sellisel juhul saab päringule<br />

vastata juba indeksi põhjal ja baastabelist ei pea üldse andmeid lugema.<br />

Indeks sisaldab vähemalt üks kord väärtust, kui selline väärtus leidub ka<br />

baastabeli indekseeritud veerus.<br />

• Indeksi kasutamine annab eriti hea tulemuse, kui päringule saab vastata<br />

ainult indeksit kasutades ilma, et andmebaasisüsteem peaks pöörduma<br />

andmefailide poole.<br />

28


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

SELECT klient, AVG(summa) AS keskm<br />

FROM Arve<br />

GROUP BY klient<br />

Kui indekseerida nii veerud klient kui ka summa, siis saab tulemuse välja<br />

arvutada vaid indeksi põhjal, ilma andmefaili poole pöördumata.<br />

B-puu indeksi indeksiplokkides on indeksi kirjed võtmeväärtuse järgi<br />

sorteeritud. Andmebaasisüsteem saab seda ära kasutada, kui BETWEEN<br />

predikaati, ORDER BY või GROUP BY klauslit, UNION või DISTINCT<br />

operatsiooni (kasutavad sisemisel tasemel sorteerimist) sisaldava päringu<br />

täitmiseks kasutatakse indeksit.<br />

• Indekseid ja B-puud tuleb uuendada, kui lisatakse uus rida, kustutatakse<br />

rida või muudetakse indekseeritud veeru väärtust. Pragmaatiline käitumine<br />

– kui kohe pärast tabeli loomist on vaja sisestada suur hulk ridu (tabeli<br />

maht kasvab üle 5%) ja ei ole vaja sellest tabelist midagi otsida, siis luua<br />

kõigepealt tabel, siis sisestada read ja lõpuks luua indeksid.<br />

Peale selle võtavad indeksid kettaruumi – mida pikem on indekseeritav väli ja<br />

mida erinevamad on selle välja väärtused, seda rohkem ruumi võtab indeks.<br />

Seega tuleks pragmaatilistel põhjustel näiteks primaarvõtme veeru (veergude)<br />

puhul hoolikalt kaaluda väljapikkusi, sest primaarvõtmele luuakse enamasti<br />

indeks automaatselt.<br />

Indeksid võtavad ka ruumi muutmälus, sest indeksi kasutamisel loeb<br />

andmebaasisüsteem indeksiplokke muutmällu.<br />

Mida suurem on tabel, seda rohkem on indeksist kasu, kuid seda suuremad<br />

on ka indeksi ülalpidamise kulud – ajakulu uuendamisel ja indeksi all olev<br />

kettaruum. Lighstone et al. (2007) märgib, et tüüpiliselt kulub andmebaasis<br />

10% kuni 20% salvestusruumist indeksite andmete salvestamiseks. Kui see<br />

suurus on üle 25%, siis tuleks andmebaasis olevad indeksid põhjalikult<br />

ülevaadata ning üleliigsed indeksid eemaldada.<br />

Indekseerimise mõju andmete muutmisele ja kustutamisele on kahetine.<br />

Üheltpoolt saab indeksi abil muudetavad ja kustutavad read kiiremini üles<br />

leida. Teisalt tingivad muudatused indekseeritud veerule vastavates väljades<br />

või ridade lisamine/kustutamine ka indeksi ümberkorraldamise vajaduse, mis<br />

omakorda võtab aega.<br />

Seepärast on soovitav:<br />

• mõelda veergude indekseerimisele eelkõige tabelites, kus muutmised on<br />

küllalt harvad võrreldes päringutega,<br />

• mitte indekseerida tabelites veerge, milles olevaid andmeid tuleb sageli<br />

muuta.<br />

Suhteliselt kõige rohkem kasu on indeksitest selliste tabelite puhul, mis on<br />

suured, mida uuendatakse harva ja millest otsitakse sageli andmeid.<br />

29


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Olenevalt andmebaasisüsteemist käsitletakse NULLe erinevalt. Olgu tabel<br />

Tudeng. Veerg perenimi on mittekohustuslik. Sellele luuakse indeks.<br />

Tavaliselt NULLe ei indekseerita ja seega järgnevad päringud ei kasuta<br />

perenime veerule loodud indeksit:<br />

SELECT *<br />

FROM Tudeng<br />

WHERE pnimi IS NULL;<br />

SELECT Count(*) AS arv FROM Tudeng;<br />

Viimase päringu puhul on indekseeritud ridade arv väiksem kui tegelikult<br />

tabelis olevate ridade arv ja seetõttu pole andmebaasisüsteemil mõtet indeksit<br />

kasutada vaid toimub tabeli läbiskaneerimine.<br />

Sellistele veergudele, mida kasutatakse koos ühes ja samas WHEREklauslis,<br />

on mõtet luua ühine, liitindeks e. mitmekomponendiline (mitut<br />

veergu hõlmav) indeks. Millal liitindeksit kasutada?<br />

• Veerge kasutatakse sageli üheskoos päringu WHERE klauslis ning selle<br />

alamtingimused on seotud AND operatsiooniga.<br />

SELECT *<br />

FROM Isik<br />

WHERE eesnimi='Jaan' AND perenimi='Mets';<br />

• Veergude kombinatsioon annab oluliselt parema selektiivsuse (või koguni<br />

garanteerib unikaalse väärtuse) kui iga veerg eraldi.<br />

• Tüüpilised päringud kasutavad päringu tingimuses ühte ja sama veergude<br />

komplekti vaadeldavast tabelist. Sellise veergude komplekti koondamisel<br />

indeksisse saavutatakse, et päringud saavad vastused kätte otse<br />

indeksist, ilma tabeli poole pöördumata.<br />

Liitindeksite kasutamisel on oluline komponendiks olevate veergude järjestus<br />

indeksi loomise lauses. Oletame, et meil on tabel ja indeks:<br />

t(a, b, c, d, e) Primaarvõti(e);<br />

CREATE INDEX t_idx ON t(a, b, c);<br />

Loodud indeksit kasutatakse näiteks järgmiste päringute täitmisel:<br />

SELECT * FROM t WHERE a=:a;<br />

SELECT * FROM t WHERE a=:a AND b=:b;<br />

SELECT * FROM t WHERE a=:a AND b=:b AND c=:c;<br />

Päring, mille tingimuses ei ole kõige esimest liitindeksisse kuuluvat veergu<br />

(antud juhul a), sellist liitindeksit ei kasuta.<br />

SELECT * FROM t WHERE b=:b;<br />

30


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Liitindeks tuleks koostada nii, et esimeses veerus on kõige rohkem erinevaid<br />

väärtuseid ja esimest veergu kasutatakse kõige sagedamini päringutes.<br />

(Mõnikord muidugi need tingimused ei ühti). Tabelile võib vajadusel luua ka<br />

mitu liitindeksit.<br />

Tabelile võib luua mitu B-puu indeksit. Maksimaalne arv sõltub konkreetsest<br />

andmebaasisüsteemist. Soovitus on, et tabelite puhul kus on andmete<br />

muutmisi ja päringuid enam-vähem võrdselt võiks olla kuni 5 B-puu indeksit.<br />

Kui tabelite põhjal tehakse palju päringuid ja vähe muudatusi (analüüsi- ja<br />

otsustus-süsteemid), siis võiks tabelil olla kuni 12 indeksit. Kui tabelis on<br />

muudatusi rohkem kui päringuid, siis peaks indeksite arv olema väiksem<br />

kui 5.<br />

<strong>2.</strong><strong>2.</strong>3.11 B-puu indeksi täiendamine<br />

Indeks võib andmete tabelisse lisamise/muutmise käigus fragmenteeruda.<br />

B-puu indeksi fragmenteerumise tunnused on järgmised.<br />

• Indeksipuu lehtedes pole võtmeväärtused enam järjekorras.<br />

• Indeksipuu lehtede täituvus on erinev.<br />

• Indeksipuu on tasakaalust väljas – tee pikkus igast puu lehest puu-juureni<br />

ei ole ühesugune.<br />

Sellised probleemid tekivad praktikas peale seda, kui lisada/muuta vähemalt<br />

5% tabelis olevatest andmetest. Peale seda oleks aeg indeks<br />

reorganiseerida. Selleks on kaks võimalust.<br />

• Kasutada andmebaasisüsteemis ette nähtud indeksi<br />

ümber-organiseerimise lauset (erinevates andmebaasisüsteemides on<br />

need erinevad). SQL standard sellist lauset ei kirjelda. Näiteks:<br />

ALTER INDEX index REBUILD;<br />

• Kustutada indeks ja luua see uuesti. See võtab üldjuhul<br />

ümberorganiseerimisest rohkem aega.<br />

Tabelisse T suure hulga ridade lisamisel on töökiiruse huvides mõistlik<br />

kustutada kõik T-ga seotud sekundaarsed indeksid, lisada read ja seejärel<br />

luua uuesti eelnevalt kustutatud indeksid. Kokkuvõttes võtab andmete<br />

lisamine ja korrastatud indeksite saavutamine niimoodi kõige vähem aega.<br />

31


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

<strong>2.</strong><strong>2.</strong>3.12 Kahendpuu<br />

Kahendpuu (binary-tree) on puu, mille igal sõlmel on null kuni kaks alluvat.<br />

Tegemist on B-puu struktuuri erijuhtumiga. Igas indeksipuu sõlmes on kaks<br />

viidet. Üks viide viitab sõlmele, mis viitab väärtustele, mis on antud sõlme<br />

väärtusest väiksemad ning teine viitab sõlmele, mis viitab väärtustele, mis on<br />

antud sõlme väärtusest suuremad.<br />

Kõige kõrgema taseme indeksiplokis (puu juures) asub selline väärtus, millest<br />

suuremaid ja väiksemaid väärtusi on võrdselt 50%. Kõige esimene plokk<br />

jagab väärtuste hulga kaheks alamhulgaks. Puu juureks olev plokk sisaldab<br />

viiteid kahele järgmisele plokile, mis omakorda sisaldavad järgmisi viiteid,<br />

jagades selliste viidetega tekkivaid väärtuste alamhulki järjest väiksemaks,<br />

kuni viimasel tasemel jõutakse rea aadressideni.<br />

21<br />

10 22<br />

5 14 19 30<br />

17<br />

Joonis 8Kahendpuu näide.<br />

Jõudmaks sõlmeni, mis sisaldab väärtust "17" tuleb käia läbi tee<br />

21=>22=>19=>17. Viimasena loetav sõlm, mis on ka puu leheks, sisaldab<br />

omakorda viidet ridade asukohale, mille indekseeritud veerule vastavas väljas<br />

oli väärtus 17.<br />

Veergude väärtused paigutatakse indeksiplokkidesse selliselt, et säiliks<br />

indeksiplokkide puu tasakaal – st. tuleb tagada, et kui indeksiplokk sisaldab<br />

endas kahte viidet alam-indeksiplokkidele, siis kummaski alamharus oleks<br />

võrdne arv kirjeid (veeru väärtusi.).<br />

See tähendab, et ridade lisamisel ja eemaldamisel tabelist tuleb indeksid<br />

andmebaasisüsteemi poolt uuesti arvutada ja indeksipuu struktuuri vastavalt<br />

saadud indeksi väärtustele muuta, et vältida indeksipuu tasakaalust välja<br />

viimist. Kui indeksipuu struktuuri ridade lisamisel mitte muuta, läheks<br />

indeksipuu tasakaalust välja näiteks siis, kui alfabeedi lõputähtedega nimesid<br />

lisataks rohkem kui algustähtedega algavaid nimesid.<br />

32


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Indeksi arvutamise järjekord rea lisamisel või eemaldamisel – leitakse<br />

indeksisse lisatav väärtus.<br />

Indeksipuu organiseeritakse arvestusega, et indeksipuu juurplokist otsima<br />

hakates oleks ja sealt kummagi alam-indeksiploki lugemise vajaduse<br />

tõenäosus 0,5.<br />

<strong>2.</strong><strong>2.</strong>3.13 Räsiväärtustel põhinev indeks<br />

Räsiväärtustel põhineva indeksi (hash index) loomisel arvutatakse<br />

indekseeritud veergudele vastavates ridade väljades olevate väärtuste põhjal<br />

välja rea füüsilise aadressi asukoht indeksis.<br />

Rea füüsilise aadressi asukoha arvutamiseks rakendatakse tabelis olevale<br />

väärtustele spetsiaalset funktsiooni – hash e. räsifunktsiooni. Indeks<br />

sisaldab räsifunktsiooni väärtuseid ja viiteid rea tegelikule asukohale (rea<br />

füüsilist aadressi).<br />

Probleemid tekivad, kui rea füüsilise aadressi asukoha leidmise järel selgub,<br />

et antud asukohas juba asub mõni aadress. Tekivad kokkupõrked. Kui tekib<br />

kokkupõrge, siis tuleb üks kokkupõrkes osalenud aadress paigutada ülevoolu<br />

piirkonda – see on spetsiaalne piirkond indeksis, kuhu paigutatakse üks<br />

kokkupõrkes osalenud aadressidest.<br />

väärtus väärtus väärtus<br />

Rida, mis lisatakse tabelisse.<br />

Määrab rea<br />

aadressi<br />

asukoha<br />

indeksis<br />

Räsifunktsioon f(x)<br />

Räsil põhinev indeks<br />

räsifunktsiooni väärtus<br />

räsifunktsiooni väärtus<br />

räsifunktsiooni väärtus<br />

aadress<br />

aadress<br />

aadress<br />

Andmefail – rea<br />

tegelik asukoht<br />

rida 1<br />

rida 2<br />

rida 3<br />

Joonis 9Räsiväärtustel põhinev indeks.<br />

<strong>2.</strong><strong>2.</strong>3.14 Indeksi struktuuri järgi organiseeritud tabelid<br />

Indeksi struktuuri järgi organiseeritud tabelis on kõik tabeli andmed paigutatud<br />

B-puu indeksile vastavasse salvestusstruktuuri, kusjuures puu on<br />

organiseeritud mõnes tabeli veerus (klastri võtmes) olevate väärtuste järgi.<br />

33


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

See tähendab, et füüsiliselt on tabelisse kuuluvad andmed klastri võtme järgi<br />

sorteeritud.<br />

Oracles nimetatakse sellise idee järgi loodud tabelit index-organized table.<br />

Oracles saab klastri võtmeks olla vaid primaarvõti Microsoft SQL Serveris<br />

kasutab analoogilist ideed klasterdatud indeks.<br />

(vt. http://www.sql-server-performance.com/clustered_indexes.asp ). Microsoft<br />

SQL Serveris võib, kuid ei pruugi, olla klastri võtmeks primaarvõti.<br />

Puu lehtedeks on tegelikud tabeliplokid. Sellest tulenevalt:<br />

1. Andmete puustruktuurist otsimisele järgnev andmete lugemine ei põhjusta<br />

uute plokkide lugemist, sest B-puu lehed ongi tegelikud tabeliplokid.<br />

<strong>2.</strong> Kuna puu lehtedeks on tegelikud tabeliplokid, on tabeli read kettal<br />

füüsiliselt järjestatud võtme väärtuste järjekorras. See suurendab I/O<br />

(sisend/väljund) operatsioonide kiirust kui võtmevälja põhjal otsitakse ja<br />

loetakse tabelist suur hulk füüsiliselt üksteisele järgnevaid ridu.<br />

Loomulikult saab iga tabeli kohta olla ainult üks taoline B-puu struktuur.<br />

MS SQL Serveris soovitatakse klastri võti valida järgmiste kandidaatide seast.<br />

• Välisvõtme veerud. Sellest on kasu tabelite ühendamisel, sest sama<br />

välisvõtme väärtusega read on füüsiliselt kõrvuti ning ühendamise<br />

operatsiooni läbiviimine läheb seetõttu kiiremini.<br />

• Veerud, mille põhjal tehakse sageli otsing, mis hõlmab väärtuste vahemiku<br />

otsimist. Näide:<br />

SELECT *<br />

FROM Isik<br />

WHERE perenimi BETWEEN 'Aas' AND 'Berendson';<br />

Kui perenime järgi tehtavad päringud on olulised, neid tehakse sageli ja nad<br />

toovad välja suure hulga ridu, tuleks kaaluda tabeli organiseerimist B-puu<br />

struktuuri perenimede järgi.<br />

• Veergudele, mida kasutatakse sageli ORDER BY või GROUP BY klauslis.<br />

Andmete lisamine või klastri võtme veergudes andmete muutmine on<br />

aeglane, sest rida tuleb paigutada failis järjekorras õigesse kohta. Kui klastri<br />

võtmel on monotoonselt (n, n+1, n+2 jne) kasvav väärtus, siis satuvad<br />

korraga lisatavad read andmefailis ühte plokki ja see tekitab kuuma punkti<br />

(ingl. k. hot-spots), kus lisamise koormus on suurem kui mujal.<br />

34


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Joonis 10Klasterdatud indeks MS SQL Serveri näitel.<br />

35


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

<strong>2.</strong><strong>2.</strong>3.15 Joini indeks<br />

Gulutzan (2003) andmetel võimaldavad mitmed andmebaasisüsteemid luua<br />

indeksi üle mitme tabeli .<br />

Indeks<br />

Tabel1<br />

Indeks<br />

Tabel2<br />

A<br />

Rida 1.1<br />

B<br />

Rida <strong>2.</strong>1<br />

B<br />

Rida 1.2<br />

C<br />

Rida <strong>2.</strong>2<br />

C<br />

Rida 1.3<br />

F<br />

Rida <strong>2.</strong>3<br />

A<br />

B<br />

B<br />

C<br />

C<br />

F<br />

Joini indeks<br />

Rida 1.1<br />

Rida 1.2<br />

Rida 1.3<br />

Rida <strong>2.</strong>1<br />

Rida <strong>2.</strong>2<br />

Rida <strong>2.</strong>3<br />

Joonis 11Joini indeks.<br />

Kui luua joini indeks korraga ühe tabeli primaarvõtmele ja teise tabeli<br />

välisvõtmele, siis on lihtne teha ühendamist kasutavaid päringuid:<br />

SELECT *<br />

FROM Tabel1, Tabel2<br />

WHERE Tabel1.veerg1=Tabel<strong>2.</strong>veerg1<br />

Päringu täitmise programm peab käima läbi indeksi ja iga võtmeväärtuse<br />

korral kontrollima, kas ka järgnev võtmeväärtus on sama. Kui jah, siis see<br />

tähendab et vastava võtmeväärtusega rida tuleb tulemusse tuua.<br />

Sellise indeksi kasutamine aeglustaks päringut, mis toimub vaid ühe tabeli<br />

põhjal. Siinkohale rõhutame, et andmebaasisüsteemi asi on otsustada, kas ja<br />

millises olukorras indeksit kasutada. Seega heatasemeline<br />

andmebaasisüsteem ei kasuta indeksit päringu q täitmiseks, kui selle<br />

kasutamine võiks q täitmist aeglustada võrreldes indeksi mittekasutamisega.<br />

Selleks, et andmebaasisüsteem saaks langetada õige otsuse indeksi<br />

kasutamise/mittekasutamise kohta, peab süsteemi käsutuses olema<br />

võimalikult täpne andmebaasi statistika.<br />

36


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

<strong>2.</strong><strong>2.</strong>3.16 Bitmap-indeks<br />

Mõningates andmebaasisüsteemides (nt. Oracle) saab kasutada bitmap<br />

indekseid. Oletame, et tabelis T on n rida ja tabelis T on veerg V. Veerule V<br />

loodud bitmap indeks on kogum bitivektoreid, pikkusega n. Iga veerus V oleva<br />

ühe võimaliku väärtuse kohta sisaldub bitmap indeksis üks bitivektor (Garcia-<br />

Molina & Ullman 2000). Järgnevalt kirjeldatakse bitmap indeksit näite varal.<br />

Arve<br />

arve_nr arve_kuupäev tasumise_viis summa ostja_tüüp<br />

1 01.04.2002 sularahas 1000 eraisik<br />

2 01.04.2002 ülekandega 2000 firma<br />

3 05.04.2002 ülekandega 5000 firma<br />

4 08.04.2002 arvega 3000 eraisik<br />

5 10.04.2002 ülekandega 1500 eraisik<br />

6 1<strong>2.</strong>04.2002 arvega 2200 firma<br />

Siin on 1, sest tabelis Arve on<br />

esimeses reas veerus tasumise_viis<br />

väärtus "sularahas".<br />

Bitivektor<br />

tasumise_viis=<br />

'sularahas'<br />

tasumise_viis=<br />

'ülekandega'<br />

tasumise_viis=<br />

'arvega'<br />

1 0 0<br />

0 1 0<br />

0 1 0<br />

0 0 1<br />

0 1 0<br />

0 0 1<br />

Iga sisend (bitt) bitivektoris vastab ühele tabeli reale. Biti väärtus sõltub<br />

väärtusest tabeli veerus.<br />

Kriteeriumid Bitmap-indeksi kasutamiseks.<br />

• Erinevalt B-puu indeksitest on bitmap indeksid on kasulikud selliste<br />

veergude puhul, kus on vähe võimalikke väärtuseid. Kõige parema efekti<br />

annavad nad veergude puhul kus:<br />

(unikaalsete väärtuste arv veerus/ ridade arv veerus)*100


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

• B-puu indeksi andmemaht võib kujuneda suuremaks kui indekseeritava<br />

tabeli andmemaht. Samas on bitmap indeksi andmemaht väga palju<br />

väiksem indekseeritava tabeli andmemahust.<br />

• Vähemalt Oracle andmebaasisüsteemis on bitmap indeksit ebasobiv<br />

kasutada andmebaasides, kus toimuvad sagedased ja paralleelsed<br />

andmete muutmise transaktsioonid. Seda põhjusel, et bitmap indeksi<br />

täiendamine rea muutmise järel põhjustab suure hulga tabeli ridade<br />

lukustumise.<br />

• Eelnevast punktist tulenevalt kasutataks bitmap indekseid andmeaitades<br />

(ingl. k. data warehouse).<br />

• Bitmap indeksid on kõige efektiivsemad päringute puhul, mis sisaldavad<br />

mitmeid tingimusi WHERE klauslis. Read, mis vastavad mõnele, kuid mitte<br />

kõigile tingimustele filtreeritakse välja juba enne tabeli poole pöördumist.<br />

SELECT *<br />

FROM Arve<br />

WHERE (tasumise_viis='sularahas' OR tasumise_viis='ülekandega') AND<br />

(ostja_tüüp='eraisik');<br />

(tasumise_viis='sularahas' ) OR (tasumise_viis= 'ülekandega' AND<br />

ostja_tüüp='eraisik')<br />

tasumise_viis=<br />

'sularahas'<br />

tasumise_viis=<br />

'ülekandega'<br />

ostja_tüüp=<br />

'eraisik'<br />

1 0 1<br />

0 1 0<br />

0 1 0<br />

0 0 1<br />

0 1 1<br />

0 0 0<br />

AND ja OR operatsioonide läbiviimine toimub biti kaupa. Tulemuseks on<br />

bitivektor, mida saab kasutada järgmistes AND või OR operatsioonides.<br />

tasumise_viis= tasumise_viis= 'ülekandega'<br />

'sularahas' AND ostja_tüüp='eraisik'<br />

1 0<br />

0 0<br />

0 0<br />

0 0<br />

0 1<br />

0 0<br />

Kollasega on tähistatud päringu tulemuseks olevaid ridu tähistavad bitid.<br />

tasumise_viis='sularahas' OR (tasumise_viis= 'ülekandega' AND<br />

ostja_tüüp='eraisik')<br />

1<br />

0<br />

0<br />

0<br />

1<br />

0<br />

38


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Kollasega on tähistatud päringu lõpptulemusena leitavad read.<br />

arve_nr arve_kuupäev tasumise_viis summa ostja_tüüp<br />

1 01.04.2002 sularahas 1000 eraisik<br />

2 01.04.2002 ülekandega 2000 firma<br />

3 05.04.2002 ülekandega 5000 firma<br />

4 08.04.2002 arvega 3000 eraisik<br />

5 10.04.2002 ülekandega 1500 eraisik<br />

6 1<strong>2.</strong>04.2002 arvega 2200 firma<br />

Joonis 10. Bitmap indeksi kasutamine<br />

Bitmap indeksit on kõige parem kasutada suure andmemahuga (kuna<br />

indeksi andmemaht kujuneb väikeseks) ja harva muudetavates tabelites.<br />

On olemas meetodeid, kuidas Bitmap indeksi suurust vähendada. Selliste<br />

meetodite alusel loodud indekseid nimetakse pakitud bitmap indeksiteks. Nad<br />

kõik lähtuvad ideest, et bitivektoris on rohkem 0-e kui 1-sid ja 0-d võiks<br />

kuidagi kodeerida, et neid poleks vaja kõiki eraldi säilitada. Selle teema kohta<br />

võib lugeda (Garcia-Molina & Ullman, 2000, lk. 227-229).<br />

<strong>2.</strong><strong>2.</strong>3.17 Bitmap join indeks<br />

Bitmap indeks luuakse päringus ühendatavatele tabelitele. See aitab päringu<br />

täitmise programmil rakendada ühendatavatele tabelitele enne ühendamist<br />

piiranguid ja vähendada seega ühendamise operatsioonis osalevaid ridu.<br />

Auto<br />

auto_id tootja auto_nr<br />

1 Volvo 863AEH<br />

2 Mercedes 121PPT<br />

3 Scania 602OOH<br />

4 Volvo 452EPT<br />

5 Saab 789AAK<br />

Omamine<br />

omanik auto algus lõpp<br />

1 1 01.01.2000 2<strong>2.</strong>08.2002<br />

1 2 1<strong>2.</strong>0<strong>2.</strong>1999<br />

2 1 23.08.2002<br />

3 4 14.0<strong>2.</strong>2001<br />

3 5 15.05.1997 16.05.2002<br />

CREATE BITMAP INDEX auto_omamine_bjix<br />

ON Omamine(auto.mark)<br />

FROM Auto, Omamine<br />

WHERE Auto.auto_id=Omamine.auto<br />

LOCAL NOLOGGING;<br />

Näide indeksi struktuuri kohta:<br />

39


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

omanik Volvo Mercedes Scania Saab<br />

omamise rida 1 1 0 0 0<br />

omamise rida 2 0 1 0 0<br />

omamise rida 3 1 0 0 0<br />

omamise rida 4 1 0 0 0<br />

omamise rida 5 0 0 0 1<br />

Selline indeks aitab näiteks kiirendada päringut:<br />

SELECT A.tootja, O.algus, O.lopp<br />

FROM Auto A, Omamine O<br />

WHERE A.auto_nr=O.auto AND A.tootja='Volvo';<br />

<strong>2.</strong><strong>2.</strong>3.18 Tabeli läbiskaneerimine vs. indeksi kasutamine<br />

Andmete otsimiseks võib andmebaasisüsteem kasutada järgnevaid<br />

meetodeid (ingl. k. access method).<br />

• Tabeli läbiskaneerimine (tabeli plokkide lugemine ilma indeksit<br />

kasutamata). Andmebaasisüsteem peab igast loetud plokist otsima<br />

tingimustele vastavaid ridu. Mida suurem on tabel, seda rohkem kulub<br />

tabeli läbiskaneerimiseks aega. Võimalikud strateegiad:<br />

1. Vaadatakse läbi kõik plokid (ingl. k. full table scan)<br />

<strong>2.</strong> Vaadatakse läbi osa plokke – võimalik nt. Siis, kui tabeli andmed on<br />

plokkides sorteeritud ja otsing toimub veeru järgi, mille alusel<br />

sorteerimine on toimunud.<br />

• Indeksi kasutamine. Indeksi kasutamisel on võimalikud variandid.<br />

1. Andmebaasisüsteem loeb indeksit. Indeksist leitud ridade füüsiliste<br />

aadresside alusel loeb andmebaasisüsteem tabelite plokke.<br />

<strong>2.</strong> Andmebaasisüsteemil piisab vajalike andmete leidmiseks<br />

(päringule vastuse saamiseks) ainult indeksi lugemisest.<br />

SELECT *<br />

FROM Aine<br />

WHERE aine_kood>'IDU3381';<br />

Andros (2002 lk. 39) märgib, et tavaliselt arvatakse nagu oleks tabeli<br />

läbiskaneerimine aeglane ja ebaefektiivne võrreldes indeksi kasutamisega.<br />

Indeksi kasutamine ei ole alati kasulik. Andmebaasisüsteem peab<br />

oskama valida, millal indeksit kasutada ja millal mitte.<br />

Andmebaasisüsteemil oleks indeksi lugemise asemel mõistlik kasutada<br />

tabeli läbiskaneerimist kui küsitakse andmeid ka sellistest veergudest,<br />

mis indeksisse ei kuulu ja on täidetud üks järgmistest tingimustest.<br />

• Tabel on suur. Päring leiab suure hulga tabelis olevaid ridu<br />

(erinevatel andmetel vähemalt 35% või vähemalt 50% ridadest).<br />

• Tabel on suhteliselt väike (nt. 100 rida või vähem, ja mõned<br />

veerud).<br />

40


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Indeksi kasutamisel otsitakse kõigepealt rea aadress indeksipuust. Seejärel<br />

tuleb lugeda rida mingist tabeliplokist. Tabeliplokkides paiknevad read<br />

enamasti juhuslikus järjekorras. Indeksi abil andmete otsimisel võib<br />

andmebaasisüsteem lugeda ühte tabeli plokki mitu korda. Kui otsitakse<br />

piisavalt suurt hulka ridu, siis on tabeli läbiskaneerimine kiirem kui otsing<br />

indeksi põhjal.<br />

Kui tabel on nii väike, et mahub ühe tabeliplokki, siis kiirem on lugeda kohe<br />

see tabeliplokk, selle asemel et lugeda kõigepealt indeksit ja siis ikkagi see<br />

sama tabeliplokk.<br />

Mõelge, kas kasutaksite raamatu indeksit, kui Teie ülesandeks oleks kogu<br />

raamat läbi lugeda või kui raamat oleks ainult mõni lehekülg paks.<br />

<strong>2.</strong><strong>2.</strong>3.19 Indekseerimise rusikareeglid<br />

Lighstone et al. (2007) loetleb indekseerimise rusikareeglid (reeglid, mille<br />

rakendamine annab enamasti hea tulemuse).<br />

1. Indekseeri kõik primaarvõtmed (seda teeb enamik<br />

andmebaasisüsteeme automaatselt) ja enamik välisvõtmetest.<br />

<strong>2.</strong> Veerud, millele sageli viidatakse SQL lause WHERE klauslis, on<br />

potentsiaalselt head indekseerimise kandidaadid.<br />

3. B-puu indeksit saab andmebaasisüsteem kasutada nii päringute puhul,<br />

kus rea otsing toimub ühe kindla väärtuse järgi (näide: isik_id=34222)<br />

kui ka päringute puhul, kus ridu otsitakse mingi väärtuste vahemiku<br />

alusel (näide: isik_id BETWEEN 432432 AND 432499).<br />

4. Igal tabelil võiks olla üks klasterdatud indeks, mille alusel on tabeli read<br />

andmebaasi sisemisel tasemel sorteeritud.<br />

5. Väldi kattuvaid indekseid – indeksid, milles on üks või rohkem ühine<br />

veerg. Sellised indeksid tekitavad andmebaasisüsteemile segadust ja<br />

süsteem ei pruugi koostada tänu sellele lausele kõige paremat<br />

võimalikku täitmisplaani. Üks põhjus, miks andmebaasis võidakse luua<br />

kattuvaid indekseid on see, et uue indeksi loomisel ei arvestata<br />

andmebaasis automaatselt loodud indeksitega.<br />

6. Lindeks ei ole tasuta lõuna – lisa indeks vaid siis, kui seda on hädasti<br />

vaja.<br />

7. Töökiiruse huvides võib aja möödudes liitindeksisse veerge juurde<br />

lisada, sealt veerge eemaldada – vastavalt hetkel kõige olulisematest<br />

päringutest tulenevatele nõudmistele. Mida rohkem veergusid on<br />

hõlmatud liitindeksi I poolt, seda vähem on I-st kasu päringu korral, mis<br />

ei kasuta täpselt I poolt hõlmatavaid veerge.<br />

8. Ole veeru indekseerimisega väga ettevaatlik, kui selles veerus<br />

muudetakse sageli andmeid. Andmete muutmine tingib vajaduse<br />

muuta ka indeksit ja see on suhteliselt aeganõudev protsess.<br />

41


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

9. Indeks ei ole midagi sellist, mida saab luua ja siis unustada.<br />

Andmebaasi administraator peab regulaarselt indeksit jälgima ja<br />

hooldama. Kui indeks hakkab töökiirust kahjustama, siis tuleb see<br />

eemaldada.<br />

10.Väldi B-puu indekseid veergudel, kus on palju ühesuguseid väärtuseid.<br />

11.Indeksid, mille alusel saab vastata päringule ilma tabeli plokke<br />

lugemata (ingl. k. covering index), on kasulikud, kuid praktikas<br />

kasutatakse neid liiga palju. See võib halvendada päringute töökiirust.<br />

1<strong>2.</strong>Bitmap indeksid on kasulikud suurte andmehulkadega (terabaidid,<br />

petabaidid) andmebaasides, eriti andmeaitades.<br />

<strong>2.</strong><strong>2.</strong>3.20 Indeksi kasutamine andmebaasisüsteemi poolt<br />

Andmebaasisüsteemi üks moodul on optimeerija, mille ülesandeks on valida<br />

välja kiireim viis andmekäitluskeele lause täitmiseks. Optimeerimise moodul<br />

peab ka valima, kas ja milliseid indekseid lause täitmiseks kasutatakse.<br />

Optimeerimise moodul koostab päringu täitmisplaani (ingl. k. Query Execution<br />

Plan). Andmebaasisüsteemi üheks võimalikuks funktsionaalsuseks on<br />

analüüsimine, miks mingi päring töötab aeglaselt ja kuidas seda võib<br />

kiirendada.<br />

Näide: Andmebaasisüsteemis PostgreSQL on võimalik kasutada SQL käsku<br />

EXPLAIN, mis näitab päringu füüsilist täitmisplaani (vt. teema 11). EXPLAIN<br />

käsku saab kasutada erinevate päringute täitmisaja hindamiseks. Süntaks:<br />

EXPLAIN [ VERBOSE ] query<br />

See käsk näitab PostgreSQLi poolt genereeritavat lause täitmisplaani.<br />

Täitmisplaan kirjeldab sisemise taseme operatsioonid ning nende täitmise<br />

järjekorra, mida andmebaasisüsteem peab läbi viima välisel või<br />

kontseptuaalsel tasemel esitatud lause täitmiseks. Näiteks juhul, kui<br />

ühendatakse kokku mitu tabelit, näidatakse millise algoritmi alusel ridu<br />

ühendatakse (võimalike algoritmide näited on nested loop join, hash join,<br />

merge join).<br />

Näide:<br />

EXPLAIN SELECT * FROM Emp NATURAL JOIN Dept;<br />

QUERY PLAN<br />

--------------------------------------------------------------------<br />

Hash Join (cost=18.00..4<strong>2.</strong>25 rows=570 width=198)<br />

Hash Cond: ("outer".deptno = "inner".deptno)<br />

-> Seq Scan on emp (cost=0.00..15.70 rows=570 width=108)<br />

-> Hash (cost=16.40..16.40 rows=640 width=92)<br />

-> Seq Scan on dept (cost=0.00..16.40 rows=640 width=92)<br />

(5 rows)<br />

Andmebaasisüsteem koostab mitu võimalikku täitmisplaani ja arvutab<br />

andmebaasi statistikat kasutades välja iga plaani maksumuse – hinnangu<br />

42


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

lause täitmise kiirusele. Seejärel valib andmebaasisüsteem plaanide hulgast<br />

kõige madalama maksumusega plaani. Selle plaani alusel täidab<br />

andmebaasisüsteem kasutaja poolt esitatud lause.<br />

Plaani maksumuse arvutamisel ei arvestata sellega, kui palju kulub aega<br />

serveril olevate ridade saatmiseks kliendile. See aga võib olla koht, kus tekib<br />

üsna suur ajakulu.<br />

Näide: Andmebaasisüsteemis MS Access (2007) saab kasutada vahendit<br />

Perfomance Analyzer.<br />

Näide: Andmebaasisüsteemis MS Access (2007).<br />

• Primaarvõtme alusel luuakse automaatselt indeks.<br />

• Täiendava unikaalsuse kitsenduse UNIQUE alusel luuakse<br />

automaatselt indeks.<br />

<strong>2.</strong>3 Klassifikaatorite tabelid<br />

Näited.<br />

- Kliendi liik<br />

- Kliendi seisundi liik<br />

- Amet<br />

- Riik<br />

- Keel<br />

- Kauba liik<br />

Klassifikaatorite tabelis hoitavad andmed kirjeldavad mingis teises – tavaliselt<br />

palju suuremas – tabelis olevaid andmeid. Taoliste tabelite kasutamine aitab<br />

kontrollida kasutajate poolset andmete sisestust. Näiteks kasutaja saab<br />

registreerida tabelis Klient olevasse välisvõtme veergu ainult sellise kliendi<br />

liigi koodi, mis leidub tabelis Kliendi_liik.<br />

Klassifikaatorite tabelites olevad andmed tuleb andmebaasis registreerida<br />

enne andmebaasi kasutuselevõttu lõppkasutajate poolt. Ilma nende<br />

andmeteta ei saa lõppkasutajad andmebaasi kasutada.<br />

Juba kontseptuaalse andmebaasi projekteerimise käigus võib<br />

kontseptuaalses andmemudelis esitada vastavad olemitüübid. Loogilise<br />

<strong>disain</strong>i käigus tuleb kõik leitud tabelite veerud üle vaadata. Kui mingi veeru<br />

jaoks on teada võimalike väärtuste hulk, siis tuleks selle põhjal luua just<br />

taoline klassifikaatori tabel.<br />

Kliendi_liik(kliendi_liigi_kood, nimetus, kirjeldus)<br />

Primaarvõti (kliendi_liigi_kood)<br />

Alternatiivvõti(nimetus);<br />

Klient (klient_id, eesnimi, perenimi, kliendi_liig_kood)<br />

Primaarvõti(klient_id)<br />

Välisvõti (kliendi_liigi_kood) Viitab Kliendi_liik(kliendi_liigi_kood);<br />

43


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Klassifikaatorite tabelites hoitavad andmed muutuvad harva ja tuleks<br />

dokumenteerida juba andmebaasi projekteerimise käigus (nt. loogilise <strong>disain</strong>i<br />

faasis). Sellistes tabelites olevate andmete väljapakkumine on konkreetse<br />

allorganisatsiooni ülesanne, kuid nende kinnitamine ja sisestamine peaks<br />

olema andmete administraatori ja juhtkonna otsustada.<br />

Seega ei peaks klassifikaatorite koodid (nt. kliendi liigi kood) olema<br />

surrogaatvõtmed. Selliste koodide väärtused dokumenteeritakse ja<br />

sisestatakse andmebaasi volitatud kasutajate poolt (st. koodi väärtust ei<br />

genereeri süsteem).<br />

Miks on kasulik, et andmebaasi kasutajad saavad ise klassifikaatorite koode<br />

sisestada.<br />

Näide: Kui on kindlalt teada, et kood 2 tähistab püsiklienti, siis saab<br />

püsiklientide andmete leidmiseks teha päringu:<br />

SELECT * FROM Klient WHERE kliendi_liigi_kood=2;<br />

selle asemel et teha päring:<br />

SELECT Klient.* FROM Klient INNER JOIN Kliendi_liik ON<br />

Klient.kliendi_liigi_kood=Kliendi_liik.kliendi_liigi_kood WHERE<br />

Kliendi_liik.nimetus='Püsiklient';<br />

Näide: Kui on teada, et enamik registreeritavaid kliente on "tavalised" kliendid,<br />

keda tähistav kood on 1, siis saab deklareerida tabelis Klient veerule<br />

kliendi_liigi_kood vaikimisi väärtuse 1.<br />

ALTER TABLE Klient ALTER COLUMN kliendi_liigi_kood SET DEFAULT 1;<br />

Samuti tuleb läbi mõelda klassifikaatori koodidele vastavate veergude tüübid.<br />

Näiteks tabelis Kliendi_liik on veerg kliendi_liigi_kood. Milline võiks olla selle<br />

veeru tüüp? Mõttesse tulevad täisarvutüübid INTEGER ja SMALLINT. Milline<br />

nendest tüüpidest valida?<br />

Tüüpi INTEGER kuuluvad täisarvud vahemikus -2147483648 kuni<br />

+2147483647.<br />

Tüüpi SMALLINT kuuluvad täisarvud vahemikus 32768 kuni +32767.<br />

Andmebaasi <strong>disain</strong>er peaks mõtlema, milline on pikas perspektiivis erinevate<br />

kliendi koodide hulk. Kui see hulk jääb alla 32767, siis tuleks tüübiks valida<br />

SMALLINT.<br />

Sageli pole klassifikaatorite koodid üldse täisarvu tüüpi. Näiteks<br />

rahvusvaheline riikide klassifikaator (ISO 3166 Codes (Countries))<br />

http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.html<br />

näeb ette, et iga riigi kohta kahetähelise koodi, kolmetähelise koodi ja kolmest<br />

numbrist koosneva koodi. Eesti puhul on need koodid vastavalt "EE", "EST",<br />

44


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

233. Seega, kui hakkate looma tabelit Riik, siis pole mingit mõtet lisada sinna<br />

veergu a'la riik_id, kus on kasutaja väljamõeldud täisarvud. Selle asemel peab<br />

tabelis Riik primaarvõtme veeruks olema veerg, kus on rahvusvaheliselt<br />

väljatöötatud ja tunnustatud koodid.<br />

Füüsiline <strong>disain</strong>: Kuna klassifikaatorite tabeleid kasutatakse sageli päringutes<br />

tuleks nad kõvaketaste massiivi kasutamise korral paigutada kiirele ja<br />

vähekasutatavale kõvakettale. Kuna sellistes tabelites muutuvad andmed<br />

harva, siis võivad tabeli andmed peaaegu vastava plokki täita (plokki võib jätta<br />

5% vaba ruumi). Kuna sellised tabelid on suhteliselt väikesed, siis indeksite<br />

lisamine neile ei anna tavaliselt erilist kasu. Enamasti hoitakse sageli<br />

kasutatavaid ja väikeseid tabeleid andmebaasisüsteemi poolt mälupuhvris,<br />

kus nende poole pöördumine on väga kiire. Tuleks kontrollida, et<br />

andmebaasisüsteemi mälupuhver on kõigi taoliste tabelite hoidmiseks<br />

piisavalt suur.<br />

<strong>2.</strong>4 Vaadete <strong>disain</strong><br />

Nõudmiste kogumise ja analüüsi käigus leitud vaadete realiseerimine,<br />

kasutades konkreetse andmebaasisüsteemi võimalusi (vt. teema 5).<br />

Jällegi pakuvad erinevad andmebaasisüsteemid erinevaid võimalusi.<br />

• Vaateid ei saa üldse kasutada (ja selline andmebaasisüsteem reklaamib<br />

ennast relatsioonilisena – naerukoht :-) ).<br />

• Vaateid saab luua, kuid läbi vaadete ei saa ilma täiendavat koodi<br />

kirjutamata muuta andmeid baastabelites. Sellise andmebaasisüsteemi<br />

näiteks on PostgreSQL, kus vaate kaudu andmete muutmise<br />

võimaldamiseks tuleb luua reeglid (CREATE RULE käsuga).<br />

• Vaateid saab luua. Läbi vaadete saab muuta andmeid baastabelites<br />

lähtuvalt SQL:1992 standardis kirjeldatud nõudmistest (andmeid ei saa<br />

baastabelites muuta kui vaate alampäring sisaldab ühendamise<br />

operatsiooni).<br />

• Vaateid saab luua. Läbi vaadete saab muuta andmeid baastabelites<br />

lähtuvalt SQL:2008 standardis kirjeldatud nõudmistest (andmeid ei saab<br />

baastabelites muuta ka läbi ühendamise operaatori poole pöördumist<br />

sisaldavate vaadete).<br />

<strong>2.</strong>5 Julgeolekumehhanismide <strong>disain</strong><br />

Nõudmiste kogumise käigus leitud julgeolekule esitatavate nõudmiste<br />

realiseerimine, kasutades konkreetse andmebaasisüsteemi võimalusi<br />

(vt. teema 6).<br />

3. Mõisted<br />

Eesti keeles<br />

Füüsiline <strong>disain</strong><br />

Inglise keeles<br />

Physical design<br />

45


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

Eesti keeles<br />

Transaktsioonanalüüs<br />

Sorteerimata fail<br />

Sorteeritud fail<br />

Sorteeritud andmefail, millele on<br />

defineeritud primaarne indeks<br />

Füüsiline kirje<br />

Tabeliruum<br />

Indeks<br />

Primaarne indeks<br />

Sekundaarne<br />

Teisene indeks<br />

Unikaalne indeks<br />

Liitindeks<br />

Mitmekomponendiline indeks<br />

B-puu<br />

Tasakaalustatud puu<br />

Kahendpuu<br />

Bitmap indeks<br />

Bitmap-joini indeks<br />

Klasterdatud indeks<br />

Klastri võti<br />

Päringu täitmisplaan<br />

Hõe indeks<br />

Tihe indeks<br />

Klassifikaatori tüüpi tabel<br />

Inglise keeles<br />

Transaction analysis<br />

Ordered (sequential) file<br />

Unordered (heap) file<br />

Indexed sequential file<br />

Physical record<br />

Block<br />

Page<br />

Tablespace<br />

Index<br />

Primary index<br />

Secondary index<br />

Unique index<br />

Concatenated index<br />

Compound index<br />

Composite index<br />

Multicolumn index<br />

B-tree<br />

Balanced tree<br />

Binary tree<br />

Bitmap index<br />

Bitmap join index<br />

Clustered index<br />

Cluster key<br />

Query execution plan<br />

Sparse index<br />

Dense indeks<br />

Reference table<br />

4. Kasutatud materjalid<br />

1. Andros, G., 200<strong>2.</strong> An Analysis and Methodology of Pl/SQL Program<br />

Tuning. Master’s Thesis. Tallinn Technical Univesity, Institute of<br />

Informatics. 93 p.<br />

<strong>2.</strong> Connolly, T.M. & Begg, C.E., 2001. Database systems. A Practical<br />

Approach to Design, Implementation and Management. Third Edition.<br />

Pearson Education. 1236 p.<br />

3. Garcia-Molina, H. & Ullman, J. D., 2000. Database System<br />

Implementation. Prentice-Hall. 653 p.<br />

4. Gulutzan, P. & Pelzer, T., 2003. SQL Performance Tuning. Addison-<br />

Wesley. 495 p.<br />

5. Harrison, G., 2000. Oracle SQL High-Performance Tuning. Second<br />

Edition. Prentice Hall. 630 p.<br />

6. Index Organized Tables (IOT). Oracle-Base. [WWW]<br />

http://www.oracle-base.com/articles/8i/IndexOrganizedTables.php<br />

(11.05.2004)<br />

7. Kulkarni, K., 2003. Overview of SQL:2003. 2003-11-06. [WWW]<br />

46


TTÜ: Andmebaasi füüsiline <strong>disain</strong> (2012)<br />

© Erki Eessaar<br />

http://www.wiscorp.com/sql/SQL2003Features.pdf (24.1<strong>2.</strong>2004)<br />

8. Kyte, T., 2001. Expert one-on-one Oracle. Wrox Press Ltd. 1297 p.<br />

9. Lighstone, S., Teorey, T. & Nadeau, T., 2007. Physical database design.<br />

The databse professional's guide to exploiting indexes, views, storage,<br />

and more. Morgan Kaufmann Publishers. 427 p.<br />

10.Oracle 8i Data Warehousing Guide Release (8.1.6)<br />

11.Oracle9i Data Warehousing Guide Release 2 (9.2) Part Number A96520-<br />

01. 6. Indexes.<br />

1<strong>2.</strong>Pöial, J. Kahendpuu, kuhi, AVL-puu, B-puu, jt. [WWW]<br />

http://www.itcollege.ee/~jpoial/algoritmid/puustruktuurid.html (15.05.2005)<br />

13.Rational Unified Process 2002 05.01.01<br />

47

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!