SQL Server löscht den Plan-Cache und die Ausführungsstatistik regelmäßig


24

Nach dem Upgrade von SQL Server 2014 auf 2016 setzt der Server die zwischengespeicherten Ausführungspläne und dm*-ansichten dm_exec_query_statsusw. alle paar Stunden zurück

Als ob jemand ausführt DBCC FREEPROCCACHEund DBCC DROPCLEANBUFFERSmanuell ( mit Ausnahme niemand tut, es geschieht automatisch).

Dieselbe Datenbank funktionierte auch in SQL Server 2014 und Windows Server 2012 einwandfrei. Nach dem Wechsel zu SQL Server 2016 (und Windows Server 2016) gingen die Dinge in den Süden.

Dinge, die ich überprüft habe: Die Datenbank verfügt nicht über das Flag "Automatisch schließen". Der SQL Server ist auf ad hoc optimizedeingestellt true(ich dachte, es würde helfen, es hat nicht geholfen). Der "Abfragespeicher" ist "aus". Server hat 16 GB Speicher.

Auch im "SQL Server-Protokoll" ist nichts hilfreich. Nur eine wöchentliche Backup-Nachricht ...

Ich habe diesen Artikel auch unter https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-set-options gelesen (scrollen Sie nach unten zum Abschnitt "Beispiele" und oben rechts) it) Es gibt eine Liste von Situationen, in denen der Plan automatisch gelöscht wird. Keines davon trifft zu.

AKTUALISIEREN:

Leider hat keiner der Vorschläge geholfen. Durch Erteilen von LPIM-Berechtigungen, Erkennen und Beheben von nicht parametrisierten Abfragen, die Unmengen von Plänen für dieselbe Abfrage generiert haben, wird der "maximale Serverspeicher" gesenkt ... Die Pläne werden nach dem Zufallsprinzip alle paar Stunden bis alle 5-10 Minuten zurückgesetzt. Wenn der Server "unter Speicherdruck" war, warum funktionierte die Version 2014 auf demselben Computer einwandfrei?

Hier ist die Ausgabe von sp_Blitz wie gewünscht

**Priority 10: Performance**:

- Query Store Disabled - The new SQL Server 2016 Query Store feature has not been enabled on this database.

    * xxx


**Priority 50: Server Info**:

- Instant File Initialization Not Enabled  - Consider enabling IFI for faster restores and data file growths.


**Priority 100: Performance**:

- Resource Governor Enabled  - Resource Governor is enabled.  Queries may be throttled.  Make sure you understand how the Classifier Function is configured.


**Priority 120: Query Plans**:

- Implicit Conversion Affecting Cardinality - One of the top resource-intensive queries has an implicit conversion that is affecting cardinality estimation.

    * 

- Missing Index - One of the top resource-intensive queries may be dramatically improved by adding an index.

    * 

- RID or Key Lookups - One of the top resource-intensive queries contains RID or Key Lookups. Try to avoid them by creating covering indexes.

    * 

**Priority 170: File Configuration**:

- System Database on C Drive
    * master - The master database has a file on the C drive.  Putting system databases on the C drive runs the risk of crashing the server when it runs out of space.

    * model - The model database has a file on the C drive.  Putting system databases on the C drive runs the risk of crashing the server when it runs out of space.

    * msdb - The msdb database has a file on the C drive.  Putting system databases on the C drive runs the risk of crashing the server when it runs out of space.


**Priority 200: Backup**:

- MSDB Backup History Not Purged msdb - Database backup history retained back to Jun 10 2017  9:47PM


**Priority 200: Informational**:

- Backup Compression Default Off  - Uncompressed full backups have happened recently, and backup compression is not turned on at the server level. Backup compression is included with SQL Server 2008R2 & newer, even in Standard Edition. We recommend turning backup compression on by default so that ad-hoc backups will get compressed.


**Priority 200: Non-Default Server Config**:

- Agent XPs  - This sp_configure option has been changed.  Its default value is 0 and it has been set to 1.

- max server memory (MB)  - This sp_configure option has been changed.  Its default value is 2147483647 and it has been set to 15000.

- optimize for ad hoc workloads  - This sp_configure option has been changed.  Its default value is 0 and it has been set to 1.

- show advanced options  - This sp_configure option has been changed.  Its default value is 0 and it has been set to 1.

- xp_cmdshell  - This sp_configure option has been changed.  Its default value is 0 and it has been set to 1.


**Priority 200: Performance**:

- Buffer Pool Extensions Enabled  - You have Buffer Pool Extensions enabled, and one lives here: Z:\sql_buffer_pool.BPE. It's currently 60.00000000000 GB. Did you know that BPEs only provide single threaded access 8KB (one page) at a time?

- cost threshold for parallelism  - Set to 5, its default value. Changing this sp_configure setting may reduce CXPACKET waits.

**Priority 240: Wait Stats**:

- No Significant Waits Detected  - This server might be just sitting around idle, or someone may have cleared wait stats recently.

**Priority 250: Informational**:

- SQL Server Agent is running under an NT Service account  - I'm running as NT Service\SQLSERVERAGENT. I wish I had an Active Directory service account instead.

