2. Füüsiline disain
2. Füüsiline disain
2. Füüsiline disain
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