MainframeSupports
tip uge 06/2006:

For tre uger siden genudgav jeg et gammelt tip på engelsk om join af kolonner med forskellige definitioner. Genudgivelsen medførte straks en reaktion fra en af jer trofaste læsere. "Du, Claus, DB2 kan altså godt finde ud af at benytte et indeks, selv om CHAR funktionen er involveret." Stor var min overraskelse, da det viste sig at holde stik og faktisk har det virket siden version 7.

Jeg vil som følge af denne nye viden lige vise, hvordan opgaven fra det gamle tip rent faktisk kan løses med et enkelt SQL-kald:

SELECT K.KUNDENR, K.POSTNR, I.ORDRENR, I.ORDRETYPE
FROM KUNDE K, INTERNETORDRE I
WHERE CHAR(K.KUNDENR) = I.KUNDENR
  AND K.INTERNETKUNDE = 'J'

Under forudsætning af, at der er et indeks, hvor kundeNr i tabel internetOrdre er den første kolonne, så kan ovenstående SQL-kald benytte sig af dette indeks. Dette er et godt eksempel på, hvad der sker med ens viden om, hvordan DB2 vil og kan udføre SQL-kald. Den ruster over tid, fordi nye releases forbedrer DB2 optimizeren.

Med DB2 version 8 er DB2 endelig nået derhen, hvor mange af os havde forventet, at DB2 var for mindst 10 år siden med hensyn til anvendelse af index. Jeg vil derfor bringe et par nyttige links. For hver version af DB2 har IBM udgivet en oversigt over de prædikater eller betingelser, som DB2 i den pågældende version kan finde på at bruge index til at løse. Her finder du oversigten for Version 7 og her oversigten for Version 8.

Nu kan du ved selvsyn gå ind og konstatere, at der er markante forskelle. Oversigten er i Version 8 blevet en del større, fordi version 8 kan mere. Der er en vigtig detalje, der er blevet "udeladt" i version 8. Hvis du nærlæser noterne til oversigten skal du især bemærke note 3 til version 7, som omhandler forskelle i kolonne definitioner. En tilsvarende note findes ikke for version 8. Forenklet udtrykt, så kan DB2 version 8 bruge index mellem forskellige numeriske datatyper og mellem forskellige ikke-numeriske datatyper, dog med de (meget få) begrænsninger, der er beskrevet i noterne.

For at vende tilbage til eksemplet, så kan CHAR-funktionen konvertere en numerisk datatype til en ikke-numerisk datatype, som derfor kan anvende index. Sjovt nok kan DECIMAL-funktionen konvertere en ikke-numerisk datatype til en numerisk, men kan ikke anvende index. Det står der selvfølgelig ikke noget om. DB2 tillader forsat ikke, at man sammenligner numeriske og ikke-numeriske værdier, og sådan vil det fortsat være i de næste mange DB2 versioner.

Forrige danske tip        Last tip in english        Tip oversigten