2015-01-31 5 views
6

Wenn es eine Tabelle mit Details zu Mitarbeitern einschließlich einer Spalte Geschlecht gibt, deren Wert entweder M/F sein kann. Wäre es jetzt sinnvoll, einen Index für diese Spalte zu erstellen, würde dies die Suche beschleunigen? Wenn wir eine Select-Anweisung mit einer Where-Klausel auslösen, die Gender als Spalte enthält, sollte die Suchzeit logisch um die Hälfte verkürzt werden. Aber ich habe gehört, dass diese Art von Index nicht hilft und vom Database Optimizer beim Ausführen der Abfrage ignoriert würde. Aber ich verstehe nicht warum? Kann mir bitte jemand erklären?Datenbankindex für eine Spalte mit doppelten Werten

+0

mysql oder sybase? – Mihai

+0

eigentlich ist diese Frage im Allgemeinen, aber ja Sybase insbesondere – Gaurav

+0

Ich suchte im Internet, konnte aber keine klare Antwort bekommen, kann die Person, die mich unten abstimmen bitte erklären, warum Sie mir unten-Abstimmen geben.Kann sein, wenn es so einfach für Sie ist, können Sie bitte auch die Antwort setzen – Gaurav

Antwort

7

In den meisten Fällen kann nur ein Index verwendet werden, um eine Datenbankabfrage zu optimieren. Wenn eine Abfrage mehreren indizierten Spalten entsprechen muss, muss der Abfrageplaner entscheiden, welcher dieser Indizes verwendet werden soll. Jeder Index hat eine Kardinalität, die in etwa die Anzahl der verschiedenen Werte in der Tabelle ist. Ein Index mit höherer Kardinalität ist effektiver, da das Auswählen von Zeilen, die mit dem Index übereinstimmen, dazu führt, dass nur sehr wenige Zeilen gescannt werden, um die anderen Bedingungen zu erfüllen.

Ein Index auf einer gender Spalte wird nur die Tabelle in zwei Hälften schneiden. Jeder andere Index wird effektiver sein.

Als eine Analogie, denken Sie an Telefonbücher. Wenn Sie ein einziges Telefonbuch für ein ganzes Land haben, wäre es riesig und schwer, nach der gewünschten Person zu suchen. Daher werden Telefonbücher normalerweise nur für eine Stadt oder einige Städte in einem Gebiet erstellt, um ihnen angemessene Größen zu geben. Hätten Sie stattdessen ein "Telefonbuch für Männer" anstelle von regionalen Telefonbüchern, wäre es fast so unbrauchbar wie ein Telefonbuch für das ganze Land. Die Kriterien für die Erstellung neuer Telefonbücher sind, dass sie viel kleiner sein sollten als ein Buch für das ganze Land. Eine Reduzierung um den Faktor 2 ist nicht sehr nützlich, wenn Sie mit einer enormen Größe beginnen.

+1

Nun, nehme an, dass meine Abfrage eine Stunde dauert, und wenn ich sie in einer halben Stunde ausführen kann, ist das immer noch eine große Ersparnis für mich ... – Gaurav

+0

Wie oft machst du diese Abfrage? Denken Sie daran, es gibt Speicher- und Zeitaufwand für die Aufrechterhaltung des Index. So werden viele andere Operationen verlangsamt, und das kann mehr als die halbe Stunde ergeben, die Sie bei den gelegentlichen Abfragen sparen, die nur den Gender-Index benötigen. – Barmar

+0

es ist keine häufige Abfrage, es kann nur ein paar Mal an einem Tag sein – Gaurav

6

Vermutlich nimmt das Geschlecht zwei Werte an. Im Allgemeinen wäre ein Index auf gender nicht hilfreich. In der Tat könnte es verletzend sein.

Wenn Sie ein Geschlecht ohne Index auswählen, führt der Abfrageoptimierer einen vollständigen Tabellenscan der Datenbankseiten durch, um die Abfrage zu erfüllen. Auf einer typischen Seite würde die Hälfte der Einträge mit der Abfrage übereinstimmen, sodass Sie beim ersten Treffer Ergebnisse erhalten würden.

In dieser Phase der Abfrageausführung wird normalerweise ein Index verwendet, um die Anzahl der gelesenen Seiten zu reduzieren. Wenn jedoch jede Seite einen Datensatz mit "M" und "F" enthält, muss immer noch jede Seite gelesen werden. Um die Sache noch schlimmer zu machen, bedeutet die Verwendung eines Indexes, dass Sie von einer zufälligen Seite und dann einer anderen und einer anderen lesen, anstatt nur die Werte sequenziell zu lesen. Das Umblättern von Seiten erfordert ein bisschen mehr Zeit. Wenn die Seiten nicht alle in den Speicher passen, haben Sie eine Situation namens Thrashing, und es könnte eine wirklich, sehr lange Zeit dauern.

Die einzige Ausnahme ist ein gruppierter Index, bei dem die Werte auf den Seiten tatsächlich nach Werten sortiert sind. In diesem Fall wäre eine Abfrage mit dem Index etwa 50% schneller, da nur die Seiten gelesen werden müssen. Dies kann besonders effektiv in einer "Archiv" -Tabelle sein, in der Sie aktive Datensätze haben, die häufig durchsucht werden. Dieses Flag kann bei 10%, 1% oder 0,1% der Datensätze auftreten, und der Clustered-Index kann eine deutliche Geschwindigkeitsverbesserung darstellen.

Es wäre selten in einer großen Tabelle, eine Abfrage auszuführen, die die Hälfte der Datensätze zurückgibt. Möglicherweise wäre das Geschlecht in Kombination mit anderen Spalten ein guter Kandidat für die Aufnahme in einen Index.