MainframeSupports
tip uge 28/2017:

I DB2 er det blevet muligt at lave såkaldte index on expressions, det vil sige et index, hvor man i stedet for at bruge en eller flere kolonner, så definerer man index'et som et udtryk (expression). Det er endda muligt at kombinere expressions og kolonner, som du kender det fra et almindeligt index med flere kolonner.

Og hvad kan du så bruge index on expressions til. Lad mig give et eksempel. Du vil joine to tabeller. I TableA findes kolonnen KeyCol som er CHAR(10). I TableB findes kolonnerne KeyCol1 og KeyCol2, som begge to er CHAR(5) og tilfældigvis indeholder KeyCol1 det samme som de første 5 tegn i KeyCol og KeyCol2 de sidste fem tegn i keyCol. En join kan derfor se således ud:

SELECT *
FROM TableA A, TableB B
WHERE A.KeyCol = B.KeyCol1 !! B.KeyCol2

Problemet er bare, at DB2 ikke vil bruge et index for at udføre denne join. En løsning er:

SELECT *
FROM TableA A, TableB B
WHERE substr(A.KeyCol, 1, 5) = B.KeyCol1 
  AND substr(A.KeyCol, 6, 5) = B.KeyCol2

Hvis der er et index på (B.KeyCol1, B.KeyCol2), så kan DB2 godt finde ud af at starte i TableA og joine med TableB, men hvis TableA indeholder rigtig mange rækker og TableB meget få rækker, så vil denne join tage lang tid. I sådan et tilfælde vil det være langt bedre at starte i TableB. Og det kan du opnå ved at oprette følgende index:

CREATE INDEX IxOnExpr ON TableB
(KeyCol1 !! KeyCol2)

Nu vil det første SELECT statement kunne udnytte dette nye index til at starte i TableB og joine med TableA. Endnu bedre er det, hvis DB2 finder ud af, at TableA er den mindste tabel, så vil DB2 starte i TableA, uden at du behøver at omskrive din SELECT til den skitserede mulige løsning.

Jeg har allerede brugt index on expression i andre forbindelser end ovenstående, og det virker storartet. Jeg håber, du også kan få glæde af det, hvor det ellers er umuligt at få DB2 til at vælge en god accessvej.

Forrige danske tip        Last tip in english        Tip oversigten