2011-01-05 17 views
6

Gibt es irgendwelche Unterschiede (perf) Schriftfelter diese Anfrage:Gibt es einen Unterschied zwischen '=' und In?

Select * from T where PK = 1 

oder diese

Select * from T where PK in (1) 

Ich glaube nicht, aber ich weiß wirklich nicht, wie einen Ausführungsplan dispay, dass mein Gefühl behaupten sollte .

Thx im Voraus

+1

Ich hoffe, dass der Optimierer erkennt, dass es nur einen einzigen Wert in Ihrer 'IN'-Liste gibt und behandeln Sie ihn genauso wie' ''. – LukeH

+0

Ich auch. Aber wie kann ich es behaupten? –

Antwort

3

Die IN Ausdruck:

Column in (Val1,Val2,Val3) 

Wird intern neu geschrieben in etwas sehr ähnlich:

(Column = Val1 or Column = Val2 or Column = Val3) 

Sie können dies sagen, weil, wenn Sie den Namen eines nicht vorhandenen Spalte liefern, die Die Anzahl der gemeldeten Fehler (Invalid Column name 'Blah') entspricht der Anzahl der Werte in der IN-Liste. Ein solches Umschreiben tritt natürlich nur für Listen von Literalwerten auf. Unterabfragen (wie @oezi sagt) werden unterschiedlich gehandhabt.


Natürlich ist diese spezielle Optimierung nicht dokumentiert, und es ist immer vorzuziehen, den klarsten Code zu schreiben.

Ich bin nicht sicher, ob es eine obere Grenze gibt, wo es diese Erweiterung nicht ausführen wird - es wird sicherlich bis zu 100 Werte in der IN-Liste tun (und ich kann nicht mehr tippen).

3

in Ihrem Fall: kein Unterschied

im Allgemeinen: Sie subselect oder innerhalb der Streben schreiben konnte, und = wird scheitern, wenn das subselect mehr als 1 Zeile zurückgibt. Sie könnten auch (1,2) schreiben (das wäre wie ein Subselect, der 2 Zeilen zurückgibt), wobei = auch nicht möglich ist.

+0

Thx, ich weiß, wie in und '=' zu verwenden. Ich habe mich nur gefragt, ob es ein perf Unterschied sein könnte –

-1

Der Vergleichsoperator, der zwei Werte für die Gleichheit vergleicht, ist der schnellste Weg zum Vergleich.

"Select * von T, wobei PK = 1"

wird die Vorform viel schneller als:

"Select * von T, wobei PK in (1)"

ein gleichen wie:

"SELECT customer_number, customer_name FROM Kunde WHERE customer_number zwischen 1000 und 1004"

Vorform wird viel schneller als:

"SELECT customer_number, customer_name FROM Kunde WHERE customer_number in (1000, 1001, 1002, 1003, 1004)"

Die Optimierer Abfrage viel schneller eine Reihe von Zahlen finden kann (mit BETWEEN), als es eine Reihe finden von Zahlen mit der IN-Klausel.

+1

Ok, aber wie können Sie es beweisen? –

+0

Ok, Damien_The_Unbeliever hatte recht, ich habe gerade den Ausführungsplan eingecheckt, dass "Select * from T where PK in (1)" als "Select * from T where PK = 1" ausgeführt wird, dh der Abfrageoptimierer hat seinen Job gemacht. Unterabfragen in der IN-Klausel werden unterschiedlich behandelt. – HABJAN

+0

Einzige Sache, die schneller sein könnte, wenn Abfrage geparst wird. :-) – HABJAN

Verwandte Themen