2. SQL HiA
Indekser
• B-Trær Indeks bygget opp som tre-struktur.
Benyttes typisk på foreign key.
• Hash-tabeller Nøkkel-tranformering.
Benyttes typisk på primary key (ID).
Clustered Index:
Bestemmer fysisk rekkefølge på data
i database-tabeller.
Kun en clustered index pr tabell.
Må alltid lages før non-clustered index.
Må alltid lages før data plasseres i tabellen.
4. SQL HiA
B-Trær
Et B-Tre av orden m er definert ved følgende:
- Roten er enten et løv eller har mellom 2 og m barn.
- Alle ikke-løv (evnt. bortsett fra roten) har mellom [m/2] og m barn.
- Alle løv befinner seg på samme nivå.
12 15 25 31 41 59 91
21 48 72
1-4-8-11 12-13 15-18-19 21-24 25-26 31-38 41-43-46 48-49-50 59-68 72-78 84-88 91-92-99
84
5. SQL HiA
B-trær Eks: Innsetting i et B-tre av orden 4 (1)
8,11,12 16,17 41,5222,23,31 58,59,61
16:- 41:58
22:-
6. SQL HiA
B-trær Eks: Innsetting i et B-tre av orden 4 (2)
8,11,12 16,17,18 41,5222,23,31 58,59,61
16:- 41:58
22:-
7. SQL HiA
B-trær Eks: Innsetting i et B-tre av orden 4 (3)
1,8 11,12 41,5222,23,31 58,59,61
11:16 41:58
22:-
16,17,18
8. SQL HiA
B-trær Eks: Innsetting i et B-tre av orden 4 (4)
1,8 11,12 41,5222,23,31 58,59,61
11:16 41:58
22:-
16,17 18,19
9. SQL HiA
B-trær Eks: Innsetting i et B-tre av orden 4 (5)
1,8 11,12 41,5222,23,31 58,59,61
11:- 41:58
16:22
16,17 18,19
18:-
10. SQL HiA
B-trær Eks: Innsetting i et B-tre av orden 4 (6)
1,8 11,12 41,5222,23 58,59,61
11:- 41:58
16:22
16,17 18,19
18:-
28,31
11. SQL HiA
B-trær Eks: Innsetting i et B-tre av orden 4 (7)
1,8 11,12 41,5222,23 58,59,61
11:- 58:-
16:22
16,17 18,19
18:-
28,31
28:-
12. SQL HiA
B-trær Eks: Innsetting i et B-tre av orden 4 (8)
1,8 11,12 41,5222,23 58,59,61
11:- 58:-
22:-
16,17 18,19
18:-
28,31
28:-
16:- 41:-
21. SQL HiA
Nøkkel-tranformering - Uheldig tranformering
HSize = 10000
KeySize = 8
HValueMax = 8 * 127 = 1016
1016
10000
Tranformering av hvert tegn i Key
til tilhørende ordinal-verdi:
22. SQL HiA
Ulike nøkkel-transformeringer
int Hash1(char* Key, int HSize)
{
return ((int)Key[0] + (int)Key[1] + (int)Key[2]) % HSize;
}
Transformed
Key Data
Key
int Hash2(char* Key, int HSize)
{
return ((int)Key[0] + 27 * (int)Key[1] + 729 * (int)Key[2]) % HSize;
}
23. SQL HiA
Ulike nøkkel-transformeringer
[ ]Key KeySize i i
i
KeySize
−
=
−
∑ *32
0
1
int Hash3(char* Key, int KeySize, int HSize)
{
int HashVal;
HashVal = (int)Key[0];
for(int i = 1; i < KeySize; i++)
HashVal = HashVal*32 + (int)Key[i];
HashVal = HashVal % Hsize;
return HashVal;
}
Transformed
Key Data
Key
24. SQL HiA
Hashing a key to a database page - SQLBase
1. Transformer symbolsk key ved å la hvert tegn bli representert ved tilhørende ASCII-verdi.
Deretter transformeres denne ASCII-verdien som vist nedenfor til et såkalt binært fullword (4 bytes).
1A. Del ASCII-key inn i 4-byte enheter.
1B. XOR alle 4-byte enhetene sammen til et 4-byte resultat (ingen key-del blir borte).
1C. Utfør bitwise complement (fjerner event. bias)
2. Transformer resultatet fra 1 (binary fullword) til et heltall i side-intervallet
ved å ta divisjonsresten med minste primtall som er større enn eller lik antall sider.
3. Transformer output fra 2 til en fysisk side adresse
ved å legge til start side-nummer for for første rad i tabellen.
Indekser er hjelpeinformasjon for raskere å kunne gjenfinne poster (records)
i en database.
Ofte benyttes såkalte B-trær som indekser (typisk på fremmednøkler).
På ID benyttes av og til såkalte Hashtabeller.
Hashtabellene inneholder transformerte ID (tranformert til en post-adresse).
Hash1 gir dårlig spredning.
Bl.a. vil ID_1 = abc og ID_2 = cba gi samme adresse.
Has2 gir en noe bedre spredning idet nøkkelen nå utgjør et posisjons-system
ved at endret rekkefølge av elementene i ID gir ulik adresse.