welcome: please sign in
location: MyCoRe / Dokumentation / HowTo / DatenbankIndizes



Wichtige Datenbank-Indizes zum Beschleunigen der Datenbankanfragen


DB2

IFS beschleunigen

Zuerst eine Verbindung zur Datenbank herstellen: db2 connect to dbname
wobei dbname durch den Datenbanknamen zu ersetzen ist.

Klassifikationssystem beschleunigen

Achtung /!\
Dieser Abschnitt bezieht sich auf das Klassifikatinssystem, dass im Release 2 eingesetzt werden soll.

Anschließend die Verbindung zur Datenbank beenden: db2 terminate

HSQLDB

Generell sieht die Syntax bei HSQLDB ähnlich aus, allerdings muss man ALLOW REVERSE SCANS am Ende weglassen, z. B.

MySQL

CREATE INDEX RightLeft ON MCRCategory (CLASSID ASC, RIGHTVALUE ASC, LEFTVALUE ASC, INTERNALID ASC, CATEGID ASC);
CREATE INDEX ClassLeftUnique ON MCRCategory (INTERNALID ASC, CLASSID ASC, LEFTVALUE ASC);
CREATE INDEX Categories ON MCRCategoryLink (CATEGORY ASC);

Materialised View

Unter MySQL ist es darüber hinaus notwendig, eine zusätzliche Hilfs-Tabelle parents anzulegen, um die Berechnung der Beziehung Vater-Kind-Enkelkind aus der Tabelle MCRCategory zu beschleunigen. Eine solche Berechnung wird oft bei Suchanfragen zur Zählung der Kategorien benötigt und ist unter MySQL inakzeptabel. Die spezielle Tabelle ist ein sogenannter Materialised View und wird wie folgt definiert:

CREATE TABLE parents
 SELECT p.ClassID AS ClassID, p.CategID AS parentCategID, c.internalID AS childID
 FROM MCRCategory p
  JOIN MCRCategory c
  ON p.classID = c.classID
 WHERE c.leftValue BETWEEN p.leftValue AND p.rightValue

Die SQL-Abfrage füllt die Tabelle parents direkt mit Werten aus MCRCategory und berechnet damit den Zwischenschritt, der später zu einer enormen Zeitersparnis führt. Ein Index auf parents steigert die Performanz weiter:

CREATE INDEX ctop ON parents (childID);

Um die Tabelle parents aktuell zu halten, sind weiterhin die nachfolgenden Trigger zu integrieren:

-- INSERT TRIGGER erzeugen:
--
DELIMITER |
DROP TRIGGER mcrcat_ins |
CREATE TRIGGER mcrcat_ins AFTER INSERT
 ON MCRCategory
 FOR EACH ROW
  BEGIN
   INSERT INTO parents
    SELECT p.ClassID, p.CategID, c.internalID
    FROM MCRCategory p
     JOIN MCRCategory c
     ON c.classID = p.classID
    WHERE NEW.classID = c.classID AND c.internalID = NEW.internalID AND c.leftValue BETWEEN p.leftValue AND p.rightValue;
  END; |
DELIMITER ;
-- DELETE TRIGGER erzeugen:
--
DELIMITER |
DROP TRIGGER mcrcat_del |
CREATE TRIGGER mcrcat_del AFTER DELETE
 ON MCRCategory
 FOR EACH ROW
  BEGIN
   DELETE FROM parents WHERE OLD.internalID = childID;
 END; |
DELIMITER ;
-- UPDATE TRIGGER erzeugen:
--
DELIMITER |
DROP TRIGGER mcrcat_upd |
CREATE TRIGGER mcrcat_upd AFTER UPDATE
 ON MCRCategory
 FOR EACH ROW
  BEGIN
   DELETE FROM parents WHERE OLD.internalID = childID;
   INSERT INTO parents
    SELECT p.ClassID, p.CategID, c.internalID
    FROM MCRCategory p
     JOIN MCRCategory c
     ON c.classID = p.classID
    WHERE NEW.classID = c.classID AND c.internalID = NEW.internalID AND c.leftValue BETWEEN p.leftValue AND p.rightValue;
  END; |
DELIMITER ;

Unterschiede in verschiedenen MySQL-Versionen:

Achtung:


Kommentar



MyCoRe/Dokumentation/HowTo/DatenbankIndizes (last edited 2011-12-19 14:45:21 by KathleenKrebs)