- SQL Server is running under an NT Service account  - I'm running as NT Service\MSSQLSERVER. I wish I had an Active Directory service account instead.

**Priority 250: Server Info**:

- Default Trace Contents  - The default trace holds 125 hours of data between Aug 19 2017 11:55AM and Aug 24 2017  4:59PM. The default trace files are located in: C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Log

- Hardware  - Logical processors: 2. Physical memory: 15GB.

- Hardware - NUMA Config  - Node: 0 State: ONLINE Online schedulers: 2 Offline schedulers: 0 Processor Group: 0 Memory node: 0 Memory VAS Reserved GB: 29

- Locked Pages In Memory Enabled  - You currently have 12.02534484863 GB of pages locked in memory.

- Memory Model Unconventional  - Memory Model: LOCK_PAGES

- Server Last Restart  - Aug 20 2017 12:32PM

- Server Name  - xx

- Services
 - Service: SQL Full-text Filter Daemon Launcher (MSSQLSERVER) runs under service account NT Service\MSSQLFDLauncher. Last startup time: not shown.. Startup type: Manual, currently Running.

 - Service: SQL Server (MSSQLSERVER) runs under service account NT Service\MSSQLSERVER. Last startup time: Aug 20 2017 12:32PM. Startup type: Automatic, currently Running.

 - Service: SQL Server Agent (MSSQLSERVER) runs under service account NT Service\SQLSERVERAGENT. Last startup time: not shown.. Startup type: Automatic, currently Running.

- SQL Server Last Restart  - Aug 20 2017 12:33PM

- SQL Server Service  - Version: 13.0.4446.0. Patch Level: SP1. Edition: Enterprise Edition (64-bit). AlwaysOn Enabled: 0. AlwaysOn Mgr Status: 2

- Virtual Server  - Type: (HYPERVISOR)

- Windows Version  - You're running a pretty modern version of Windows: Server 2012R2 era, version 6.3


**Priority 254: Rundate**:

 - Captain's log: stardate something and something...

1
Ich habe das gleiche Problem gelöst, können Sie versuchen. dba.stackexchange.com/questions/179618/query-plan-deleted/…
Yunus UYANIK

Antworten:


27

Rufen Sie zunächst die genauen Zeiten ab, zu denen der Plan-Cache geleert wird. Das geht am einfachsten - es sollte fast sofort laufen und niemanden blockieren:

SELECT TOP 1 creation_time
FROM sys.dm_exec_query_stats WITH (NOLOCK)
ORDER BY creation_time;

Wenn Ihnen das Datum / die Uhrzeit älter vorkommt als erwartet , wird nur ein Teil des Plan-Caches gelöscht. Zum Beispiel führt möglicherweise jemand einen Job zum Neuerstellen oder Aktualisieren von Indizes durch, wodurch der Plan-Cache für die bestimmten betroffenen Objekte geleert wird. Andere Objekte bleiben jedoch weiterhin erhalten. Ich sehe dies oft, wenn Systemabfragen (wie DMV-Abfragen) bestehen bleiben, aber Benutzerdatenbankpläne gelöscht werden.

Wenn dieses Datum / diese Uhrzeit in bestimmten Intervallen aktualisiert wird , z. B. alle 2 Stunden, um 6:00, 8:00, 10:00 usw. anzuzeigen, führt wahrscheinlich jemand einen Auftrag oder eine Abfrage aus, die den Plan-Cache veranlasst ausräumen. Sobald Sie die genaue Frequenz kennen, können Sie:

  • Sehen Sie sich Ihre Jobpläne an, um zu sehen, was in diesem Intervall ausgeführt wird
  • Führen Sie während dieser Zeitspanne einen Profiler-Trace oder einen Extended Events-Trace durch, um das Rätsel zu lösen (ich bin normalerweise kein Fan der Nachverfolgung in der Produktion, aber wenn Sie genau wissen, wann der Killer zuschlagen wird, ist es einfach genug, ein Tief zu starten -Obenliegende Probe von dem, was läuft)
  • Melden Sie sich sp_WhoIsActivean einen Tisch während dieser Zeit (die einfachste Methode, aber die am wenigsten wahrscheinlich , es zu verengen , um die genaue Abfrage verursacht es)

Wenn sich dieses Datum und diese Uhrzeit jedes Mal ändern, wenn Sie die Abfrage ausführen , ist Ihr Server wahrscheinlich unter Speicherdruck. Führen Sie dies aus, um grundlegende Informationen zur Integritätsprüfung zu generieren. Anschließend können Sie sie kopieren und in Ihre Stapelfrage einfügen, damit wir sie diagnostizieren können:

sp_Blitz @OutputType = 'markdown', @CheckServerInfo = 1, @CheckUserDatabaseObjects = 1

(Offenlegung: Ich bin einer der Autoren von sp_Blitz.)

