Diese SELECT-Anweisung ist mit unserem Produktionsserver verbunden (SQL Server 2008, sehr leistungsfähiger Computer) und dauert 2 Sekunden . Dabei werden alle Felder zurückgespuckt (insgesamt 4 MB Daten).
SELECT TOP (30000) *
FROM person
WITH(NOLOCK);
Von jedem anderen Feld im selben Netzwerk (Verbindung über SQL-Authentifizierung oder Windows-Authentifizierung) dauert dieselbe Abfrage 1 Minute und 8 Sekunden .
Ich teste mit dieser sehr einfachen Aussage, um zu veranschaulichen, dass es sich nicht um ein Indizierungsproblem oder ein abfragebezogenes Problem handelt. (Wir haben momentan Leistungsprobleme bei allen Abfragen ...)
Die Reihen kommen in Stücken und nicht alle auf einmal. Ich erhalte sofort meine ersten Zeilen und warte dann über 1 Minute, bis die Reihenstapel eingehen.
Hier sind die Client-Statistiken der Abfrage, wenn sie von der Remote-Box ausgeführt wird:
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0
Rows affected by INSERT, DELETE, or UPDATE statements 0
Number of SELECT statements 2
Rows returned by SELECT statements 30001
Number of transactions 0
Network Statistics
Number of server roundtrips 3
TDS packets sent from client 3
TDS packets received from server 1216
Bytes sent from client 266
Bytes received from server 4019800
Time Statistics
Client processing time 72441 ms (72 seconds)
Total execution time 72441 ms
Wait time on server replies 0
Wir können sehen, dass die "Client-Verarbeitungszeit" gleich der Gesamtausführungszeit ist.
Weiß jemand, welche Schritte ich unternehmen kann, um zu diagnostizieren, warum die Übertragung der tatsächlichen Daten lange dauert?
Gibt es einen SQL-Konfigurationsparameter, der die Datenübertragungsgeschwindigkeit zwischen Computern einschränkt oder begrenzt?
quelle
Antworten:
Ihr Problem hängt definitiv mit dem Netzwerk zusammen, basierend auf Ihren Informationen. Als solches muss es mit Netzwerkprofis behandelt werden (ich bin nicht derjenige).
Dinge, die helfen könnten:
Befindet sich der Webserver im selben Subnetz wie der SQL Server?
Gibt es Router / Bridges usw. zwischen ihnen?
Nicht viele mögliche Änderungen auf SQL Server:
Sie verwenden eine Standardgröße: Siehe Ihre Statistiken: "Vom Server 1216 empfangene TDS-Pakete" (4 MB / 1 KB = 4 KB). Ja, die Größe des TDS-Puffers kann geändert werden: siehe in Google: "Stapelgröße des TDS-Protokolls"
Gute Diskussion zum Thema: "Bestimmt die Netzwerkpaketgröße von SQL wirklich den Roundtrip-Verkehr?"
Eine Änderung der TDS-Packungsgröße hat jedoch (unvermeidlich) unvorhersehbare Auswirkungen und sollte nur in Ausnahmefällen in der Produktion verwendet werden.
Eine Änderung der Architektur oder die Einführung des Zwischenspeicherns von Daten auf mittlerer Ebene würde ebenfalls helfen.
quelle
Dieses Problem ist jetzt behoben.
Es war ein Netzwerkproblem, und die SQL-Box verwendete eine 100-MB / s- NIC-Karte anstelle einer 10-GB / s- NIC-Karte ...
Eine Änderung der Netzwerkkonfiguration zur Verwendung der richtigen Netzwerkkarte hat das Problem behoben. Jetzt erhalten wir eine ähnliche Leistung für alle Abfragen aus der Production SQL-Box und aus anderen Boxen im Netzwerk.
Vielen Dank an alle für Ihre Hilfe.
quelle
Beim ersten Lesen scheint es, als hätten Sie Probleme mit der Netzwerklatenz. Haben Sie sich einige der Network Perfmon-Zähler angesehen? Diese können Ihnen einen Hinweis darauf geben, was mit dem Netzwerk los ist.
Zitat aus Welche Perfmon-Zähler soll ich überwachen und was bedeuten sie jeweils?
quelle
Einige vorläufige Fragen: 1) Der Server hat einen SQL-Client auf Prod. Server-Maschine eingerichtet, richtig? Wenn Sie also dieselbe Abfrage vom Client auf demselben Computer ausführen, ist sie in 2 Sekunden abgeschlossen. Hast du versucht das zu tun? Ist es wirklich 2 Sekunden? 2) Sie haben erwähnt, dass die Konfiguration Ihrer Produktionsumgebung geändert wurde (oder der Produktionsserver in ein anderes Netzwerk verschoben wurde / der gesamte Server neu erstellt wurde), richtig? Was war die Abfrageverbrauchszeit in einer alten Produktionsumgebung?
Aus Neugier: Dies ist ein Beispiel für die Abfrage? oder genauer Wortlaut der Anfrage? Die Abfrage enthält wirklich KEINE WHERE-Klausel? Stimmen Sie mir zu, dass dies sehr ungewöhnlich ist. Die Tabelle hat einen Clustered-Index oder ist ein Heap? Die Tabelle enthält insgesamt wie viele Zeilen? Der Tisch ist stark fragmentiert? Aus Neugier: Warum TOP NNN AUSWÄHLEN? Warum nicht ROWCOUNT NNN SETZEN - dann SELECT *? Diese Abfrage wird wie oft vom Client pro Tag ausgegeben? 1? 100? 1MLN? Die zugrunde liegenden Daten sind statisch oder dynamisch und werden stark verändert? Wie viel (0,01 Prozent pro Tag? 1 Prozent pro Tag? 10 Prozent pro Tag?) Die Abfrageausgabe wird programmgesteuert verarbeitet? (nicht von einem Benutzer?) Warum wird es nicht zwischengespeichert / nicht auf der mittleren Ebene gespeichert? Danke, Alexei
quelle