MainframeSupports
tip uge 46/1999:

Vi håber, at rigtig mange mennesker benytter DB2's SQL EXPLAIN statement før de udfører SQL-kald, som de mistænker for at give dårlig performance. Når et SQL-statement skal udføres dynamisk, så vil en EXPLAIN af det pågældende statement give den nøjagtige access path. Men hvad hvis nu det er et statisk SQL-kald med host-variable. Så er man nødt til at erstatte sine host-variable med noget andet. Og her kan man anvende et ? i stedet for en konkret værdi.

Følgende statiske SQL-kald:
 

EXEC SQL
  SELECT MAX(a), MAX(b)

  INTO :a, :b
  FROM TABELX
  WHERE N > :n
 
kan altså omskrives til:
 
EXPLAIN PLAN FOR
  SELECT MAX(a), MAX(b)
  FROM TABELX
  WHERE N > ?
 
Bemærk, at INTO skal væk, da INTO kun eksisterer i statiske SQL-kald og EXPLAIN kun udfører dynamiske SQL-kald. Nu er eksemplet rimeligt simpelt, men fidusen er, at hvis man i sin EXPLAIN erstatter ? med en værdi, så er det ikke sikkert, at man får samme access path som i det statiske SQL-kald. Det gør man til gengæld ved at anvende ?.

Bemærk iøvrigt at fra og med DB2 version 5 kan man med BIND-option REOPT(VARS) få DB2 til at re-evaluere sin access path for statiske SQL-kald på eksekveringstidspunktet baseret på indholdet af host-variablene. Generelt er REOPT(VARS) en dårlig ide, da re-evalueringen sker for hvert eneste SQL-kald i den pågældende package/plan, som indeholder host-variable, der har betydning for valg af access path. Du kan læse mere om REOPT(VARS) i DB2 administration guide for DB2 V5.

Sidste uges tip        Tip oversigten