Wenn Sie die Option " Für Ad-hoc-Workloads optimieren " aktivieren , sind Ad-hoc-Abfragen, die zum zweiten Mal ausgeführt werden, genauso langsam wie die erste, da Sie einen Ausführungsplan erstellen und dieselben Daten abrufen ( ohne es zwischengespeichert) die ersten 2 mal.
Dies mag keine große Sache sein, aber Sie werden es bemerken, wenn Sie Abfragen testen.
Also , was passiert jetzt, ohne diese Option eingeschaltet und einen Cache voller 1-Off Ad-Hoc - Abfragen?
Der Caching-Management-Algorithmus:
Mit der Einführung dieser Optimierungsfunktion wurde auch der Caching-Verwaltungsalgorithmus aktualisiert.
Kimberly Tripps Artikel verweist auch auf Kalen Delaneys Beitrag über diese Algorithmusänderung.
Sie erklärt es am besten:
Die Änderung berechnet tatsächlich eine Plan-Cache-Größe, bei der SQL Server erkennt, dass Speicherdruck besteht, und beginnt, Pläne aus dem Cache zu entfernen. Die zu entfernenden Pläne sind die billigen Pläne, die nicht wiederverwendet wurden, und dies ist eine GUTE SACHE.
Dies bedeutet, dass diese lästigen Ein-Timer-Pläne die ersten sind, die ausgeführt werden, wenn Sie Ressourcen freisetzen müssen.
Nun lautet die Frage:
„ Warum brauchen wir‚Optimieren für Ad - hoc - Workloads‘ , wenn SQL Server kümmert sich nicht verwendeten Pläne zu entfernen , wenn nötig? “
Meine Antwort darauf ist, wenn Sie regelmäßig eine s-Tonne dynamischen SQL - Erzeugungs Unmengen von nicht-parametrisierte Anzeige haben -hoc-Abfragen, dann ist es absolut sinnvoll, diese Funktion zu aktivieren.
Sie möchten vermeiden, dass die Systemressourcen überlastet werden, sodass das Entfernen von Cache-Plänen / Daten erzwungen wird, nachdem Sie den maximalen Cache-Speicherplatz aufgebraucht haben.
Woher weiß ich, wann ich das einschalten muss?
Ich habe eine Abfrage geschrieben, um Ihnen zu zeigen, wie viele Ad-Hoc-Pläne Sie derzeit zwischengespeichert haben und wie viel Speicherplatz sie verbrauchen (die Ergebnisse ändern sich im Laufe des Tages - testen Sie sie also während einer Zeit hoher Auslastung):
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
Ergebnisse:
Ich werde nicht " Wenn Sie X MBs haben " oder " Wenn X% Ihrer Ad-hoc-Artikel zur einmaligen Verwendung bestimmt sind " sagen, um dies zu aktivieren.
Sprocs, Trigger, Views oder parametrisiertes / vorbereitetes SQL sind davon nicht betroffen - nur die Ad-Hoc-Abfragen.
Meine persönliche Empfehlung ist, nur in Ihrer Prod-Umgebung einzuschalten, aber in Ihrer Dev-Umgebung auszuschalten.
Ich sage das nur für Dev, denn wenn Sie eine Abfrage sind die Optimierung , die eine Minute oder mehr zu laufen dauert, dann tun Sie es nicht 3 mal ausgeführt werden soll , bevor Sie sehen können , wie schnell wird es gehen mit mit dem Cachen - jeder Bearbeiten Sie es einmal, um das beste Optimierungsdesign zu finden.
Wenn Sie dies nicht den ganzen Tag tun müssen, sollten Sie Ihren DBA bitten, es überall einzuschalten.