Wie verwende ich den Index in der select-Anweisung?

96

Nehmen wir an, in der Mitarbeitertabelle habe ich einen Index (idx_name) für die emp_nameSpalte der Tabelle erstellt.

Muss ich den Indexnamen in der select-Klausel explizit angeben, sonst wird er automatisch verwendet, um Abfragen zu beschleunigen.

Wenn es in der select-Klausel angegeben werden muss, wie lautet die Syntax für die Verwendung des Index in der select-Abfrage?

Vivek
quelle

Antworten:

84

Wenn Sie den Index testen möchten, um festzustellen, ob er funktioniert, finden Sie hier die Syntax:

SELECT *
FROM Table WITH(INDEX(Index_Name))

Die WITH-Anweisung erzwingt die Verwendung des Index.

Jason
quelle
82
Dieser Beitrag beantwortet die Frage nicht. Die Antwort lautet kurz: Sie müssen in der Abfrage keinen Index angeben. Es wird automatisch verwendet (oder nicht). Sie können es jedoch erzwingen. Weitere Details (wann und warum) in anderen Beiträgen unten.
Rast
34

Gute Frage,

Normalerweise sollte die DB-Engine den zu verwendenden Index automatisch basierend auf den von ihr erstellten Abfrageausführungsplänen auswählen. Es gibt jedoch einige ziemlich seltene Fälle, in denen Sie die Datenbank zwingen möchten, einen bestimmten Index zu verwenden.

Um Ihre spezifische Frage beantworten zu können, müssen Sie die von Ihnen verwendete Datenbank angeben.

Für MySQL möchten Sie die Dokumentation zur Index-Hinweis-Syntax lesen

Tudor Constantin
quelle
30

Wie verwende ich den Index in der select-Anweisung?
diesen Weg:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

Und viele weitere Möglichkeiten, dies zu überprüfen

Muss ich explizit angeben?

  • Nein, nein Es muss explizit angegeben werden.
  • Die DB-Engine sollte den zu verwendenden Index automatisch basierend auf den Abfrageausführungsplänen auswählen, die sie aus der Antwort von @Tudor Constantin erstellt.
  • Der Optimierer beurteilt, ob die Verwendung Ihres Index die Ausführung Ihrer Abfrage beschleunigt, und wenn dies der Fall ist, verwendet er den Index. von @niktrl Antwort
VdeX
quelle
13

Im Allgemeinen wird der Index verwendet, wenn die angenommenen Kosten für die Verwendung des Index und möglicherweise für die weitere Suche nach Lesezeichen geringer sind als die Kosten für das Scannen der gesamten Tabelle.

Wenn Ihre Anfrage die Form hat:

SELECT Name from Table where Name = 'Boris'

Und 1 Reihe von 1000 hat den Namen Boris, es wird mit ziemlicher Sicherheit verwendet. Wenn alle Boris heißen, wird wahrscheinlich auf einen Tabellenscan zurückgegriffen, da der Index wahrscheinlich keine effizientere Strategie für den Zugriff auf die Daten darstellt.

Wenn es sich um eine breite Tabelle handelt (viele Spalten) und Sie Folgendes tun:

SELECT * from Table where Name = 'Boris'

Dann kann es immer noch entscheiden, den Tabellenscan durchzuführen, wenn es eine vernünftige Annahme ist, dass das Abrufen der anderen Spalten aus der Tabelle mehr Zeit in Anspruch nimmt, als nur den Namen nachzuschlagen, oder erneut, wenn es wahrscheinlich ist, dass a abgerufen wird viele Zeilen sowieso.

Damien_The_Unbeliever
quelle
9

Der Optimierer beurteilt, ob die Verwendung Ihres Index die Ausführung Ihrer Abfrage beschleunigt, und wenn dies der Fall ist, verwendet er den Index.

Abhängig von Ihrem RDBMS können Sie die Verwendung eines Index erzwingen, obwohl dies nur empfohlen wird, wenn Sie wissen, was Sie tun.

Im Allgemeinen sollten Sie Spalten indizieren, die Sie in Tabellenverknüpfungen und where-Anweisungen verwenden

niktrs
quelle
5

Wenn Sie die Spalte verwenden, auf die der Index innerhalb Ihrer Bedingungen angewendet wird, wird er automatisch eingefügt. Sie müssen es nicht verwenden, aber es beschleunigt Abfragen, wenn es verwendet wird.

SELECT * FROM TABLE WHERE attribute = 'value'

Verwendet den entsprechenden Index.

ChrisBint
quelle
5

Wenn Sie einen Index für eine Tabelle erstellen, verwendet die Datenbank diesen Index im Allgemeinen automatisch, wenn Sie nach Daten in dieser Tabelle suchen. Sie müssen nichts dagegen tun.

In MSSQL können Sie jedoch einen index hintangeben, der angeben kann, dass ein bestimmter Index zum Ausführen dieser Abfrage verwendet werden soll. Weitere Informationen hierzu finden Sie hier .

Index hintscheint auch für MySQL verfügbar zu sein . Vielen Dank an Tudor Constantine.

MD Sayem Ahmed
quelle
1

Der Indexhinweis ist nur für Microsoft Dynamics-Datenbankserver verfügbar. Bei herkömmlichem SQL Server sollten die Filter, die Sie in Ihrer 'Where'-Klausel definieren, die Engine davon überzeugen, relevante Indizes zu verwenden ... Vorausgesetzt, der Ausführungsplan der Engine kann effizient identifizieren, wie die Informationen gelesen werden sollen (ob ein vollständiger Tabellenscan oder ein indizierter Scan ) - Es muss die beiden vergleichen, bevor die eigentliche Anweisung als Teil seines integrierten Leistungsoptimierers ausgeführt wird.

Sie können den Optimierer jedoch zwingen, mit etwas wie zu scannen

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

Oder um einen bestimmten Index zu suchen, indem Sie so etwas verwenden

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

Es ist deine Entscheidung. Sehen Sie sich die Indexeigenschaften der Tabelle im Objektfenster an, um eine Vorstellung davon zu erhalten, welchen Index Sie verwenden möchten. Es sollte zu Ihren Filtern passen.

Um die besten Ergebnisse zu erzielen, listen Sie die Filter auf, die zuerst die wenigsten Ergebnisse liefern würden. Ich weiß nicht, ob ich richtig sage, aber es scheint, dass die Abfragefilter sequentiell sind. Wenn Sie Ihre Sequenz richtig eingestellt haben, sollte der Optimierer dies nicht für Sie tun müssen, indem er alle Kombinationen vergleicht, oder zumindest nicht mit den teureren Abfragen beginnen.

Cory
quelle