2014-10-20 5 views
8

Welche der beiden wäre eine bessere Leistung (ich vor kurzem mit meinem Code nicht vorsichtig zu sein, weil ich die später in Oracle verwendet beschuldigt wurde):Exists/nicht vorhanden ist: ‚1 wählen‘ vs ‚Auswahlfeld‘

Select * 
from Tab1 
Where (not) exists(Select 1 From Tab2 Where Tab1.id = Tab2.id) 


Select * 
from Tab1 
Where (not) exists(Select Field1 From Tab2 Where Tab1.id = Tab2.id) 

Oder sind sie beide gleich?

Bitte beantworten Sie beide aus SQL Server Perspektive sowie Oracle Perspektive.

Ich habe gegoogled (meist von SQL-Server-Seite) und festgestellt, dass es noch eine Menge Debatte darüber, obwohl meine derzeitige Meinung/Annahme ist der Optimierer in beiden RDMBS sind reif genug zu verstehen, dass alles, was erforderlich ist aus der Unterabfrage ist ein boolescher Wert.

+1

Kein Unterschied, sie sind beide gleich. Überprüfen Sie den Ausführungsplan für beide zu überprüfenden Abfragen. –

+0

Werfen Sie einen Blick auf diese Antwort .. http://stackoverflow.com/a/6140367/2975396 – TheGameiswar

Antwort

8

Ja, sie sind gleich. exists prüft, ob in der Unterabfrage mindestens eine Zeile vorhanden ist. Wenn dies der Fall ist, wird true ausgewertet. Die Spalten in der Unterabfrage sind in keiner Weise wichtig.

Nach MSDN, exists:

Gibt eine Unterabfrage für die Existenz von Zeilen zu testen.

Und Oracle:

Ein VORHANDEN Bedingungstests für Existenz von Zeilen in einer Unterabfrage.

Vielleicht ist die MySQL documentation noch erklärt:

Traditionell eine Unterabfrage beginnt mit SELECT * vorhanden ist, aber es könnte gar mit SELECT 5 oder SELECT column1 oder irgendetwas beginnen. MySQL ignoriert die SELECT-Liste in einer solchen Unterabfrage, so dass es keinen Unterschied macht.

+0

Macht es einen Unterschied Postgres? – fatuhoku

+0

Ich weiß es nicht. Ich habe keine Erfahrung mit Postegres. –

+1

PostgreSQL ist das gleiche. Sie können auch null als alles andere auswählen. –

4

Ich weiß, das alt ist, wollen aber ich vor kurzem beobachtet einige Punkte hinzuzufügen ..

Obwohl Kontrollen nur Existenz existiert, wenn wir „select *“ alle schreiben, werden Spalten erweitert, Abgesehen von diesem leichten Overhead gibt es keine Unterschiede.

Quelle:
http://www.sqlskills.com/blogs/conor/exists-subqueries-select-1-vs-select/

Update:
Artikel i scheint bezeichnet allerdings nicht zu valid.Even wenn wir schreiben, select 1 wird SQLServer alle Spalten erweitern ..

siehe zu unterem Link für eingehende Analyse und Leistungsstatistiken, wenn verschiedene Ansätze verwendet werden.

Subquery using Exists 1 or Exists *

+0

Conors Artikel gibt es eigentlich falsch. Er schlägt vor, dass 'SELECT *' alle Spaltenmetadaten erweitert und 'SELECT 1' nicht. Aber beide tun es tatsächlich. Sie können dies erkennen, indem Sie Berechtigungen für eine Spalte verweigern und "SELECT 1 WHERE EXISTS (SELECT 1 FROM T)" ausführen, was unerwartet mit "Die SELECT-Berechtigung für die Spalte" Foo' "verweigert werden kann oder indem Sie einfach den Effekt von Hinzufügen mehrerer Spalten mit beiden oder in einem Debugger suchen http://StackOverflow.com/a/6140367/73226 –

+0

@MartinSmith: Vielen Dank, ich lese deine Antwort lange zurück, aber einige, wie verpasst einige Dinge.Vielen Dank für die Entlarvung der Mythos – TheGameiswar