Index mit mehreren Spalten - ok, wenn nur eine Spalte abgefragt wird?

8

Wenn ich eine Tabelle habe

%Vor%

und ein Index:

%Vor%

wäre das immer noch nützlich, wenn ich eine Abfrage

gemacht habe %Vor%

Mein Grund dafür ist, dass ich eine Reihe von Tabellen durchsuche, die keine Indizes enthalten und verschiedene Kombinationen ausgewählter Abfragen sehen. Einige verwendet nur eine Spalte, andere mehr als eins. Muss ich Indizes für beide Sets haben oder ist ein All-inclusive-Index in Ordnung? Ich füge die Indizes für schnellere Nachschlagezwecke als vollständige Tabellenüberprüfungen hinzu.

Beispiel (basierend auf der Antwort von Matt Huggins):

%Vor%

könnte durch die Indextabelle (co1l1, col2, col3) abgedeckt werden, aber

%Vor%

würde einen anderen Index benötigen?

    
svrist 08.12.2009, 08:06
quelle

4 Antworten

15

Es sollte nützlich sein, da ein Index für (ID, Text) zuerst nach ID, dann nach Text indiziert.

  • Wenn Sie nach ID suchen, wird dieser Index verwendet.
  • Wenn Sie nach ID & amp; Text wird dieser Index verwendet.
  • Wenn Sie nach Text suchen, wird dieser Index NICHT verwendet.

Bearbeiten: Wenn ich sage, dass es "nützlich" ist, ist es nützlich, wenn es um die Abfragegeschwindigkeit / -optimierung geht. Wie Sune Rievers darauf hingewiesen hat, bedeutet dies nicht, dass Sie einen eindeutigen Datensatz nur mit ID erhalten werden (es sei denn, Sie geben die ID in Ihrer Tabellendefinition als eindeutig an).

    
Matt Huggins 08.12.2009, 08:10
quelle
8

Oracle unterstützt eine Reihe von Möglichkeiten, einen Index zu verwenden, und Sie sollten damit beginnen, alle zu verstehen, also lesen Sie hier kurz: Ссылка

Ihre Abfrage select * from table where col2=12 könnte einen Indexsprung-Scan sinnvoll einsetzen, wenn die führende Spalte eine sehr geringe Kardinalität aufweist, oder einen schnellen vollständigen Indexscan, wenn dies nicht der Fall ist. Dies würde wahrscheinlich für die Ausführung von Berichten ausreichen, für eine OLTP-Abfrage ist es jedoch wahrscheinlich besser, einen Index mit col2 als führende Spalte zu erstellen.

    
David Aldridge 08.12.2009 10:16
quelle
2

Ich nehme an, id ist der Primärschlüssel. Es macht keinen Sinn, dem Index einen Primärschlüssel hinzuzufügen, da dieser immer eindeutig ist. Das Hinzufügen von etwas Einzigartigem zu etwas anderem wird auch einzigartig sein.

Fügen Sie text einen eindeutigen Index hinzu, wenn Sie es wirklich brauchen, andernfalls verwenden Sie einfach id ist Eindeutigkeit für die Tabelle.

Wenn id nicht Ihr Primärschlüssel ist, können Sie kein eindeutiges Ergebnis aus Ihrer Abfrage erhalten.

In Bezug auf Ihr letztes Beispiel mit Lookup auf col2 , denke ich, dass Sie einen anderen Index benötigen könnten. Indizes sind keine Allheilungslösung für Performance-Probleme, manchmal müssen Ihr Datenbankdesign oder Ihre Abfragen optimiert werden, zum Beispiel in gespeicherte Prozeduren umgeschrieben werden (während ich nicht ganz sicher bin, ob Oracle sie hat, bin ich sicher, dass es ein Oracle gibt gleichwertig).

    
Sune Rievers 08.12.2009 08:09
quelle
2

Wenn der Treiber hinter Ihrer Frage darin besteht, dass Sie eine Tabelle mit mehreren Spalten haben und eine beliebige Kombination dieser Spalten in einer Abfrage verwendet werden kann, sollten Sie sich BITMAP-Indizes ansehen.

Betrachten Sie Ihr Beispiel:

%Vor%

Sie könnten 3 Bitmap-Indizes erstellen:

%Vor%

Diese Bitmap-Indizes haben den großen Vorteil, dass sie je nach Bedarf kombiniert sein können.

Jede der folgenden Abfragen würde also einen oder mehrere der folgenden Indizes verwenden:

%Vor%

Bitmap-Indizes können daher eine Option für Sie sein. David Aldridge hat jedoch darauf hingewiesen, dass je nach Datensatz ein einzelner Index (col1, col2, col3) vorzuziehen sein könnte. Wie immer, es kommt darauf an. Sehen Sie sich Ihre Daten an, die wahrscheinlichsten Abfragen für diese Daten, und stellen Sie sicher, dass Ihre Statistiken auf dem neuesten Stand sind.

Hoffe, das hilft.

    
Nick Pierpoint 08.12.2009 11:00
quelle

Tags und Links