Aktualisierungsstatistiken mit vollständigem Scan unter SQL Server 2014 verwenden 100% CPU, unter 2008 R2 15%

10

Warum verbrauchen vollständige Scan-Aktualisierungsstatistiken 100% der CPU unter SQL Server 2014, wenn möglicherweise 20% der CPU unter SQL Server 2008 R2 für dieselben Tabellen mit ähnlichen Hardwarefunktionen verwendet werden?

Ich habe mir MAXDOPandere Optionen angesehen und sehe wirklich nichts, was auffällt. Mir ist klar, dass es Einstellungen geben könnte, die dies verursachen könnten, aber die Einstellungen sind für beide Datenbanken sehr ähnlich (z. B. MAXDOP4 für beide, wobei beide mehrere Kerne haben). Beide sind Enterprise Edition.

Gibt es in SQL Server 2014 etwas "anderes" als in SQL Server 2008 R2, das dies erklären könnte? Ich habe die Speicheroption bei 90% für beide Server. Irgendwelche Gedanken darüber, wonach zu suchen ist?

Ich führe einmal pro Woche Aktualisierungsstatistiken mit vollständigem (100%) Scan auf zwei Servern mit SQL Server 2008 R2 / SP3 und SQL Server 2014 / SP2 aus, und die Datenbanken haben dieselbe Struktur. Auf dem 2008 R2-Server dauert die Aktualisierung von zwei sehr großen Tabellen mehrere Stunden, was ich erwarte, aber die CPU bleibt die ganze Zeit über unter 20% ausgelastet. Auf dem Server von 2014 geht die CPU jedoch für etwa 40 Minuten auf 100%. Die Tabellen sind auf dem Server 2014 etwas kleiner. Ich sehe dies anhand der SQL Monitor-Analysemenüs.

Hier ist die Ausgabe der Ola-Protokolldatei auf dem SQL Server 2014, die CPU geht von etwa 2:10 bis 2:45 auf 100%:

Date and time: 2017-06-24 02:10:20  
Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000005_15502E78] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:07:48  
Date and time: 2017-06-24 02:18:08  
Date and time: 2017-06-24 02:18:08  
Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000006_15502E78] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:32:22  
Date and time: 2017-06-24 02:50:30  

Hier ist die Ausgabe der Ola-Protokolldatei auf dem 2008 R2 SQL Server für die beiden oben genannten Statistiken, aber die CPU beträgt möglicherweise 15%:

Date and time: 2017-06-24 03:30:32  
Command: UPDATE STATISTICS [InGA].[dbo].[AuditField] [_WA_Sys_00000003_0425A276] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:05:00  
Date and time: 2017-06-24 03:35:32  
Date and time: 2017-06-24 03:35:32  
Command: UPDATE STATISTICS [InGA].[dbo].[AuditField] [_WA_Sys_00000004_0425A276] WITH FULLSCAN  
Outcome: Succeeded  
Duration: 00:52:31  
Date and time: 2017-06-24 04:28:03

Ich kann sie nicht mit Server maxdop = 1 ausführen, da dadurch die gesamte parallele Planerstellung entfällt und die Anwendung beschädigt werden kann. Ich plane, in die entgegengesetzte Richtung zu gehen und sie auf 8 zu erhöhen (es gibt 16 Kerne auf der Box) und zu sehen, was passiert. Kann schneller gehen, um die Zeitspanne zu verkürzen, in der die CPU gebunden ist. Dieser Job wird ausgeführt, während Benutzer meistens nicht erreichbar sind.

TRH_SETRANS
quelle
Haben Sie überprüft, ob der Prozess auf dem 2008 R2-Server E / A-gebunden ist? Ist die tempdbKonfiguration gleich? Es kann während der UPDATE STATISTICSAusführung verwendet werden, sodass dies auch ein Problem sein kann.
MicSim
1
Ich würde auch vermuten, dass Parallelität wahrscheinlich der Schuldige ist. Haben Sie zufällig den Kostenschwellenwert für Parallelität überprüft? Es kann auch eine gute Idee sein, die vollständige sp_configure-Liste aus beiden Feldern abzurufen und sie zu unterscheiden, um festzustellen, was sonst noch anders ist.
DBADon

Antworten:

1

