Ich habe zwei Abfragen, um einige Benutzer zu filtern, die von der Frage und ihren Antworten abhängen.
Abfrage A ist (die ursprüngliche Version):
%Vor%Ich benutze 'set statistics time on' und 'set statistic on' um die CPU-Zeit und io-Leistung zu überprüfen.
das Ergebnis ist:
%Vor%Ich habe Abfrage A über Set Operation neu geschrieben, lassen Sie es mich Abfrage B nennen:
%Vor%Die CPU-Zeit und die verstrichene Zeit ist:
%Vor%Wie Sie aus dem Ergebnis sehen können, hat Abfrage A eine CPU-Zeit, die mehr als zwei Mal verstrichen ist
Ich suche nach diesem Fall, meistens sagen Leute, dass die CPU-Zeit weniger als die verstrichene Zeit sein sollte, weil die CPU-Zeit angibt, wie lange die CPU diese Aufgabe ausführt. Und die verstrichene Zeit umfasst I / O-Zeit und andere Art von Zeitkosten. Ein besonderer Fall ist jedoch, wenn der Server mehrere Core-CPUs hat. Allerdings habe ich nur den Entwicklungs-DB-Server überprüft und es hat eine einzige Kern-CPU.
Wie erklärt man die CPU-Zeit in Abfrage A in einer Single-Core-CPU-Umgebung mehr als die verstrichene Zeit?
Nach, Set-Operation, Ist die Leistung wirklich verbessert?
Ich habe diese Frage, weil das logische Lesen von Abfrage B 280627 ist, was höher ist als Abfrage 241885 von Abfrage
Brad McGehee sagte in seinem Artikel, dass 'Je weniger logische Lesevorgänge von einer Abfrage ausgeführt werden, desto effizienter ist sie und desto schneller wird sie ausgeführt, unter der Annahme, dass alle anderen Dinge gleich gehalten werden .Than, sagt es richtig, dass sogar Abfrage B höhere logische Lesevorgänge als Abfrage A hat, aber CPU-Zeit ist deutlich geringer als Abfrage A, Abfrage B sollte eine bessere Leistung haben.
Wenn die CPU größer als abgelaufen ist, haben Sie eine CPU mit mehreren oder mehr Threads
In der CPU-Zeit wird die SQL Server Engine installiert. Es ist nicht für eine lokale Management Studio-Installation.
Wie für logische IO gegenüber CPU würde ich mit niedrigerer CPU gehen. Wenn dies häufig und überlappend ausgeführt wird, ist die CPU-Ressource zuerst erschöpft. Ich würde ein Konstrukt WHERE EXISTS (UNION ALL) versuchen und sicherstellen, dass ich gute Indizes habe.
Bearbeiten, nach Kommentaren
Probieren Sie EXEC xp_msver
ausIn meinem Fall - SQL Server-Ausführungszeiten: CPU-Zeit = 671 ms, verstrichene Zeit = 255 ms.
Die CPU-Zeit war fast dreimal größer als die verstrichene Zeit für die Abfrage. Weil die Abfrage parallel verarbeitet wurde, war die CPU-Last sehr hoch, und die CPU könnte ein Engpass werden für dieses Szenario.
SQL Server 2012 bringt eine Lösung für das CPU-Belastungsproblem. Es führt Iteratoren ein Dadurch werden Stapel von Zeilen gleichzeitig verarbeitet, nicht nur Zeile für Zeile.
Für die Abfrageoptimierung können Sie columnstore index für Ihre Tabelle erstellen -
COLUMNSTORE INDEX erstellen IDX_cs_Colname ON dbo.Tabelname (feild1, feild2);
Tags und Links sql-server performance query-optimization cpu-time