Omslaget. Klicka här för att gå till bokens hemsida.

Databasteknik: Svar till övningar - kapitel 22, övning 3, Sekundärindex

Vi antar som tidigare att sid är en nyckel, så att sökningen på sid ger (högst) en enda rad i svaret.

Den första frågan, dvs sökningen på pid, påverkas inte av det nya indexet, och tar fortfarande 20 millisekunder att köra.

Sökningen på pid använde ett primärindex, medan sökningen på sid använder ett sekundärindex. Ett sekundärindex är inte ordnat i samma ordning som datafilen, och därför räcker det inte med att lövnoderna i indexet innehåller en enda pekare till varje datablock. I stället måste lövnoderna innehålla en pekare till varje datapost.

Det finns en miljard dataposter. Den första nivån i indexet innehåller 1000000000 / 683, dvs 1464129, indexblock. Den andra nivån i indexet innehåller 1464129 / 683, dvs 2143, indexblock. Den tredje nivån i indexet innehåller 2143 / 683, dvs 3, indexblock. Den fjärde nivån i indexet består av ett rotblock. Indexet har alltså fyra nivåer.

För att hitta en datapost baserat på dess sid-värde behövs fem läsningar från disken: fyra indexblock och sen det utpekade datablocket. Eftersom läsning av ett block tar i genomsnitt 5 millisekunder, kan vi räkna med att hela SQL-frågan tar 25 millisekunder att köra, dvs 0.025 sekunder.

(En kommentar: Om indexet T2 skapas efter att tabellen är fylld med data, kanske det inte innehåller så mycket tom plats i indexblocken. Den effektiva ordningen på trädet blir då större, och trädet kan bli lägre. Med ett "perfekt" index, med en effektiv ordning på 1024, skulle det i det här exemplet räcka med tre nivåer.)

Sammanfattning

Sökningen på sid kräver en extra diskläsning jämfört med sökningen på pid, eftersom sekundärindexet på sid är en nivå djupare än primärindexet på pid. Den lilla skillnaden mellan 20 och 25 millisekunder är precis vad man kan förvänta sig mellan ett primär- och sekundärindex.


Av Thomas Padron-McCarthy (e-post: boken@databasteknik.se)
Senaste ändring: 30 juli 2005