Frage

Ich habe einen Index für die Spalten A, B, C, D der Tabelle T

Ich habe eine Abfrage, die mit A, B, C in der WHERE-Klausel von T zieht.

Wird der Index verwendet oder wird ein separater Index erforderlich sein, dass nur enthält A, B, C?

War es hilfreich?

Lösung

David B ist richtig, dass Sie den Ausführungsplan überprüfen sollten, um den Index zu überprüfen, verwendet wird.

Wird der Index verwendet oder wird ein separater Index erforderlich sein, dass nur A enthält, B, C?

Um diesen letzten Teil der Frage zu beantworten, was meiner Meinung nach der Kern zugrunde liegende Thema (in Bezug auf die sofortige Lösung im Gegensatz), gibt es fast nie ein Grund zum Index eine Teilmenge der indizierten Spalten . Wenn Ihr Index ist (A, B, C, D), eine WHERE gegen (A, B, C) höchstwahrscheinlich zu einem Index suchen , was die ideale Situation ist - der Index umfasst alle Informationen, muss der Motor direkt auf die Ergebnismenge gehen. Ich glaube, dies ist für numerische Typen und für die Gleichstellung Tests in String-Typ gilt, obwohl es mit LIKE ‚%‘ kann brechen s). Auf der anderen Seite, wenn Ihr WHERE nur D Bezug genommen wird, würden Sie am ehesten mit einem Index am Ende Scan , die, dass die SQL-Engine für alle Kombinationen von A, B bedeuten würde, müsste scannen und C, und dann prüfen, ob D Ihre Kriterien erfüllen, bevor sie entscheiden, ob die Zeile der Ergebnismenge hinzuzufügen. Auf einem besonders großen Tisch, als ich mich viele Anfragen gegen Spalte „D“ zu tun hat, habe ich einen zusätzlichen Index für D nur und sah Leistungssteigerung um 90%.

Edit: Ich soll auch den Datenbankoptimierungsratgeber in SQL Management Studio empfehlen verwenden. Es wird Ihnen sagen, wenn Ihre Tabelle nicht ideal für die Abfrage indiziert Sie ausführen möchten.

Andere Tipps

Es hängt davon ab!

WHERE A like '%x%'
  and B = 1
  and C = 1
//
WHERE A = 1
  OR B = 1
  OR C = 1
//
WHERE DateAdd(dd, 1, A) = '2008-01-01'
  AND B = 1
  AND C = 1

Diese werden nicht auf den Index verlassen, da der Index nicht sinnvoll ist.

Klicken Sie auf „Anzeige geschätzten Ausführungsplan“ potenzielle Indexnutzung zu bestätigen.

in Oracle-Datenbanken ist dies ein Composite Index genannt (12g docs aber gültig für frühere Versionen)

  

Composite-Indizes Abrufen von Daten für SELECT-Anweisungen, in denen die WHERE-Klausel verweist auf alle von dem vorderen Teil der Säulen in dem Composite-Index beschleunigen kann. Daher ist die Reihenfolge der Spalten in der Definition verwendet wichtig. Im Allgemeinen sind die am häufigsten zugegriffen Spalten zuerst gehen.

so in Ihrem Fall, Ja. der Index würde / könnte verwendet werden. Dies könnte durch die Verwendung eines erklären Plan überprüft werden.

Wenn MS SQLSERVER unterscheidet (und ich vermute, es könnte) werden Sie eine neue Antwort benötigen.

Edit: Sollte auch erwähnen, wird es nur prüfen der Index für den Einsatz .., dass es nicht notwendigerweise bedeutet, sie verwenden.

Edit2: Oracle 11g und später hat nun eine Option, die es Spalten in einem Index überspringen kann. so eine Abfrage auf A, B und D immer noch den Index verwenden,

Der Index verwendet wird, ja. Es ist ziemlich klug, welche Indizes wird eine optimalere Abfrage-Plan erzeugen, und es sollte keine Probleme damit haben.

Wie bei dieser Art der Sache, nehmen Sie nicht mein Wort für sie - Benchmark es. Erstellen Sie eine Tabelle, füllen Sie es mit repräsentativen Daten abfragen es, indizieren, und Abfrage Sie es erneut.

Die Tatsache, dass der Index eine Spalte enthält, die nicht in der Abfrage verwendet wird, wird es nicht verhindern, verwendet wird.