Aktualisiert am 25.08.2017 mit Ihren sp_Blitz-Daten. Vielen Dank, dass Sie sp_Blitz ausgeführt und Ihrer Frage hinzugefügt haben. Es zeigt wirklich einige Dinge. Sie führen SQL Server 2016 Enterprise Edition auf einer VM mit 2 Kernen und 16 GB RAM aus. Zunächst ein kurzer Hinweis zur Lizenzierung: Wenn Sie vom Gast lizenziert werden, müssen mindestens 4 Kerne erworben werden, nicht 2. ( Weitere Informationen finden Sie im SQL Server-Lizenzierungshandbuch .) 4 Kerne der Enterprise Edition kosten ca. 28.000 USD und es ist ziemlich ungewöhnlich zu sehen, dass viel Lizenzgeld für nur 16 GB RAM ausgegeben wird. Wenn Sie SQL Server Enterprise Edition auf Hostebene lizenzieren, können Sie dies ignorieren und kleinere VMs ausführen.

Ihr SQL Server scheint unter externem Speicherdruck zu stehen. Sie haben 16 GB RAM und den maximalen Serverspeicher auf 15 GB eingestellt. Leider ist nicht genug 1 GB für das Betriebssystem übrig (plus was auch immer Sie dort ausführen werden, wie Backup-Software und SSMS) ist größer - in Ihrem Fall wären das 4 GB, sodass Ihre maximale Serverspeichereinstellung 12 GB und nicht 15 GB betragen sollte.

Weitere Hinweise finden Sie in Ihren aktuellen Speicherzuordnungen: Sie haben gesperrte Seiten im Speicher (LPIM) aktiviert, aber Sie haben nur 12,02 GB Seiten im Speicher gesperrt. Das bedeutet wahrscheinlich (aber nicht garantiert), dass eine andere Anwendung Speicher benötigt. Daher hat Windows eine Speicherdruckbenachrichtigung gesendet, und SQL Server hat die anderen 3 GB Arbeitsspeicher freigegeben, damit die andere App ihre Arbeit erledigen kann. Dies ist ein weiterer Beweis dafür, dass Sie mit maximal 15 GB nicht wirklich zurechtkommen können - Sie benötigen Speicher für andere Dinge.

Wenn Ihr SQL Server unter diesen externen Speicherdruck gerät und Speicher für andere Apps freigeben muss, leidet Ihr Plan-Cache.

Sie haben also ein paar Möglichkeiten:

  • Stellen Sie den maximalen Arbeitsspeicher entsprechend ein - sagen wir, 12 GB (oder sogar weniger, wenn Sie andere Apps auf dem Server ausführen). Auf diese Weise muss SQL Server keinen Feuerverkauf für den Arbeitsspeicher haben und die Daten nur aus anderen Gründen löschen App benötigt 2-3 GB RAM - es wird bereits verfügbar sein
  • Stoppen Sie die Ausführung anderer Apps auf dem Server. Dies kann jedoch schwierig sein, wenn andere Sysadmins Remote-Desktops ausführen und Dinge wie SSMS ausführen. Ich habe Perfmon-Zähleralarme für die Anzahl der geöffneten RDP-Sitzungen eingerichtet und benachrichtigt, wenn eine andere Zahl als 0 vorliegt. Dies kann dazu beitragen, den Täter in Aktion zu fangen.
  • Fügen Sie der VM mehr Speicher hinzu - aber ich glaube nicht, dass Sie es wirklich brauchen. Der sp_Blitz-Bericht "Keine signifikanten Wartezeiten festgestellt" zeigt einige Hinweise. Ich glaube nicht, dass Sie unter häufigem Gedächtnisdruck stehen, zumal Sie berichten, dass dies nur gelegentlich vorkommt. Dies ist die kostengünstigste Option.

5

OK, OP hier, ich habe dieses Problem endlich behoben, indem ich SQL Server 2016 auf die neueste Version aktualisiert habe. Ich hatte SP1und gestern habe ich installiert Cumulative Update 6.

Ich stelle auch "max memory" entsprechend ein, wie es die Antwort von Brent vorschlägt. Tolle Antwort übrigens, ich fordere alle auf, es zu unterstützen.

Es sind 36 Stunden vergangen und die Pläne werden nicht zurückgesetzt.

Brent Ozar hat auch eine sehr schöne Website hier: https://sqlserverupdates.com/ , um festzustellen, welche Updates Sie benötigen.

Eine andere Sache, die geholfen hat, war das Erkennen und Lösen von "nicht vertrauenswürdigen Fremdschlüsseln". Brent hat einen sehr schönen Artikel (hahah, ja, Brent wieder, ich weiß recht), wie man es löst, nur google, er ist das # 1 Ergebnis


1

Ich hatte dieses Problem in meiner Testbox und fand heraus, dass das Problem durch Hinzufügen der Berechtigung "Seiten im Speicher sperren" zum SQL Server-Dienstkonto behoben wurde. Ich bin jedoch nicht sicher, ob dies der beste Rat ist.

Siehe Aktivieren der Option "Seiten im Speicher sperren" (Windows)


Das Sperren von Seiten im Speicher behebt das Problem nicht, wenn nur der Plan-Cache gelöscht wird (nicht der Pufferpool).
Brent Ozar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.