250 likes | 388 Views
Indekser. Indekser. B-Trær Indeks bygget opp som tre-struktur. Benyttes typisk på foreign key.
E N D
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.
Clustered Index / Non-Clustered Index Clustered Non-Clustered Index Data
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å. 21 48 72 12 15 25 31 41 59 84 91 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
B-trær Eks: Innsetting i et B-tre av orden 4 (1) 22:- 16:- 41:58 8,11,12 16,17 22,23,31 41,52 58,59,61
B-trær Eks: Innsetting i et B-tre av orden 4 (2) 22:- 16:- 41:58 8,11,12 16,17,18 22,23,31 41,52 58,59,61
B-trær Eks: Innsetting i et B-tre av orden 4 (3) 22:- 11:16 41:58 1,8 11,12 16,17,18 22,23,31 41,52 58,59,61
B-trær Eks: Innsetting i et B-tre av orden 4 (4) 22:- 11:16 41:58 1,8 11,12 16,17 18,19 22,23,31 41,52 58,59,61
B-trær Eks: Innsetting i et B-tre av orden 4 (5) 16:22 11:- 18:- 41:58 1,8 11,12 16,17 18,19 22,23,31 41,52 58,59,61
B-trær Eks: Innsetting i et B-tre av orden 4 (6) 16:22 11:- 18:- 41:58 1,8 11,12 16,17 18,19 22,23 28,31 41,52 58,59,61
B-trær Eks: Innsetting i et B-tre av orden 4 (7) 16:22 11:- 18:- 28:- 58:- 1,8 11,12 16,17 18,19 22,23 28,31 41,52 58,59,61
B-trær Eks: Innsetting i et B-tre av orden 4 (8) 22:- 16:- 41:- 11:- 18:- 28:- 58:- 1,8 11,12 16,17 18,19 22,23 28,31 41,52 58,59,61
Hashing / Nøkkel-transformering / Randomisering Key Transformed Key Hashing
Nøkkel-transformering PNr = ID En-entydig sammenheng mellom PNr (Postnummer) og ID PNr ID 1 2 3 4 5 6 7 8 9 . . . 1 2 3 4 5 6 7 8 9 . . .
Nøkkel-transformering Distrikt 6 4 7 2 1 KundeNr TverrSum
Nøkkel-transformering 6 4 7 2 KundeNr 1 2 3 4 Vekttall 6 8 21 8 Produkt 6 4 7 2 3 KundeNr Siste siffer i tverrsummen av siste siffer i produktene
Nøkkel-transformering PNr = ID En-entydig sammenheng mellom PNr (Postnummer) og ID PNr ID Ubenyttet 1 … 10000 32191 51877 77638 32191 51877 77638
Hash-tabeller 34 4 67 7 8 1 21 3 73 8 62 7 68 7 86 9 3 34 1 1 67 6 2 2 4 8 3 3 1 21 4 4 Trans 34 ID 73 5 5 62 7 6 6 2 68 67 7 7 5 86 8 8 8 9 9 10 10
Nøkkel-tranformering - Folding ID = 29384756 PostNr [ 1 - 1000 ] Nøkkel- transformering 2 9 3 8 4 7 5 6 + 7 6 9 4 + 1 7 7 0
Nøkkel-transformering - Divisjon-rest-metoden ID = 29384756 PostNr [ 1 - 1000 ] Nøkkel- transformering 2 9 3 8 4 7 5 6 : 9 9 7 1 7 5
Nøkkel-tranformering - Uheldig tranformering Tranformering av hvert tegn i Key til tilhørende ordinal-verdi: 1016 HSize = 10000 KeySize = 8 HValueMax = 8 * 127 = 1016 10000
Ulike nøkkel-transformeringer Data Transformed Key Key int Hash1(char* Key, int HSize) { return ((int)Key[0] + (int)Key[1] + (int)Key[2]) % HSize; } int Hash2(char* Key, int HSize) { return ((int)Key[0] + 27 * (int)Key[1] + 729 * (int)Key[2]) % HSize; }
Ulike nøkkel-transformeringer Data Transformed Key Key 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; }
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.
Hashing a key to a database page - SQLBase - Eks 1. 9 3 0 5 E J S M --> 57 51 48 53 69 74 83 77 ASCII 1A. Key1 = 57 51 48 53 Key2 = 69 74 83 77 1B. Key1 = 0011 1001 0011 0011 0011 0000 0011 0101 XOR Key2 = 0100 0101 0100 1010 0101 0011 0100 1101 ------------------------------------------------------------------------- = xKey = 0111 1100 0111 1001 0110 0011 0111 1000 = 124 121 99 120 ASCII 1C. ~xKey = 1000 0011 1000 0110 1001 1100 1000 0111 = 131 134 156 135 ASCII bfKey = 2206637191 (fullword key) 2. Page Adresses 0 - 1752 (1753 hash buckets) 2206637191 MOD 1753 = 1110 3. Første side-adresse for tabellen er 60 => Side-adresse = 1110 + 60 = 1170