2009-03-18 12 views

Antwort

2

Hängt von RDBMS ab. Sie sollten die Ausführungspläne für beide Abfragen vergleichen.

Nach meiner Erfahrung mit Oracle 10 und 11 sind Ausführungspläne immer gleich.

2

Theoretisch kann jede Unterabfrage in eine Join-Abfrage geändert werden.

+0

Gilt das für korrelierte Unterabfragen? Warum qualifizierst du dich mit "theoretisch"? Können Sie Ihre Antwort auf die Frage vervollständigen? – dkretz

3

Leistungsmäßig haben sie keinen Unterschied in den meisten modernen DB-Motoren.

3

Problem mit Unterabfragen ist, dass Sie möglicherweise eine Unterergebnisgruppe ohne Schlüssel beenden, daher wäre es teurer, sie zu verbinden.

Wenn möglich, versuchen Sie immer, JOIN-Abfragen zu machen und filtern Sie mit ON-Klausel anstelle von WHERE (obwohl es das gleiche sein sollte, da moderne Engines dafür optimiert sind).

2

Wie bei vielen Dingen, kommt es darauf an. - wie komplex ist die Unterabfrage - in einer Abfrage wie oft wird die Unterabfrage ausgeführt

Ich versuche Unterabfragen zu vermeiden, wann immer ich kann. Insbesondere wenn große Ergebnismengen erwartet werden, verwenden Sie niemals Unterabfragen - falls die Unterabfrage für jedes Element der Ergebnismenge ausgeführt wird.

kümmern, Alex

1

In SQL Server eine korrelierte Unterabfrage führt in der Regel schlechter als eine Verknüpfung oder, oft sogar noch besser für die Leistung, zu einer abgeleiteten Tabelle einen Join. Ich schreibe fast nie eine Unterabfrage für irgendetwas, das mehrfach durchgeführt werden muss. Dies liegt daran, dass korrelierte Unterabfragen Ihre Abfrage im Grunde genommen in einen Cursor verwandeln und Zeile für Zeile ausführen. In Datenbanken ist es normalerweise besser, Dinge satzbasiert zu tun

2

Lassen Sie uns die Auswirkungen auf die Leistung jetzt ignorieren (wie wir sollten, wenn wir wissen, dass "vorzeitige Optimierung die Wurzel allen Übels ist").

Wählen Sie, was klarer und einfacher zu warten aussieht.

5

Das erste Prinzip lautet "Geben Sie die Abfrage genau an". Das zweite Prinzip ist "gib die Abfrage einfach und offensichtlich an" (wo du normalerweise Entscheidungen triffst). Die dritte lautet "Geben Sie die Abfrage an, damit sie effizient verarbeitet wird".

Wenn es ein dbms mit einem guten Abfrageprozessor ist, sollten äquivalente Abfrageentwürfe zu Abfrageplänen führen, die gleich (oder mindestens gleich effizient) sind.

Meine größte Frustration bei der ersten Verwendung von MySQL war, wie bewusst ich sein musste, um den Optimierer vorwegzunehmen. Nach langjähriger Erfahrung mit Oracle, SQL Server, Informix und anderen dbms-Produkten habe ich sehr selten erwartet, mich mit solchen Problemen zu beschäftigen. Es ist jetzt besser mit neueren Versionen von MySQL, aber es ist immer noch etwas, auf das ich am Ende öfter achten muss als bei den anderen.

Verwandte Themen