Intro
Kurz gesagt, auf meinem Server treten viele Ad-hoc-Abfragen von einer Anwendung auf, die ich nicht kontrolliere und nicht ändern kann (selbst das Verschieben von Indizes ist schwierig und sie verwenden viele Heaps ...).
Technische Daten
Betriebssystem - Windows Server 2012 R2 (Primärknoten) SQL Server 2014 - 12.0.5546
Always On AG Mit dem sekundären synchronen Knoten mit derselben Hardware + Build.
Aufgrund der Lizenzierung können wir nur 12 der 24 Kerne für SQL Server verwenden (ich habe dies nicht getan). Es ist ziemlich leicht zu erkennen, welche 12 Kerne;).
Das Problem
Nun zu meinem Problem. Momentan löschen wir alle 30 Minuten den "TokenAndPermUserStore". Dies geschah auf dem Server, noch bevor es in meine Hände kam. Wir haben dies mit dem Befehl gemacht:
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')
Ich benutze diese Abfrage, um den Cache zu überprüfen:
SELECT SUM(pages_kb) / 1024 AS
"CurrentSizeOfTokenCache(mb)"
FROM sys.dm_os_memory_clerks
WHERE name = 'TokenAndPermUserStore'
Gleich nach dem Löschen ist dies die Cache-Größe:
CurrentSizeOfTokenCache(mb)
1602
Zu einem bestimmten Zeitpunkt, z. B. 15 Minuten nach dem Löschen, ist dies die Cache-Größe:
CurrentSizeOfTokenCache(mb)
1976
Update: Wenn die verwendete CPU wieder stabil ist (40% verwendet (20% bei der Überwachung)), liegt der Cache weit unter dem niedrigsten Punkt, an dem die CPU-Auslastung hoch war.
CurrentSizeOfTokenCache(mb)
1281
Ein Beispiel von gestern:
Die Tropfen sind auf diesem Bild von gestern sehr präsent: (Beachten Sie, dass wir 12 der 24 Kerne verwenden können, 50% bedeutet 100% in der Überwachungssoftware, mit anderen Worten, die CPU-Auslastung wird wahrscheinlich 50% nicht überschreiten, da sie dafür vorgesehen ist nur SQL Server)
Eine wichtige Sache ist, dass wir gestern zwei wichtige Indizes zu den Top-Abfragen hinzugefügt haben, da die CPU fast flach ist, was für kurze Zeit hilfreich war, aber die CPU wieder auf das gleiche Niveau gestiegen ist, ohne erkennbare Abfragen, die hämmern sollten unser System so schwer.
Die Frage
Auf meine Frage habe ich heute versucht, den Cache häufiger durch Ausführen zu leeren
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')
einige Male manuell. Aber es schien, dass nach ungefähr 20 Sekunden die CPU-Nutzung mit aller Macht zurückkam.
Sie können die drei Einbrüche nach dem Ausführen des Befehls deutlich sehen, aber im Bild unten kommt es ziemlich schnell zurück.
Sollte ich den Befehl mehr planen, sollte ich mir andere Änderungen ansehen?
Ich weiß, dass dieses Problem in SQL Server 2005 weit verbreitet war, dies ist jedoch SQL Server 2014. Bei den Abfragen handelt es sich um Abfragen vom Typ sp_executesql.
Wenn Sie weitere Informationen oder Erläuterungen benötigen, zögern Sie nicht, mich zu informieren.
Update vom 05/12/2018
Abfrageplan: https://www.brentozar.com/pastetheplan/?id=BkUKKVByV
-> Einfügen Der Plan erstellt den gleichen Link für die drei gefundenen Pläne. Ich habe versucht, alle drei im Cache gefundenen XML-Pläne für dieselbe Abfrage mit jeweils 10 Ausführungen hinzuzufügen, und für jede Abfrage denselben Link erhalten.
Abfrage verwendet
SELECT
text, execution_count,
dm_exec_query_stats.creation_time, dm_exec_query_plan.query_plan
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(dm_exec_query_stats.plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
Ergebnisse für drei gleiche Abfragen:
Ich möchte darauf hinweisen, dass die Abfragen SNAPSHOT ISOLATION verwenden, indem sie vor dem Ausführen der Abfrage festgelegt werden und die Hinweise OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN) verwenden.
Abfrage 1
(@SV1 nvarchar(8),@SV2 nvarchar(8),@SV3 nvarchar(8),@SV4 nvarchar(8),@SV5 nvarchar(8),@SV6 nvarchar(8),@SV7 nvarchar(8),@SV8 nvarchar(8),@SV9 nvarchar(8),@SV10 nvarchar(8),@SV11 nvarchar(8),@SV12 nvarchar(8),@SV13 nvarchar(8),@SV14 nvarchar(8),@SV15 nvarchar(8),@SV16 nvarchar(8),@SV17 nvarchar(8),@SV18 nvarchar(8),@SV19 nvarchar(8)) IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT SELECT AA.[SourceCode],AA.[DOUBLEMEDICATIONSVALIDATED],AA.[BSTNUM],AA.[MUTKOD],AA.[VERVALLEN],AA.[BACKUPID],AA.[LAATSTE],AA.[ExterneCode],AA.[PRKODE],AA.[NMMEMO],AA.[NMETIK],AA.[NMNM40],AA.[NMNAAM],AA.[PRNMNR],AA.[PRKBST],AA.[GPKODE],AA.[DRMLGEN],AA.[Anticoagulant],AA.[HPKSubstancesDiff],AA.[HPKCIsDiff],AA.[HPKUndesiredGroupsDiff] FROM [dbo].[ZINDEX_050] AA WHERE EXISTS (SELECT NULL FROM (SELECT TOP 100 PERCENT A.[BSTNUM],A.[MUTKOD],A.[VERVALLEN],A.[BACKUPID],A.[DMPRKA],A.[DMPRKB],A.[DMCODE],A.[DMGRDCODE] FROM [dbo].[ZINDEX_671] A WHERE ((A.[VERVALLEN] = 0 OR A.[VERVALLEN] IS NULL) AND ((A.[DMPRKA] = @SV1 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV4) OR (A.[DMPRKA] = @SV5 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV6 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV7) OR (A.[DMPRKA] = @SV8 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV9 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV10) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV11) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV12) OR (A.[DMPRKA] = @SV13 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV14) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV15) OR (A.[DMPRKA] = @SV16 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV17 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV18 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV19))) ) A WHERE AA.[PRKODE] = A.[DMPRKA]) OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN) SELECT AB.[SourceCode],AB.[DOUBLEMEDICATIONSVALIDATED],AB.[BSTNUM],AB.[MUTKOD],AB.[VERVALLEN],AB.[BACKUPID],AB.[LAATSTE],AB.[ExterneCode],AB.[PRKODE],AB.[NMMEMO],AB.[NMETIK],AB.[NMNM40],AB.[NMNAAM],AB.[PRNMNR],AB.[PRKBST],AB.[GPKODE],AB.[DRMLGEN],AB.[Anticoagulant],AB.[HPKSubstancesDiff],AB.[HPKCIsDiff],AB.[HPKUndesiredGroupsDiff] FROM [dbo].[ZINDEX_050] AB WHERE EXISTS (SELECT NULL FROM (SELECT TOP 100 PERCENT A.[BSTNUM],A.[MUTKOD],A.[VERVALLEN],A.[BACKUPID],A.[DMPRKA],A.[DMPRKB],A.[DMCODE],A.[DMGRDCODE] FROM [dbo].[ZINDEX_671] A WHERE ((A.[VERVALLEN] = 0 OR A.[VERVALLEN] IS NULL) AND ((A.[DMPRKA] = @SV1 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV4) OR (A.[DMPRKA] = @SV5 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV6 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV7) OR (A.[DMPRKA] = @SV8 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV9 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV10) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV11) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV12) OR (A.[DMPRKA] = @SV13 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV14) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV15) OR (A.[DMPRKA] = @SV16 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV17 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV18 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV19))) ) A WHERE AB.[PRKODE] = A.[DMPRKB]) OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN) SELECT A.[BSTNUM],A.[MUTKOD],A.[VERVALLEN],A.[BACKUPID],A.[DMPRKA],A.[DMPRKB],A.[DMCODE],A.[DMGRDCODE] FROM [dbo].[ZINDEX_671] A WHERE ((A.[VERVALLEN] = 0 OR A.[VERVALLEN] IS NULL) AND ((A.[DMPRKA] = @SV1 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV4) OR (A.[DMPRKA] = @SV5 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV6 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV7) OR (A.[DMPRKA] = @SV8 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV9 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV10) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV11) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV12) OR (A.[DMPRKA] = @SV13 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV14) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV15) OR (A.[DMPRKA] = @SV16 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV17 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV18 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV19))) ORDER BY A.[DMPRKA] ASC,A.[DMPRKB] ASC OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN)
Abfrage 2
(@SV1 nvarchar(8),@SV2 nvarchar(8),@SV3 nvarchar(8),@SV4 nvarchar(8),@SV5 nvarchar(8),@SV6 nvarchar(8),@SV7 nvarchar(8),@SV8 nvarchar(8),@SV9 nvarchar(8),@SV10 nvarchar(8),@SV11 nvarchar(8),@SV12 nvarchar(8),@SV13 nvarchar(8),@SV14 nvarchar(8),@SV15 nvarchar(8),@SV16 nvarchar(8),@SV17 nvarchar(8),@SV18 nvarchar(8),@SV19 nvarchar(8)) IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT SELECT AA.[SourceCode],AA.[DOUBLEMEDICATIONSVALIDATED],AA.[BSTNUM],AA.[MUTKOD],AA.[VERVALLEN],AA.[BACKUPID],AA.[LAATSTE],AA.[ExterneCode],AA.[PRKODE],AA.[NMMEMO],AA.[NMETIK],AA.[NMNM40],AA.[NMNAAM],AA.[PRNMNR],AA.[PRKBST],AA.[GPKODE],AA.[DRMLGEN],AA.[Anticoagulant],AA.[HPKSubstancesDiff],AA.[HPKCIsDiff],AA.[HPKUndesiredGroupsDiff] FROM [dbo].[ZINDEX_050] AA WHERE EXISTS (SELECT NULL FROM (SELECT TOP 100 PERCENT A.[BSTNUM],A.[MUTKOD],A.[VERVALLEN],A.[BACKUPID],A.[DMPRKA],A.[DMPRKB],A.[DMCODE],A.[DMGRDCODE] FROM [dbo].[ZINDEX_671] A WHERE ((A.[VERVALLEN] = 0 OR A.[VERVALLEN] IS NULL) AND ((A.[DMPRKA] = @SV1 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV4) OR (A.[DMPRKA] = @SV5 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV6 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV7) OR (A.[DMPRKA] = @SV8 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV9 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV10) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV11) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV12) OR (A.[DMPRKA] = @SV13 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV14) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV15) OR (A.[DMPRKA] = @SV16 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV17 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV18 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV19))) ) A WHERE AA.[PRKODE] = A.[DMPRKA]) OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN) SELECT AB.[SourceCode],AB.[DOUBLEMEDICATIONSVALIDATED],AB.[BSTNUM],AB.[MUTKOD],AB.[VERVALLEN],AB.[BACKUPID],AB.[LAATSTE],AB.[ExterneCode],AB.[PRKODE],AB.[NMMEMO],AB.[NMETIK],AB.[NMNM40],AB.[NMNAAM],AB.[PRNMNR],AB.[PRKBST],AB.[GPKODE],AB.[DRMLGEN],AB.[Anticoagulant],AB.[HPKSubstancesDiff],AB.[HPKCIsDiff],AB.[HPKUndesiredGroupsDiff] FROM [dbo].[ZINDEX_050] AB WHERE EXISTS (SELECT NULL FROM (SELECT TOP 100 PERCENT A.[BSTNUM],A.[MUTKOD],A.[VERVALLEN],A.[BACKUPID],A.[DMPRKA],A.[DMPRKB],A.[DMCODE],A.[DMGRDCODE] FROM [dbo].[ZINDEX_671] A WHERE ((A.[VERVALLEN] = 0 OR A.[VERVALLEN] IS NULL) AND ((A.[DMPRKA] = @SV1 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV4) OR (A.[DMPRKA] = @SV5 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV6 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV7) OR (A.[DMPRKA] = @SV8 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV9 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV10) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV11) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV12) OR (A.[DMPRKA] = @SV13 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV14) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV15) OR (A.[DMPRKA] = @SV16 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV17 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV18 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV19))) ) A WHERE AB.[PRKODE] = A.[DMPRKB]) OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN) SELECT A.[BSTNUM],A.[MUTKOD],A.[VERVALLEN],A.[BACKUPID],A.[DMPRKA],A.[DMPRKB],A.[DMCODE],A.[DMGRDCODE] FROM [dbo].[ZINDEX_671] A WHERE ((A.[VERVALLEN] = 0 OR A.[VERVALLEN] IS NULL) AND ((A.[DMPRKA] = @SV1 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV4) OR (A.[DMPRKA] = @SV5 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV6 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV7) OR (A.[DMPRKA] = @SV8 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV9 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV10) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV11) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV12) OR (A.[DMPRKA] = @SV13 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV14) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV15) OR (A.[DMPRKA] = @SV16 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV17 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV18 AND A.[DMPRKB] = @SV2) OR (A.[DMPRKA] = @SV3 AND A.[DMPRKB] = @SV19))) ORDER BY A.[DMPRKA] ASC,A.[DMPRKB] ASC OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN)
Es tut weh, es anzuschauen, ich weiß.
Kompiliert auch bei erzwungener Parametrierung
Die Kompilierung / Sek. Stimmt mit Batches / Sek. Fast 1 zu 1 überein, selbst wenn die erzwungene Parametrierung aktiviert ist. Aus diesem Grund ist die Zeile Batches / Sek. Ausgeblendet (sie befindet sich hinter der Zeile Kompilierungen / Sek.).
Perfmon-Statistiken:
Abfragen, CPU, E / A, wenn die CPU etwa 80% und die CPU etwa 40% beträgt
Die Aggregate von Abfragen, die heute im Zeitrahmen von 13:00 bis 13:00 Uhr (80% CPU-Auslastung) ausgeführt wurden:
Es gibt einen Unterschied zu dem Zeitpunkt, an dem die CPU-Auslastung heute zwischen 2u05 PM und 2u25PM niedriger ist (40% CPU-Auslastung).
CPU auslastung:
Der erste ist der, bei dem wir einen Index hinzugefügt haben, als wir Probleme sahen, und die CPU-Auslastung verringert haben.
Zusätzliche Fragen mit Schecks und mehr Infos:
select count(*) as amount_of_USERSTORE_TOKENPERM from sys.dm_os_memory_clerks
where type = 'USERSTORE_TOKENPERM'
amount_of_USERSTORE_TOKENPERM
15190
select count(*) as amount_of_connections from sys.dm_exec_connections
amount_of_connections
10004
select value_in_use from sys.configurations
where name like '%access check cache bucket count%'
value_in_use
0
select value_in_use from sys.configurations
where name like '%access check cache quota%'
value_in_use
0
quelle
Antworten:
Vielen Dank für Ihre Zeit und Mühe bei der Suche nach einer Lösung. Besonders @David Browne - Microsoft, da er Recht hatte, indem er mich wissen ließ, dass wir patchen sollten.
Wir hatten ein Treffen mit den Datenbank, den Anwendungsinhabern und dem technischen Team des Anwendungsanbieters.
In dieser Besprechung stellte sich heraus, dass bei den anderen Kunden, die der Anbieter hat, aufgrund der Art der Anwendung und ihres Codes dasselbe Problem vorliegt.
Ähnlich wie dies.
Die Lösung, die ihren anderen Kunden bei diesem Problem geholfen hat, besteht darin, auf SQL Server 2014 CU7 oder SP3 zu aktualisieren, was wir so bald wie möglich tun werden (vorzugsweise SP3), um die Probleme mit dem Token- und Permuserstore zu beenden.
quelle
Haben Sie irgendetwas ausgeführt, um festzustellen, welche Abfragen die meiste CPU-Zeit (auch als Arbeitszeit bezeichnet) beitragen? Vielleicht so etwas wie unten (Zeit ist in Mikrosekunden)? In Ihrem ersten Beitrag habe ich gesehen, dass Sie mehrere Fragen identifiziert haben - wie haben Sie festgestellt, dass diese möglicherweise problematisch sind?
Sehen Sie, dass Sie viele Einwegpläne (über dmvs) haben, oder gehen Sie davon aus, dass dies aufgrund der Kompilierungsraten der Fall ist, die Sie in der Tabelle angezeigt haben? Die folgende Abfrage berücksichtigt keine Einwegpläne. Wenn dies jedoch nicht funktioniert, kann ich Ihnen eine senden, die dies tut.
quelle