MainframeSupports
tip uge 36/2011:

Som du sandsynligvis allerede ved, så er DB2 i stand til at undgå at slå op i selve tabellen, hvis alle kolonner tilhørende tabellen findes i samme index. Dette fænomen kaldes et Index Only opslag. Hvad du måske ikke ved, eller ikke tænker over er, at DB2 også har en feature kaldet index-screening, som jeg har omtalt i uge 28/2000. Index-screening kan faktisk udnyttes til at tune WHERE-delen af et SQL-kald.

Forestil dig en tabel T med kolonnerne A, B, C, D, E, F og G. På tabellen er der defineret et index bestående af D, A, G i den angivne rækkefølge. Du har fundet følgende SQL-kald, der udstedes mod tabellen:

SELECT *
FROM T
WHERE D = :d AND A = :a AND B = 3

Dette SQL-kald ser fint ud, når du kigger på resultatet af en EXPLAIN. Der er to kolonner, der matcher, så her kan der vist ikke tunes mere. Og det kan der så alligevel. Hvis indexet bestående af D, A, og G kan udvides med kolonne B, så vil DB2 ikke skulle slå op i data for at finde ud af, hvad værdien af kolonne B er. Det kan spare rigtig meget. Faktisk vil en udvidelse af indexet gøre selve WHERE-delen til Index Only, selv om det ikke fremgår af EXPLAIN-resultatet.

Du skal være opmærksom på, at en udvidelse af et index med en eller flere kolonner kan få antallet af niveauer i indexet til at stige og dermed vil du ikke vinde noget, da det sparede opslag i data pludselig bliver til et ekstra opslag i indexet, og andre SQL-kald, der benytter samme index, men uden at anvende den ekstra kolonne, vil blive straffet. Det giver heller ikke megen mening at udvide indexet med en ekstra kolonne, hvis denne kolonne indeholder samme værdi for de fleste rækker, og det er denne værdi, der bruges hyppigst ved opslag.

I version 10 af DB2 kan man faktisk tilføje ekstra kolonner til et index, der i forvejen er et unikt index, uden at det går ud over kontrollen af entydighed. Dit index kan altså bestå af kolonne A, B og C, men være unikt på A og B. Jeg er dog ret sikker på, at antallet af niveauer i indexet stadig påvirkes, hvis sådan et index tilføjes mange nye kolonner eller en enkelt pladskrævende kolonne. Så det skal du lige holde øje med, hvis du vil bruge dette tip sammen med denne nye mulighed i DB2 10.

Forrige danske tip        Last tip in english        Tip oversigten