DB2 Skripte für „Performance und Skalierbarkeit“


Dieser Abschnitt enthält die create und insert-Anweisungen zum Anlegen der Tabellen aus Kapitel 3 in einer DB2-LUW-Datenbank.

Warnung

Diese Skript erzeugen große Tabellen.

Um repräsentative Ergebnisse zu erhalten, muss die Tabelle groß genug sein un nicht mehr in den Cache zu passen. Abhängig von dem Test-System muss man die Tabelle gegebenenfalls noch größer machen, um das lineare Wachstum zu erhalten, das im Buch gezeigt wird.

--#SET TERMINATOR ;

-- Disable autocommit
UPDATE COMMAND OPTIONS USING C OFF;

CREATE TABLE scale_data (
   section NUMERIC(10,0) NOT NULL,
   id1     NUMERIC(10,0) NOT NULL,
   id2     NUMERIC(10,0) NOT NULL
) NOT LOGGED INITIALLY;

Hinweise

  • Autocommit wird abgeschalten, damit auch das protokollieren (log) während des Befüllens abgeschalten werden kann.

  • Es gibt keinen Primärschlüssel (um die Daten-Erzeugung einfach zu halten)

  • Es gibt noch keinen Index (wird nach dem Befüllen angelegt).

  • Es gibt keine junk-Spale, da der Test ohnehin nicht auf die Tabelle selbst zugreift.

--#SET TERMINATOR ;

INSERT INTO scale_data (section, id1, id2)
WITH sections (n) AS
( SELECT 1 n   FROM sysibm.sysdummy1
   UNION ALL
  SELECT n + 1 FROM sections
   WHERE n < 300
)
, gen (n) AS
( SELECT 1 n   FROM sysibm.sysdummy1
   UNION ALL
  SELECT n + 1 FROM gen
   WHERE n < 900000
)
SELECT sections.n, gen.n, FLOOR(rand() * 100) 
  FROM sections
     , gen
 WHERE gen.n < sections.n * 3000;

Hinweise:

  • Dieses Statement erzeugt 300 Sektionen – das muss man ggf. an die eigene Umgebung anpassen. Wenn man die Zahl erhöht, muss man auch den zweiten Zeilengenerator vergrößern. Er muss mindestens 3000 x <Anzahl der Sektionen> Zeilen erzeugen.

  • Die Tabelle benötigt einige Gigabyte.

--#SET TERMINATOR ;

CREATE INDEX scale_slow ON scale_data (section, id1, id2);

RUNSTATS ON TABLE scale_data;

Hinweise:

  • Der Index benötigt ebenfalls einige Gigabyte.

  • Vor Version 10 benötigt DB2 den Schema-Namen bei RUNSTATS. Wenn man bei RUNSTATS einen Fehler bekommt, muss man den Schema-Namen explizit angeben (Schema.Tabelle). Die aktuellen Schema-Namen kann man wie folgt abfragen:

    SELECT current_schema FROM sysibm.sysdummy1;

Über den Autor

Photo of Markus Winand
Markus Winand stimmt Entwickler auf SQL-Performance ein. Er hat das Buch SQL Performance Explained veröffentlicht und bietet inhouse Schulungen sowie Tuning-Leistungen auf http://winand.at/ an.