2009-08-03 16 views
3

wenn im 2-Abfragen mit:SQL: SELECT IN schneller und Best Practice?

zuerst: fragt alle Schlüssel/ids

erforderlich

Sekunden: select * from tab1 wo tab1.id in (... ids Liste .. ,,)

IDs Liste kann mehrere tausend sein ...

ist es weise oder Best Practice oder empfohlen, solche Dinge zu tun?

Antwort

7

In der Regel ist es eine bewährte Methode, eine IN-Klausel in Ihren Anweisungen zu verwenden, da Sie eine Unterabfrage für größere Werte verwenden.

Die Antwort sollte immer lauten: es kommt darauf an! Aus Ihrer Frage geht nicht klar hervor, ob Ihre Werteliste ein SELECT wäre oder ob Sie sie hart codieren würden. Es wäre definitiv leistungsfähiger, wenn diese mehreren tausend Werte in einer anderen Tabelle (temporäre Tabelle oder Tabellenvariable) wären und Sie sie unterwandert hätten. das heißt

SELECT * FROM Customer 
    WHERE CustomerID IN (SELECT ID FROM MyOtherLargeTableOfCustomers) 
  • wie gut indiziert ist, dass Spalte, die Sie auf, dass IN Klausel Leistung erbringt?
  • Was ist der Datentyp? Wenn es sich um einen numerischen Datentyp handelt, sollten Sie keine Leistungsprobleme haben.
  • sicherstellen, dass Ihre STATISTICS (wenn SQL Server) regelmäßig aktualisiert werden.
  • Wenn der Datentyp char-basiert oder guid ist, können Leistungsprobleme auftreten, insbesondere wenn mehrere Abfragen gleichzeitig ausgeführt werden und die Liste zu Tausenden in der von Ihnen beschriebenen Liste liegt.
  • betrachten Sie JOIN in Betracht diese Tabellen stattdessen; das sollte immer eine schnellere Abfrage erzeugen.
SELECT * FROM Customer AS C 
INNER JOIN MyOtherLargeTableOfCustomers AS M 
ON C.CustomerID = M.CustomerID 
1

wenn Ihre IDs sind abfragbar in einer joinable Tabelle, ein innere Verwendung verbinden Ihnen die schnellste Abfrage sollte und gibt Ihnen eine wesentlich kleinere Abfrage an die DB zu senden.