2008-08-27 11 views
6

Ich habe eine Tabelle mit vielen Millionen Zeilen. Ich muss alle Zeilen mit einem bestimmten Spaltenwert finden. Diese Spalte befindet sich nicht in einem Index, daher wird ein Tabellenscan durchgeführt.Table Scan vs. Add Index - was ist schneller?

Aber wäre es schneller, einen Index mit der Säule an der Spitze (prime key folgenden), führen Sie die Abfrage hinzuzufügen, dann den Index löschen?

Ich kann einen Index nicht dauerhaft hinzufügen, da der Benutzer die Spalte angibt, nach der er sucht.

Antwort

2

einen Index Hinzufügen erfordert einen Table-Scan, wenn Sie also keinen permanenten Index hinzufügen können, es klingt wie ein einzelner Scan (leicht) schneller sein wird.

2

Nein, das wäre nicht schneller. Was wäre schneller? Fügen Sie einfach den Index hinzu und lassen Sie ihn dort liegen!

Natürlich kann es nicht praktisch sein, jede Spalte zu indizieren, aber dann kann es wieder so sein. Wie werden Daten zur Tabelle hinzugefügt?

2

Es wäre nicht. Das Erstellen eines Indexes ist komplexer als das einfache Scannen der Spalte, selbst wenn die Rechenkomplexität gleich ist.

Das sagte - wie viele Spalten haben Sie? Sind Sie sicher, dass Sie nicht für jeden einzelnen einen Index erstellen können, wenn die Abfragezeit für einen einzelnen Suchvorgang zu lang ist?

7

Ich bin kein DBA, aber ich würde vermuten, dass das Erstellen des Index erfordern würde sowieso die Tabelle scannen.

Wenn es nicht mehrere Abfragen für diese Spalte gibt, würde ich empfehlen, den Index nicht zu erstellen.

Am besten zu überprüfen, erklären die Pläne/Ausführungszeiten für beide Möglichkeiten, obwohl!

2

Es hängt von der Komplexität Ihrer Abfrage ab. Wenn Sie die Daten einmal abrufen, ist der Tabellenscan schneller. Wenn Sie jedoch in derselben Abfrage mehr als einmal zur Tabelle zurückkehren, ist der Index schneller.

Eine weitere verwandte Strategie besteht darin, den Tabellenscan durchzuführen und alle Daten in eine temporäre Tabelle zu schreiben. Dann indizieren Sie THAT und dann können Sie alle nachfolgenden Selects, Gruppierungen und so viele andere Abfragen für die Teilmenge der indizierten Daten durchführen. Der Vorteil ist, dass die Suche nach verwandten Informationen in verwandten Tabellen mithilfe der temporären Tabelle viel schneller ist.

ist jedoch Raum billig in diesen Tagen, so würden Sie vermutlich am besten gedient werden, indem man untersucht, wie die Benutzer tatsächlich Ihrem System und das Hinzufügen von Indizes auf diesen häufigen Spalten. Ich muss noch sehen, dass Benutzer ALLE Suchparameter ALLE Zeit benutzen.

3

Wie alle anderen schon gesagt haben, wäre es sicherlich nicht schneller, einen Index hinzuzufügen, als einen vollständigen Scan dieser Spalte durchzuführen.

Allerdings würde ich vorschlagen, die Abfrage Muster Tracking und herauszufinden, welche Spalte (n) für die am meisten gesuchte, und fügen Sie Indizes zumindest für sie. Sie können herausfinden, dass 3-4 Indizes 90% Ihrer Abfragen beschleunigen.

9

Zwei Fragen zu denken:

  1. Wie viele Spalten für die Abfrage nominiert werden könnte?
  2. Ändern sich die Daten häufig? Viel davon?

Wenn Sie eine kleine Anzahl von Kandidaten-Spalten haben, und die Daten ändern nicht viel, dann könnten Sie auf jeder Hinzufügen eines permanenten Index berücksichtigen wollen oder sogar alle in Frage kommenden Spalte.

"Blasphemie!", höre ich. Die meisten Quellen fordern Sie auf, "niemals" jede Spalte einer Tabelle zu indizieren, aber diese Empfehlung basiert auf der allgemeinen Annahme, dass Tabellen häufig geändert werden.

Sie zahlen einen Preis für zusätzlichen Speicher und einen Leistungseinbruch, wenn sich die Daten ändern.

Wie klein ist klein und wie viel ist viel, und ist der Kompromiss es wert? Es gibt keine Möglichkeit, einem Priorat zu sagen, weil "zu langsam" normalerweise eine subjektive Messung ist.

Sie müssen es versuchen, messen Sie die Größe Ihrer Indizes und dann den Effekt, den sie in den Suchen haben. Sie müssen die Kosten gegen die Erhöhung der Zufriedenheit Ihrer Kunden abwägen.

[Hinzugefügt] Oh, noch eine Sache: temporäre Indizes sind nicht nur physisch langsamer als ein Table Scan, aber sie würden Ihre Nebenläufigkeit zerstören. Das Umschreiben einer Tabelle in der Regel (immer?) Erfordert eine vollständige Tabellensperre, sodass eigentlich nur eine Benutzersuche gleichzeitig ausgeführt werden kann.

Viel Glück.

2

Ihre Lösung wird nicht skaliert, es sei denn, Sie fügen jeder Spalte einen permanenten Index mit allen Spalten hinzu, die in der Abfrage in der Liste der eingeschlossenen Spalten zurückgegeben werden (ein Deckungsindex). Diese Indizes werden sehr groß sein, und Einfügungen und Aktualisierungen für diese Tabelle werden ein wenig langsamer sein, aber Sie haben keine große Auswahl, wenn Sie einem Benutzer erlauben, eine Suchspalte willkürlich auszuwählen.

Wie viele Spalten gibt es? Wie oft werden die Daten aktualisiert? Wie schnell müssen Einfügungen und Aktualisierungen ausgeführt werden? Abhängig von den Antworten auf diese Fragen sind Kompromisse erforderlich. Machen Sie viel experimentieren und testen, damit Sie sicher wissen, wie die Dinge funktionieren.

Aber zu Ihrer ursprünglichen Frage, Hinzufügen und Löschen eines Index für den Zweck einer einzelnen Abfrage ist nur von Vorteil, wenn Sie mehr als eine Auswahl während der Abfrage (z. B. die Auswahl ist in einer Unterabfrage, die ausgeführt wird für jede zurückgegebene Zeile).

Verwandte Themen