SQL Server Query Tuning: Warum ist die CPU-Zeit höher als die verstrichene Zeit? Sind sie relevant für den Betrieb?

8

Ich habe zwei Abfragen, um einige Benutzer zu filtern, die von der Frage und ihren Antworten abhängen.

Szenario

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%

Meine einfache Analyse

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.

Frage 1

Wie erklärt man die CPU-Zeit in Abfrage A in einer Single-Core-CPU-Umgebung mehr als die verstrichene Zeit?

Frage 2

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.

    
Jeff Chen 21.06.2011, 01:11
quelle

2 Antworten

9

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

  • Es gibt Parallelitätsoperatoren im Plan = mehr als einen logischen Prozessor, der für das Betriebssystem und SQL Server sichtbar ist. Es ist entweder multiple oder hyper-threaded

Probieren Sie EXEC xp_msver

aus     
gbn 21.06.2011, 04:25
quelle
2

In 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);

    
vivek chandel 22.07.2014 13:31
quelle