Schlagwort-Archive: db2

SQL Tipp #004 – Truncate Table

IBM DB2 LUW vor Version 9.7 kennt kein TRUNCATE so wie es das bei Oracle schon seit Ewigkeiten gibt. Es gibt jedoch ein Workaround, um TRUNCATE zu simulieren. Ab Version 9.7 unterstützt DB2 Truncate auch „nativ“.

Workaround (1): ALTER TABLE

ALTER TABLE myTablename 
 ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE;

Kommentar: Alle Daten der Tabelle werden gelöscht. Die Daten können nicht über RESTORE wiederhergestellt werden. Wenn der Befehl innerhalb einer Unit-of-Work (UOW) ausgeführt und anschließend für die UOW ein ROLLBACK ausgeführt wird, so kann die Tabelle nicht wieder im Original wiederhergestellt werden. Außerdem werden keine DELETE trigger abgefeuert. Alle Indizes der Tabelle werden ebenfalls gelöscht.

Workaround (2): Verwendung des IMPORT Utilities

IMPORT FROM /dev/null OF DEL REPLACE INTO myTablename

Kommentar: Im Unterschied zu Workaround 1 ist über diese Option die Tabelle komplett wiederherstellbar (recoverable). Auf Windows System muss statt /dev/null entweder „NUL“ oder eine existierende Datei c:\io.sys angegeben werden.

Workaround (3): Verwendung des LOAD Utilities

load client from "c:\dummyfile.txt" of del replace 
 into myTablename NONRECOVERABLE;

Tipp: Zum leeren eines kompletten Schema, das Script dynamisch erzeugen lassen:

select 'load client from "c:\dummyfile.txt" of del replace 
 into '|| rtrim(myTabname) || '.' || myTabname|| ' NONRECOVERABLE;'
from 
 syscat.tables
where 
 tabschema = 'mySchema' 
 and myTabname like 'abc%'

getestet mit IBM DB2 LUW v9.5

SQL Tipp #003 – Objekte im Tablespace

Oftmals ist es für Wartungsarbeiten wichtig zu wissen, welche Tabellen oder Indizes in einem bestimmten Tablespace gespeichert sind. Zur schnellen Ermittlung der entsprechenden Datenbankobjekte, leistet das nachfolgende Skript gute Dienste.

select 
 distinct s.TBSPACE
,case 
  when t.TABNAME is null
  then i.TABNAME
  else t.TABNAME
 end as OBJECTNAME 
from
 syscat.tablespaces s
left outer join 
 syscat.TABLES t
 on s.TBSPACEID = t.TBSPACEID 
left outer join 
 syscat.indexes i
 on s.TBSPACEID = i.tbspaceid 
where
 (s.TBSPACE like 'TS_abc%') 
 or t.TABNAME like '%myTable%';

-- getestet mit IBM DB2 LUW v9.5

SQL Tipp #002 – Monitoring SQL Statements

In BI Projekten ist es sehr wichtig, die von den Endanwender abgesetzten bzw. von den BI-Tools generierten SQL Statements analysieren zu können. Je nach BI-Tool lässt sich das generierte SQL durch allgemeine Einstellungen beeinflussen oder auch durch ein Re-Design des Berichtes optimieren bzw. korrigieren. Die SQL’s können dem Projektteam außerdem Anhaltspunkte über typische Muster von Abfragen liefern. In jedem Fall lassen sich über das Monitoring der SQL-Statements Optimierungsmaßnahmen ableiten – Stichwort Indizierung und / oder die Bereitstellung von Aggregaten. Auf dem Markt gibt es einige (meiste kleine) Anbieter als auch IBM selbst, die entsprechende Tools anbieten. Man kann aber auch die Snapshotfunktionen, die DB2 von Haus aus mitliefert, verwenden.

Das nachfolgende Skript liefert neben dem SQL Statement alle wichtigen Angaben, wie Startzeitpunkt, Anzahl gelesene Zeilen und ausführender User (execution_id -> entspricht bei Windows Systemen dem Windows Anmeldenamen). Voraussetzung zur Nutzung der Snapshotfunktionen ist die SYSMON authority.

SELECT
 i.SNAPSHOT_TIMESTAMP
,i.CLIENT_PLATFORM
,i.APPL_NAME
,i.CLIENT_NNAME
,i.DB_NAME
,i.EXECUTION_ID
,STMT_START
,STMT_STOP
,STMT_OPERATION
,ROWS_READ
,STMT_TEXT
FROM
 SYSIBMADM.SNAPAPPL_INFO i
inner JOIN 
 SYSIBMADM.SNAPSTMT s 
 on i.agent_id = s.agent_id
where 
 i.DB_NAME = 'myDbase'
;

getestet mit IBM DB2 LUW v9.5