von Markus Winand.

Partielle Indizes in der Oracle Datenbank emulieren


Man kann die merkwürdige NULL-Indizierung ausnutzen, um partielle Indizes in der Oracle Daten­bank umzusetzen. Dafür verwendet man einfach NULL für Zeilen, die nicht indiziert werden sollen.

Als Beispiel werden wir den folgenden partiellen Index in der Oracle Datenbank umsetzen:

CREATE INDEX messages_todo
          ON messages (receiver)
       WHERE processed = 'N'

Dafür benötigen wir zuerst eine Funktion, die den RECEIVER-Wert nur liefert, wenn der PROCESSED-Wert 'N' ist.

CREATE OR REPLACE
FUNCTION pi_processed(processed CHAR, receiver NUMBER)
RETURN NUMBER
DETERMINISTIC
AS BEGIN
   IF processed IN ('N') THEN
      RETURN receiver;
   ELSE
      RETURN NULL;
   END IF;
END

Die Funktion muss natürlich deterministisch sein, damit sie in einer Index­de­finition verwendet werden kann.

Wenn du diese Seite magst, magst du vielleicht auch …

… meine Newsletter bestellen, gratis Sticker erhalten, mein Buch kaufen oder an einer Schulung teilnehmen.

Damit kann man einen Index anlegen, der nur Zeilen mit dem PROCESSED-Wert 'N' beinhaltet:

CREATE INDEX messages_todo
          ON messages (pi_processed(processed, receiver))

Damit der Index benutzt wird, muss man in der Abfrage den indizierten Ausdruck verwenden:

SELECT message
  FROM messages
 WHERE pi_processed(processed, receiver) = ?
----------------------------------------------------------
|Id | Operation                   | Name          | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT            |               | 5330 |
| 1 |  TABLE ACCESS BY INDEX ROWID| MESSAGES      | 5330 |
|*2 |   INDEX RANGE SCAN          | MESSAGES_TODO | 5303 |
----------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("PI_PROCESSED"("PROCESSED","RECEIVER")=:X)

Partielle Indizes, Teil II

Ab Release 11g gibt es eine weitere – nicht weniger seltsame – Methode, partielle Indizes in der Oracle Datenbank zu emulieren. Dabei verwendet man absichtlich defekte Index-Partitionen und den SKIP_UNUSABLE_INDEXES-Parameter.

Vorherige SeiteNächste Seite

Du kannst nicht alles an einem Tag lernen. Abonniere den Newsletter via E-Mail, Bluesky oder RSS um sukzessive aufzuholen. Und sieh dir auch modern-sql.com an.

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Neuigkeiten Abonnieren

Markus Winands MailinglistenMarkus Winands RSS-FeedMarkus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf TwitterMarkus Winand auf Bluesky
Copyright 2010-2025 Markus Winand. Alle Rechte vorbehalten.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO