Ich habe eine Tabelle mit aktiven inaktiven Einträgen, aktiv = 1 für aktiv und aktiv = 0 für inaktiv.
Ich habe eine Vielzahl von Indizes für diese Tabelle, aber ich brauche nur die Indizes für aktive Einträge, da die Anwendung nur nach aktiven Daten fragt. Inaktive Daten müssen beibehalten werden, da sie wieder aktiv werden können. Dies wird jedoch in der Regel nur mit Bulk-Aktualisierungen durchgeführt, die ohnehin keinen Index verwenden.
Ich merke, dass das Indizieren der inaktiven Einträge (von denen es mehr als nur aktive Einträge gibt) ziemlich viel Platz in Anspruch nimmt.
Gibt es einen Weg in Oracle (10g), so etwas zu tun:
create index an_idx on tab (active, col1, col2, ... , coln) where active = 1
?
Vorheriger Versuch:
Ich habe versucht, einen funktionsbasierten Index zu verwenden, um die erste Spalte auf null zu setzen, wenn active = 0
gefällt:
create index an_idx on tab (decode(active, 1, 1, null), col1, col2, ... , coln)
Aber Oracle scheint in diesem Fall immer noch die inaktiven Spalten zu indizieren.
Partitionieren Sie die Tabelle nach ACTIVE, erstellen Sie lokale Indizes und machen Sie die Indizes für die inaktiven Partitionen UNUSABLE. Dadurch entfällt die Zeit für die Indizierung inaktiver Daten.
%Vor%Aber es gibt einige mögliche Nachteile für diesen Ansatz:
In Oracle 12c können Sie dies mithilfe von partiellen Indizes erreichen:
%Vor% Ihre Grundidee ist richtig, aber Sie müssen die Dekodierung auf alle Spalten anwenden. Nur wenn alle indizierten Ausdrücke NULL
sind, wird die Zeile nicht indiziert.
Wenn eine Abfrage diesen Index verwenden soll, müssen natürlich dieselben Ausdrücke in der WHERE-Klausel verwendet werden.
Hinweis: Ich glaube nicht, dass Sie den Ausdruck decode(active, 1, 1, null)
in den Index aufnehmen möchten, da dieser für alle indizierten Zeilen konstant wäre.
Ich glaube nicht, dass das möglich ist. Es gibt ein paar Optionen