Warum verwenden SQL Server-Abfragen nicht mehr als 7 MB / s Festplatten-E / A.

11

Ich habe eine SSD, die mithilfe des IOmeter-Tests eine Leistung von über 200 MB / s anzeigt. Wenn ich jedoch eine SQL-Abfrage von einem lokalen Computer aus ausführe, zeigt der Windows-Ressourcenmonitor niemals Festplatten-E / A über 7 MB / s an. Dies gilt auch für Abfragen, deren Ausführung länger als 2 Minuten dauert. Was könnte der Engpass sein, dass nur 7 MB / s von SSD verwendet werden?

Ich renne:

  • Windows Server 2012 Standard
  • SQL Server 2008 r2
  • Intel i7 3820
  • 32 GB RAM
  • Sandisk SSD
Dean MacGregor
quelle
2
Vielleicht befinden sich die Daten bereits im RAM und es ist kein Festplattenzugriff erforderlich?
Gbn
1
@ DeanMacGregor - Wie verbrauchen Sie die Ergebnisse? Wenn in SSMS, was ist, wenn Sie die Option versuchen, die Ergebnisse zu verwerfen. Ändert das etwas? Sie können auch versuchen, sys.dm_os_waiting_taskswährend der Ausführung der Abfrage zu prüfen, ob andere Wartetypen vorhanden sind.
Martin Smith
1
Sind die 200 MB / s für Lesevorgänge mit wahlfreiem Zugriff (zufällige Lesevorgänge für 4-KB-Blöcke)? Ich denke, das ist es, was eine Datenbank normalerweise tun würde. Schreibt die Abfrage auf die Festplatte (temporäre Datei, temporäre Ergebnismenge oder Tabelle)?
2
@DeanMacGregor - Um dies aus der Gleichung herauszunehmen, können Sie das Ergebnis skalaren Variablen zuweisen (Beispielabfrage). DECLARE @Name VARCHAR(10), @High int; SELECT @Name=name, @High = high FROM master..spt_values. Es werden also keine Ergebnisse an den Client zurückgesendet, aber der Plan und die E / A bleiben unverändert.
Martin Smith
4
Angenommen, Sie interpretieren ASYNC_NETWORK_IO und warten darauf, dass das Problem mit dem Netzwerk zusammenhängt. Es ist (normalerweise) nicht. Es ist sehr wahrscheinlich, dass @MartinSmith (zweimal) vorgeschlagen hat, dass SSMS oder die von Ihnen verwendete Anwendung die Ergebnisse nicht so schnell verbraucht, wie SQL sie bereitstellt. Befolgen Sie eine der vorgeschlagenen Möglichkeiten, um den Verbrauch der Zeilen wegzulassen, und Sie erhalten ein echtes (r) Bild des maximalen E / A-Durchsatzes.
Mark Storey-Smith

Antworten:

7

Aus der Kommentarkette geht hervor, dass Sie ASYNC_NETWORK_IOWartezeiten so interpretieren , dass das Problem mit dem Netzwerk zusammenhängt. Es ist (normalerweise) nicht.

Wie @MartinSmith (zweimal) angedeutet hat, ist die wahrscheinlichste Erklärung dafür SSMS oder die von Ihnen verwendete Anwendung, die die Ergebnisse nicht so schnell verbraucht, wie SQL Server sie bereitstellt. Befolgen Sie eine der vorgeschlagenen Methoden, um den Verbrauch der Zeilen aus Ihrer Messung zu entfernen, und Sie erhalten ein echtes (r) Bild des maximalen E / A-Durchsatzes:

Nur für den Fall, dass Sie dies noch nicht getan haben, müssen Sie natürlich DBCC DROPCLEANBUFFERSsicherstellen, dass die Daten tatsächlich von der Festplatte gelesen werden und nicht vom Puffercache. Es gelten die üblichen Vorbehalte "Nur beim Test, tun Sie dies nicht in einer aktiven Live-Umgebung" usw.

Ein paar Ihrer anderen Kommentare:

Während der Ausführung einer Abfrage, die 9 Millionen Zeilen zurückgibt, bleibt die CPU-Auslastung bei 13%, wobei 9% auf sqlserver zurückzuführen sind. Würden die Ergebnisse nicht schneller als 3 Minuten zurückgegeben, wenn sich alle Daten im RAM befinden?

Was genau testen wir hier, wie und warum? Wenn Ihre 9-Millionen-Zeilen-Abfrage etwas anderes als a SELECT * FROM dbo.SomeTableist, spielen 1001 Faktoren eine Rolle, außer nur der rohe E / A-Durchsatz.

Ihr Intel I7-3820 ist ein 4-Kern-Prozessor. Wenn Ihre Testabfrage keinen parallelen Plan generiert, wäre ich überrascht, wenn Sie mehr als 20% der CPU-Auslastung aus dem System herausholen könnten.

Die 3 Minuten, um 9 Millionen Zeilen zurückzugeben, sind sehr verdächtig und deuten darauf hin, dass wir kein vollständiges Bild von Ihren Tests erhalten. Ich würde vermuten, dass dies ein Fall eines suboptimalen (nicht parallelen) Abfrageplans ist, der voll von Nested-Loop-Operatoren ist, die Millionen von Zeilen ziehen, dh nicht nur eine einzige Tabelle SELECT, um den E / A-Verbrauch zu überprüfen.

Ich schlage vor:

  1. SELECT *um nur E / A über SQL Server zu testen .
  2. Neue Frage mit dem Ausführungsplan Ihrer Abfrage, wenn Sie herausfinden möchten, warum die E / A nicht gesättigt ist.
Mark Storey-Smith
quelle
Eigentlich ist es nur * aus dbo.sometable auswählen. Entschuldigung, das habe ich nicht früher erwähnt. Was ich damit meinte war, dass ich diese Abfrage von jeder Tabelle aus ausführen konnte. Die Entstehung meiner Frage war, dass ich bemerkte, dass meine Festplatten-E / A viel geringer war als ich erwartet hatte, selbst bei einer einfachen Abfrage "Gib mir viele Daten". Mein Hauptanliegen war, dass bei einer so niedrigen Festplatten-E / A die Leistung verbessert werden könnte, wenn die Hauptursache für eine niedrige Festplatten-E / A beseitigt würde.
Dean MacGregor