Das ist nicht zu sagen, dass es auf jeden Fall verwendet werden, kann es aus einem anderen Grund außer Acht gelassen werden (vielleicht, weil ein oder mehrere andere Indizes mehr nützlich sind).

Wie immer nimmt squizz bei dem geschätzten Ausführungsplan zu sehen, was wahrscheinlich passieren wird.

Starten Sie mit dem einfachen gleich Lookup (wobei A = 1 und B = 'Red' und C = 287) ja dem Index (höchstwahrscheinlich) verwendet werden. Der Index wird zum ersten Mal das Optimierungsprogramm „guess“ die Anzahl der Zeilen zu helfen, die die Auswahl übereinstimmen, und dann zweitens, um tatsächlich die Zeilen zuzugreifen.

Als Antwort auf David B Bemerkung über den „wie“ Prädikat, SQLServer noch den Index verwenden kann, es hängt davon ab, was Sie auswählen. Zum Beispiel, wenn Sie eine Zählung sind die Auswahl (*), dann würde SQLServer wahrscheinlich den Index scannen und die Hits zählen, die die where-Klausel übereinstimmen, da der Index kleiner und würde weniger IOs erfordern zu scannen. Und es kann beschließen, das zu tun, auch wenn Sie einige Spalten aus der Basistabelle sind die Auswahl, je nachdem, wie selektive SQLServer fühlt sich der Index ist.

Hier ist ein anderer „es kommt“ Antwort ... es hängt auch davon ab, wie groß Ihr Tisch ist ...

ich mit jeder zustimmen anderen, die den Ausführungsplan erwähnt prüft, um zu überprüfen, ob Ihr Index verwendet wird.

Hier sind ein paar Artikel über einen Ausführungsplan zu lesen, die Sie nützlich finden sollten:

http://www.sqlservercentral.com/articles/Administering/executionplans/ 1345 / http://www.codeproject.com/KB/database/ sQL-Tuning-tutorial-1.aspx

Es gibt auch einen guten Artikel auf sucht vs. Scans, die ich empfehlen würde: http://blogs.msdn.com/craigfr/archive/ 2006/06/26 / 647852.aspx

Es gibt Blog ein Protokoll von guten Artikeln über Craig Freedmans, hier ist eine andere, die Sie nützlich finden sollte. Dieser Artikel ist über einige der Faktoren SQL Server verwendet, welcher Index zu verwenden ...

, um zu bestimmen

http://blogs.msdn.com/craigfr /archive/2006/07/13/664902.aspx

Achten Sie darauf! Jeff

Generell ja, es wird sein, alle modernen Datenbanken sind klug genug, dies zu tun. Es gibt Ausnahmen, zum Beispiel, wenn die Statistiken auf dem Tisch zeigen, dass das Volumen der Daten, die in es klein genug ist, dass eine vollständige Tabelle Lese effizienter sein wird, dann wird der Index ausgeschlossen werden, aber in der Regel können Sie sich darauf verlassen, gegebenenfalls.

Folglich können Sie dies nutzen, wenn Ihre Indizes zu entwerfen. Nehmen wir zum Beispiel habe ich eine Tabelle, die mit A, B enthält, C als Schlüsselwerte und Spalten Y und Z die Daten enthalten, die ich kenne, wird oft durch die Aussagen abgerufen werden

SELECT Y FROM table WHERE A = alpha and B = beta and C = gamma 

SELECT Z FROM table WHERE A = alpha and B = beta and C = gamma 

Die I wird in der Regel einen Index für A, B, C, X, Z schaffen - unter der Annahme, dass X und Z sind einige recht kleines Feld. Der Grund dafür ist, dass ich der Zugangsweg in den Aussagen über kenne den Index verwenden, und als die Daten, die ich will, sind abzurufen bereits im Leseindex dann keine separate Lese des Blockes der Daten erforderlich, um die Tabellendaten abzurufen selbst benötigt werden. Diese Strategie kann auf den Datenabruf unter Umständen dramatisch beschleunigen. Natürlich zahlen Sie es in Update-Kosten und Speicherplatz so müssen Sie verstehen, was Ihre Datenbank es vor der Anwendung tut, aber wie in den meisten Datenbanken dramatisch zahlreicher als liest, schreibt es die Überlegung, im Allgemeinen gut wert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top