2016-04-20 4 views
0

Ich bin mir nicht sicher, ob ich hier etwas falsch machen, aber ich habe eine Abfrage auf einem Tisch mit Millionen von Zeilen ausgeführt.Wählen Sie Abfrage zu langsam, obwohl ich einen Index verwenden

Die Abfrage ist so etwas wie dieses:

select * 
    from dbo.table with (index (index_1), nolock) 
      where col1 = 15464 
        and col2 not in ('X', 'U') 
        and col3 is null 
        and col4 = 'E' 

Index wie folgt aussieht:

CREATE NONCLUSTERED INDEX [index_1] ON [dbo].[table] ([col1], [col2], [col3], [col4]) WITH (FILLFACTOR=90) ON [PRIMARY] 
GO 

Diese wählen Sie noch eine Minute dauert zu überfahren. Was vermisse ich?

+0

Seien Sie vorsichtig mit diesem NOLOCK Hinweis. Es kann in Ihrer Situation in Ordnung sein, aber die meisten Leute verstehen nicht wirklich alle Verzweigungen dieses Hinweises. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+0

Versuchen Sie, Composite-Index auf col1, col4 setzen. Schreibe wo, wie col1, dann col4, dann den Rest. –

+0

spielt die Reihenfolge der Where-Klausel eine Rolle, wenn die Indexreihenfolge korrekt ist? –

Antwort

5

Für diese Abfrage:

select * 
from table 
where col1 = 15464 and 
     col2 not in ('X', 'U') and 
     col3 is null and 
     col4 = 'E'; 

Der beste Index ist table(col1, col4, col3, col2). Die Abfrage sollte den Index automatisch ohne einen Hinweis verwenden.

Wenn Sie einen Index auf Basis einer where-Klausel auswählen, sollten Sie zuerst die Gleichheitsbedingungen eingeben, gefolgt von einer Spalte mit einer Ungleichung. Für die Zwecke der Indexierung sind in und not in Ungleichheitsbedingungen im Allgemeinen.

Wenn Sie Datentypen mischen, werden manchmal auch keine Indizes verwendet. Dies setzt voraus, dass col1 numerisch ist.

+0

ahhh, ich verstehe warum. es macht vollkommen Sinn. sorry, immer noch lernen über indizes :) .. ich kann deine antwort in 9 minuten annehmen! Danke mein Freund. –

+0

hmmmm, naja, es läuft immer noch über 1 min. Muss ich irgendetwas "auffrischen", damit SQL die Änderungen erkennt? –

+0

@Rj. . . . Wenn die Abfrage in einer gespeicherten Prozedur oder irgendwie im Cache gespeichert ist, benötigen Sie möglicherweise die Option (rekompilieren) '. Andernfalls besteht das Problem möglicherweise darin, dass zu viele Zeilen übereinstimmen. –