Warum ist TOP-Operation im SQL-Ausführungsplan

9

Nachdem ich eine Weile gesucht hatte, entschied ich mich, diese Frage zu stellen, weil ich keine Antwort gefunden hatte, und mich zu entschuldigen, wenn es eine ähnliche Frage / Antwort gibt.

Wenn Sie die folgende Abfrage auf zwei ähnlich eingerichteten SQL-Servern ausführen, treten unterschiedliche Ausführungspläne auf, die sich auf die Leistung auswirken, und wir benötigen Hilfe, um die Ursache herauszufinden.

Die Abfrage:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

Ausführungsplan von Server A. Server B.

Ausführungsplan von Server B Server B http://s2.postimg.org/z9fjrfv4n/server_B.png

Sie werden feststellen, dass Server B im eigentlichen Ausführungsplan die TOP-physische Operation hat, und wir versuchen herauszufinden, warum. Beide Abfragen verwenden denselben Index in der Indexsuche.

Hier sind einige Details zu Server A und Server B.

Server A und B sind beide

Windows Server 2008 R2 Standard Service Pack 1

24 GB RAM

64-Bit-Betriebssystem

SQL Server 2012- Versionen, die mit ( SELECT SERVERPROPERTY ('ProductVersion') ) erhalten wurden

Server Eine SQL-Version 11.0.3000.0

Server B SQL Version 11.0.5058.0

Was wir versucht haben

  1. Zwischenspeicher-Caches löschen
  2. Indizes neu erstellen
  3. Statistiken aktualisieren
  4. SET ROWCOUNT 0 mit rowcount und los

Warum hat Server B das TOP im Ausführungsplan? In diesem einfachen Abfragebeispiel gibt es keine wirklichen Probleme, aber in einer größeren Abfrage steigen die Kosten für das TOP und wir sehen einen Leistungseinbruch. Jede Hilfe beim Debuggen wäre sehr dankbar und wir können Ihnen zusätzliche Informationen zur Verfügung stellen, die Sie möglicherweise benötigen, um zu helfen.

Arthur Yegiazaryan
quelle
Der TOPBediener schlägt SET ROWCOUNTvor, dass für diese Verbindung zuvor ein Wert ungleich Null ausgeführt wurde. Versuchen Sie es nach der Ausführung erneut mit SET ROWCOUNT 0;. Außerdem sind die von Ihnen veröffentlichten SQL-Versionen nicht SQL 2008 R2. Führen Sie es SELECT SERVERPROPERTY('ProductVersion');auf den beiden Servern aus, um die aktuelle SQL Server-Version abzurufen.
Dan Guzman
Ich habe den ursprünglichen Beitrag mit den SQL-Versionen unter Verwendung der bereitgestellten Auswahlabfrage aktualisiert. Die Server, auf denen SQL installiert ist, sind Windows 2008 R2-Server, während die SQL-Server 2012 installiert sind. Wie zuvor von einem anderen Mitglied vorgeschlagen und dann gelöscht, haben wir versucht, ROWCOUNT auf 0 zu setzen, ohne den Ausführungsplan zu ändern. Siehe die aktualisierte Frage
Arthur Yegiazaryan
Können Sie ein GOnach der Zeilenanzahl setzen. Können Sie auch die Eigenschaften des Top-Operators veröffentlichen?
Rob Farley
Rob, fügte den GO und die Eigenschaften von TOP zum ursprünglichen Beitrag hinzu
Arthur Yegiazaryan

Antworten:

12

Stellen Sie sicher, dass die Datenbankkompatibilitätsstufe auf den beiden Servern gleich ist. Ich habe einen Schnelltest für eine SQL Server 2012-Instanz ausgeführt und festgestellt, dass der TOP-Operator eingeführt wird, wenn die Kompatibilitätsstufe 100 oder weniger beträgt. Sofern Sie keinen bestimmten Grund haben, etwas anderes zu tun, verwenden Sie am besten die Kompatibilitätsstufe 110 (SQL Server 2012) für eine SQL Server 2012-Instanz.

Dan Guzman
quelle
2

Ich denke, Sie haben einen Wert für ROWCOUNT. Machen:

SET ROWCOUNT 0

... um es auszuschalten.

Rob Farley
quelle
1
SET ROWCOUNT 0 hat das TOP nicht aus dem Ausführungsplan entfernt
Arthur Yegiazaryan
1
@Arthur Während dies in Ihrem Fall nicht die Lösung war , könnte es der Grund für das Verhalten zukünftiger Leser sein. (Sorry Rob, ich habe mir erlaubt, Ihren Beitrag zu löschen, da dies wirklich das Problem für das gleiche Symptom sein könnte.)
Aaron Bertrand
Aaron, stimmte zu und danke, dass du es zurückgebracht hast. Nicht die Lösung für mich, könnte aber für andere sein.
Arthur Yegiazaryan