MainframeSupports
tip uge 36/1999:

Efter at DB2 version 4 er kommet på banen har det været muligt at lave GROUP BY på expressions. Hvordan vil vi gerne give et eksempel på. Først den generelle fremgangsmåde:

     SELECT EXP_RESULT, COUNT(*)
     FROM ( SELECT <EXPRESSION AS EXP_RESULT
            FROM <TABLE
            WHERE <ET-ELLER-ANDET
          ) AS TEMP_TABLE
     GROUP BY EXP_RESULT

hvor <EXPRESSION erstattes med det udtryk, som man ønsker at lave sin GROUP BY på, <TABLE med den eller de tabeller, der benyttes til at danne <EXPRESSION og <ET-ELLER-ANDET erstattes med en WHERE-betingelse efter eget valg. Hvis man skal bruge en column-function i den yderste SELECT, så skal man selecte udtrykket/kolonnen til brug i den pågældende column-function i den inderste SELECT.

Her er et eksempel fra en installation, hvor system-navnet indgår i tabel-navnet som de tre første tegn. Installationen vil gerne vide, hvor mange tabeller, der er defineret i hvert system. Og så vil de også gerne vide, hvor mange rækker, der ialt er for alle tabellerne i hvert system. Det gøres således:

     SELECT TAB.SYSTEM_NAVN
          , COUNT(*) AS ANTAL_TABELLER
          , SUM(TAB.ROW_COUNT) AS ANTAL_RÆKKER
     FROM ( SELECT SUBSTR(NAME, 1, 3) AS SYSTEM_NAVN
                 , CARD AS ROW_COUNT
            FROM SYSIBM.SYSTABLES
            WHERE CREATOR = 'PROD'
          ) AS TAB
     GROUP BY TAB.SYSTEM_NAVN

Før man kaster sig ud i at benytte ovennævnte metode på meget store tabeller, så er det en god ide at køre en EXPLAIN for at finde ud af, hvordan DB2 rent faktisk vil udføre SQL-kaldet. Eftersom der typisk indgår en expression i select-listen for den inderste SELECT, så er det højst tænkeligt, at DB2 vil lave en temporær tabel, som selve GROUP BY delen så udføres på. Og hvis det temporære resultat er på mange millioner rækker, så er det ikke sikkert, at ens SQL-kald bliver færdigt inden for overskuelig tid. Bemærk for i øvrigt, at der i version 5 er kommet en ny kolonne kaldet CARDF, som er blevet det officielle antal rækker i en tabel. Kolonnen CARD findes og vedligeholdes dog stadig af RUNSTATS, selvom den ikke fremgår af dokumentationen længere.

Sidste uges tip        Tip oversigten