Wenn ich verstehe, was Sie beobachten, ist dies, wie Management Studio Zeilen rendert , und hat wenig damit zu tun, wie SQL Server Zeilen zurückgibt . Tatsächlich kann SSMS oft nicht mithalten, wenn Sie große Ergebnisse an SSMS zurückgeben und versuchen, sie in einem Raster zu rendern, und SQL Server wartet darauf, dass die App weitere Zeilen verarbeitet. In diesem Fall wird SQL Server ASYNC_NETWORK_IO
Wartezeiten ansammeln .
Sie können dies ein wenig steuern, indem Sie "Ergebnisse in Text" anstelle von "Ergebnisse in Raster" verwenden, da SSMS Text schneller zeichnen kann als Gitter. Dies kann sich jedoch wahrscheinlich auf die Lesbarkeit auswirken, abhängig von der Anzahl der Spalten und den beteiligten Datentypen. Beides wird beeinflusst, wenn SSMS beschließt, die Ergebnisse tatsächlich in diesen Bereich zu schreiben. Dies hängt davon ab, wie voll der Ausgabepuffer ist.
Wenn Sie über mehrere Anweisungen verfügen und den Puffer zwingen möchten, die Ausgabeergebnisse im Nachrichtenfenster wiederzugeben, können Sie zwischen den Anweisungen einen kleinen Drucktrick anwenden:
RAISERROR('', 0, 1) WITH NOWAIT;
Dies hilft jedoch nicht, wenn Sie SSMS dazu bringen möchten, Zeilen schneller zu rendern, wenn die gesamte Ausgabe von einer einzelnen Anweisung stammt.
Sie können dies direkt steuern, indem Sie die Anzahl der in SSMS gerenderten Ergebnisse begrenzen. Ich sehe oft Leute, die sich darüber beschweren, wie lange es dauert, bis eine Million Zeilen wieder im Raster sind. Was um alles in der Welt jeder mit einer Million Zeilen in einem SSMS-Grid machen wird, weiß ich nicht.
Es gibt einige Hacks wie OPTION (FAST 100)
, die für das Abrufen dieser ersten 100 Zeilen (oder aller 100 Zeilen, wenn es keine äußeren gibt ORDER BY
) optimiert sind , aber dies kann zu Lasten eines viel langsameren Abrufs für den Rest der Zeilen und eines Plans gehen, der mehr ist Insgesamt ineffizient, ist also meiner Meinung nach keine gute Wahl.
WHERE t.x IN (<complex SELECT subquery>)
der entsprechende LEFT JOIN, überprüft wirdLEFT JOIN (<complex SELECT subquery>) AS r ON r.x = t.x .... WHERE r.x IS NULL
, muss auch die Unterabfrage ausgewertet werden (also derselbe komplexe Plan mit dem NOT IN-Version).NOT EXISTS
aber OracleNOT IN
bei Abfragen. Aber heute muss es als Fehler im Plan Generator betrachtet werden