I Uge 7/2007 skrev jeg om DB2 cross loader'en. I dette tip fremhævede jeg også muligheden for at udføre diverse SQL-kald som en del af input til DSNUTILB. Jeg er kommet på tanke om en særdeles nyttig anvendelse af denne feature, nemlig muligheden for at simulere LOAD REPLACE på en tabel, der ligger i et tablespace med flere tabeller. Som nogle af jer ved, og andre har fundet ud af på den hårde måde, så fjerner LOAD REPLACE alle data fra alle tabeller i det tablespace, som den tabel, man vil loade data ind i, befinder sig.
I stedet for at bruge LOAD REPLACE anvender du i stedet en SQL DELETE efterfulgt af en LOAD RESUME YES som i dette eksempel:
SSID i PARM= skal du huske at erstatte med navnet på det subsystem, hvor tabellen MY.TABLE befinder sig. Og du skal selvfølgelig også huske at specificere hvilke data fra MY.TABLE.DATA, der skal placeres i hvilke kolonner og med hvilken datatype. Læs mere om dette i Utility Guide and Reference. Linket er til DB2 version 8 manualen. Hvis LOAD statementet fejler, så vil data i MY.TABLE være slettet. Man kan altså ikke bare terminere utilitien i den tro, at så er de oprindelige data i MY.TABLE til rådighed. Så det er bare om at få rettet fejlen og få LOAD'et det angivne dataset hurtigst muligt. Alternativt har du taget en backup før steppet køres, som du kan restore.
Jeg har skrevet flere tip om hurtig sletning af data i en DB2-tabel. Den foreslåede DELETE vil typisk gå ret stærkt, da tablespaces med flere tabeller i er defineret som segmented tablespaces. Et kendetegn ved segmented tablespaces er netop, at DELETE af alle rækker i en tabel afvikles meget hurtigt, med mindre tabellen er defineret med DATA CAPTURE CHANGES. Med DATA CAPTURE CHANGES skrives indholdet af alle slettede rækker ud på loggen, og det tager tid.