MainframeSupports
tip uge 40/2007:

Tilbage i uge 26/2003 skrev jeg et tip om, hvordan du kan optimere en lille smule på en type SQL-kald, der er meget udbredt i de fleste DB2 applikationer. Med DB2 version 8 i new function mode er det muligt at optimere yderligere på denne type SQL-kald under forudsætning af, at de i forvejen returnerer een række (med andre ord er der altså tale om en SELECT INTO). Faktisk er der tale om en meget stor forbedring. Jeg har oplevet besparelser på 60-70% på CPU-forbruget og op til 80% på antallet af getpages. Der er altså tale om noget, der virkelig rykker.

Et eksempel på et SQL-kald før optimering (findes i mange lignende udgaver på stort set enhver DB2-installation) ser således ud:

SELECT columna, columnb
INTO :columna, :columnb
FROM tablex x
WHERE keycolumn1 = :key
  AND keycolumn2 =
( SELECT MAX(keycolumn2)
  FROM tablex
  WHERE keycolumn1 = x.keycolumn1
)

Hvis du har fulgt mit tidligere forslag hedder sidste linie WHERE keycolumn1 = :key. Med DB2 version 8 i new function mode kan du omskrive dette SQL-kald til:

SELECT columna, columnb
INTO :columna, :columnb
FROM tablex
WHERE keycolumn1 = :key
ORDER BY keycolumn2 DESC
FETCH FIRST ROW ONLY

Dette SQL-kald er lovligt i DB2 version 8 i new function mode. Hvis din DB2 ikke er fuldt opgraderet, så vil du få en syntaksfejl, da det hidtil ikke har været tilladt at benytte ORDER BY på en SELECT INTO. Væk er den irriterende subselect, der hidtil har været nødvendig for at få fat i den række med den højeste værdi af keycolumn2. Nu klarer ORDER BY keycolumn2 DESC den opgave for dig, og som nævnt er dette SQL-kald langt mere effektivt end det forrige uanset udseendet af subselecten.

Forrige danske tip        Last tip in english        Tip oversigten