MainframeSupports
tip uge 6/2001:

Hvor farligt eller dyrt er det egentligt at lave en SELECT * FROM en eller anden meget stor tabel, hvor der hverken er angivet en WHERE, en GROUP BY eller en ORDER BY. Svaret er, at det afhænger ret meget af, hvilket værktøj, man udsteder den med. Uanset om SELECT'en laves i ens eget program eller vha. SPUFI, QMF, DSNTEP2, SAS eller lignende, så udføres selve SQL-kaldet ens i alle tilfælde. For at få fat i den første række i tabellen skal der udstedes en FETCH og for at få fat i den næste skal der udstedes yderligere en FETCH og så fremdeles. Så det er helt op til programmet, hvornår der ikke skal laves flere FETCH.

Det specielle ved en SELECT * FROM uden WHERE, GROUP BY eller ORDER BY er, at DB2 ved, at ingen rækker skal filtreres fra, og der skal ikke foretages nogen form for sortering. Derfor vil DB2 på simplest mulig måde hente data ind fra tabellen og returnere dem til programmet hurtigst muligt. Hvis programmet holder op med at lave FECTH fra tabellen, så holder DB2 også op med at læse data fra tabellen. Konsekvensen er, at uanset hvor stor tabellen er, så vil man få fat i data fra tabellen utroligt hurtigt. Den bestemmende faktor er, hvornår programmet holder op med at læse fra tabellen.

I QMF er det på 99.99% af alle DB2-installationer ganske ufarligt at udstede en SELECT * FROM. Det skyldes, at QMF har indbygget en parameter for, hvor mange rækker (antal FETCH), den læser ind ad gangen. Denne parameter kan man stille ved installationen af QMF og man kan faktisk også temporært ændre den ved opstart af QMF, men det kræver, at man laver sin egen opstartsprocedure af QMF.

I SPUFI er det også relativt ufarligt med en SELECT * FROM, da SPUFI har en parameter der styrer hvor mange rækker den maksimalt læser. Hvis man sætter parameteren til 0, så vil SPUFI forsøge at læse alle rækker og det er jo ikke altid lige godt. Her bliver man typisk reddet af, at output-datasettet løber fuldt. Mange andre produkter som eksempelvis File-AID for DB2 og Access for DB2 har også en grænse indbygget, som kan justeres fra SQL-kald til SQL-kald.

I ens egne programmer er man selv herre over tingene, men i SAS og med DSNTEP2 skal man passe rigtig godt på. Disse programmer stopper først deres FETCH-loop, når den sidste række er læst.

Forrige danske tip        Last tip in english        Tip oversigten