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.