2. Füüsiline disain
2. Füüsiline disain
2. Füüsiline disain
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
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