Statistikaktualisierungen können basierend auf vielen verschiedenen Optionen in SQL Server parallel erfolgen:

  • Kostenschwelle für Parallelität - Eine Abfrage muss so hoch sein, um mit dem Parallelitätszug fahren zu können. Ihre beiden Server können unterschiedliche CTFP-Einstellungen haben, die dazu führen, dass das 2008R2-Update Single-Threaded wird, während das 2014-Update Multithread-fähig sein kann.
  • Maximaler Parallelitätsgrad - Gibt an, wie viele Kerne eine Abfrage höchstens verwenden kann, wenn SQL Server sie so weit parallelisieren möchte. In der 2008R2-Box ist MAXDOP möglicherweise auf 1 gesetzt, während in der 2014-Box möglicherweise der Standardwert 0 (unbegrenzt) festgelegt ist.
  • Resource Governor - Mit dieser Enterprise Edition-Funktion können Sie verschiedene Benutzergruppen oder Anwendungen auf verschiedene MAXDOPs drosseln.

In späteren Versionen von SQL Server (2016 und neuer) wird dies noch komplizierter:

  • Gültigkeitsbereichsoptionen auf Datenbankebene - Sie können mit der rechten Maustaste auf eine Datenbank klicken, Eigenschaften aufrufen und die MAXDOP-Ebene für diese Datenbank festlegen.
  • Hinweise zur Statistikparallelität - Ab 2016 SP2 akzeptieren die Anweisungen zum Erstellen und Aktualisieren von Statistiken MAXDOP-Hinweise

Wie Sie bereits bemerkt haben, wird Ihr 2008R2 mit einem Thread ausgeführt, während der 2014R mit mehreren Threads betrieben wird (wodurch die Ausführung schneller erfolgt, die CPU jedoch während der Ausführung maximal ausgelastet ist).

Um die richtige Balance für Ihre Statistikjobs zu finden, denken Sie an:

  • Welche anderen Workloads werden gleichzeitig in der Datenbank ausgeführt? Können Sie es sich leisten, die Box in kurzen Zeiträumen zu dominieren? Zum Beispiel habe ich in Data Warehouses, die während der meisten Wochenendstunden im Leerlauf sind, Leute gesehen, die sich mit Statistik-Updates mit Fullscans schwer getan haben, wenn sie wissen, dass sowieso niemand den Server verwendet. In Hochleistungs-Transaktionsumgebungen müssen Sie weniger Auswirkungen auf Wartungsaufgaben verwenden, wenn sich Benutzer auch während Mitternacht beschweren.
  • Ist Fullscan wirklich notwendig? Sehen Sie Abfragen, die nur dann gute Pläne erhalten, wenn Sie die Fullscan-Option verwenden, oder tun Sie dies lediglich als Best-Practice-Sache? Wenn Ihre Datenbank wächst und Ihre Hardware-Investitionen nicht Schritt halten, müssen Sie möglicherweise Kompromisse bei der Stichprobenerfassung eingehen, anstatt Fullscans durchzuführen.
  • Können Sie Statistiken seltener aktualisieren? Aktualisieren Sie beispielsweise jedes Wochenende 1/4 Ihrer Statistiken, und dann werden jeden Monat alle Statistiken aktualisiert?
  • Können Sie weniger Objekte aktualisieren? Oft sehe ich Leute, die Statistiken sogar in großen Audit- oder Archivtabellen aktualisieren, nur weil ein paar Dutzend neue Einfügungen vorgenommen wurden, aber diese Einfügungen wirken sich nicht wirklich auf die Statistiken in der Tabelle aus (und niemand fragt sie sowieso ab.)
Brent Ozar
quelle
0

Antwort des Community-Wikis :

Beste Vermutung: Der Plan zum Aktualisieren der Statistiken ist für die Box 2014 entweder parallel oder paralleler als für die Box 2008 R2.

Parallele Aktualisierungsstatistiken für fullscangibt es seit 2005, und Stichprobenstatistiken ab 2016 finden Sie unter Ergänzungen zum Abfrageoptimierungsprogramm in SQL Server 2016 von Gjorgji Gjeorgjievski im SQL Server Database Engine-Blog.

Wenn Sie über Enterprise Edition verfügen, können Sie Resource Governor verwenden , um die von Ihrem Wartungsjob verwendete CPU zu begrenzen.

Beachten Sie auch für den Vorschlag Connect Abstimmung Add MAXDOPParameter zu aktualisieren Statistiken von Javier Villegas.

Verwandte Fragen und Antworten: Parallel Statistics Update

user126897
quelle