Oracle: Indizieren einer Teilmenge von Zeilen einer Tabelle

7

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.

    
Clinton 05.10.2011, 00:59
quelle

3 Antworten

7

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:

  • Nicht alle Arten von Indizes können unbrauchbar sein.
  • Es ist nicht normal, unbrauchbare Objekte in der Datenbank zu haben. Die Leute werden sich wahrscheinlich darüber beklagen oder davon ausgehen, dass es sich um einen Fehler handelt, und es neu aufbauen.
  • Einige Operationen wie truncate machen die Indizes automatisch wieder verwendbar.

In Oracle 12c können Sie dies mithilfe von partiellen Indizes erreichen:

%Vor%     
Jon Heller 05.10.2011, 05:05
quelle
11

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.

%Vor%

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.

    
Dave Costa 05.10.2011 02:12
quelle
1

Ich glaube nicht, dass das möglich ist. Es gibt ein paar Optionen

  1. Machen Sie einen Index für (active, col1 ...), damit die Abfragezeit nicht beeinflusst wird so viel durch inaktive Elemente
  2. Erstellen Sie zwei Tabellen für aktive / inaktive Elemente und verwalten Sie den aktiven Status, indem Sie Objekte zwischen den beiden Tabellen verschieben
  3. Erstellen Sie eine zweite Tabelle mit allen Daten, die Sie indizieren möchten, sowie eine eindeutige Kennung und verbinden Sie sich mit der Tabelle, um den Rest der Daten zu erhalten.
dfb 05.10.2011 01:14
quelle

Tags und Links