Warum sollte ich die SQL Server-Option "Für Ad-hoc-Workloads optimieren" NICHT verwenden?


49

Ich wurde von Kimberly Tripp wie diese einige große Artikel über SQL Server Plan Caching lesen: http://www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/

Warum gibt es überhaupt eine Option zur "Optimierung für Ad-hoc-Workloads"? Sollte das nicht immer an sein? Unabhängig davon, ob die Entwickler Ad-hoc-SQL verwenden oder nicht, warum sollte diese Option nicht für jede Instanz aktiviert sein, die sie unterstützt (SQL 2008+), wodurch die Cache-Aufblähung verringert wird?

Antworten:


45

Das SQL Server-Entwicklungsteam arbeitet nach dem Prinzip der geringsten Überraschung. Daher sind in SQL Server im Allgemeinen neue Funktionen deaktiviert, um das Verhalten der Vorgängerversionen beizubehalten.

Ja, die Optimierung für Ad-hoc-Workloads ist großartig, um das Aufblähen des Plan-Cache zu reduzieren - aber testen Sie es immer zuerst!

[Bearbeiten: Kalen Delaney erzählt eine interessante Anekdote, dass sie einen ihrer Microsoft-Ingenieur-Freunde gefragt hat, ob es Umstände geben würde, unter denen es nicht angebracht wäre, dies zu aktivieren. Er kommt einige Tage später zurück und sagt: Stellen Sie sich eine Anwendung vor, die viele verschiedene Abfragen enthält, und jede Abfrage wird insgesamt genau zweimal ausgeführt. Dann könnte es unangemessen sein. Es genügt zu sagen, dass es nicht viele solcher Apps gibt!]

[Bearbeiten: Wenn die meisten Ihrer Abfragen mehr als einmal ausgeführt werden (nicht genau zweimal); es wäre wahrscheinlich unangemessen. Die allgemeine Regel wäre, es umzudrehen, wenn die Datenbank viele einmal verwendbare Ad-hoc-Abfragen enthält. Es gibt jedoch immer noch nicht viele Apps wie diese.]


9
+1 neue Funktionen sind standardmäßig sehr, sehr selten aktiviert. Ich kann mir keine guten Gründe vorstellen, diese Funktion nicht zu aktivieren - im schlimmsten Fall sind alle Ihre Abfragen für den einmaligen Gebrauch bestimmt und würden ohnehin nicht vom Caching profitieren.
Aaron Bertrand

1
Dies ist eine "sichere" Antwort, die auf gesundem Menschenverstand basiert und sich nicht mit der Frage befasst. Der Fragesteller möchte genau wissen, für welchen Anwendungsfall es besser ist, diese Funktion NICHT zu aktivieren.
MikeTeeVee

2
MikeTeeVee - es mag eine sichere Antwort sein, aber dies ist eines dieser Features, bei denen ich mir wirklich keinen Grund vorstellen kann, es nicht zu aktivieren. Da es so toll ist, wollte ich nur erklären, warum es standardmäßig ausgeschaltet war!
Peter Schofield

21

Im Folgenden finden Sie einen kleinen Code, der Ihnen bei der Entscheidung hilft, ob das Ein- und Ausschalten der Optimierung für Ad-hoc-Workloads von Vorteil ist oder nicht. Normalerweise überprüfen wir dies im Rahmen unserer Integritätsprüfung für Inhouse- und Client-Server.

Dies ist die sicherste Option und wird von Brad hier und von Glenn Berry hier gut beschrieben .

--- for 2008 and up .. Optimize ad-hoc for workload 
IF EXISTS (
        -- this is for 2008 and up
        SELECT 1
        FROM sys.configurations
        WHERE NAME = 'optimize for ad hoc workloads'
        )
BEGIN
    DECLARE @AdHocSizeInMB DECIMAL(14, 2)
        ,@TotalSizeInMB DECIMAL(14, 2)
        ,@ObjType NVARCHAR(34)

    SELECT @AdHocSizeInMB = SUM(CAST((
                    CASE 
                        WHEN usecounts = 1
                            AND LOWER(objtype) = 'adhoc'
                            THEN size_in_bytes
                        ELSE 0
                        END
                    ) AS DECIMAL(14, 2))) / 1048576
        ,@TotalSizeInMB = SUM(CAST(size_in_bytes AS DECIMAL(14, 2))) / 1048576
    FROM sys.dm_exec_cached_plans

    SELECT 'SQL Server Configuration' AS GROUP_TYPE
        ,' Total cache plan size (MB): ' + cast(@TotalSizeInMB AS VARCHAR(max)) + '. Current memory occupied by adhoc plans only used once (MB):' + cast(@AdHocSizeInMB AS VARCHAR(max)) + '.  Percentage of total cache plan occupied by adhoc plans only used once :' + cast(CAST((@AdHocSizeInMB / @TotalSizeInMB) * 100 AS DECIMAL(14, 2)) AS VARCHAR(max)) + '%' + ' ' AS COMMENTS
        ,' ' + CASE 
            WHEN @AdHocSizeInMB > 200
                OR ((@AdHocSizeInMB / @TotalSizeInMB) * 100) > 25 -- 200MB or > 25%
                THEN 'Switch on Optimize for ad hoc workloads as it will make a significant difference. Ref: http://sqlserverperformance.idera.com/memory/optimize-ad-hoc-workloads-option-sql-server-2008/. http://www.sqlskills.com/blogs/kimberly/post/procedure-cache-and-optimizing-for-adhoc-workloads.aspx'
            ELSE 'Setting Optimize for ad hoc workloads will make little difference !!'
            END + ' ' AS RECOMMENDATIONS
END

7

Stellen Sie sich einen Produktionsserver vor, der nur fünf verschiedene Abfragen bedient, aber mehrere Tausend pro Sekunde. Sie sind das Microsoft SQL Server-Entwicklungsteam. Sie werden mit dem Plan-Caching experimentieren. Aktivieren Sie dieses Verhalten standardmäßig, wenn Sie wissen, dass einige Ihrer größten und kritischsten Clients (z. B. die interne SAP-Implementierung von Microsoft) auf demselben Campus arbeiten und dieselbe Cafeteria verwenden, die Sie auch verwenden?


Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Paul White

7

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: Bildbeschreibung hier eingeben

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.


0

"Warum sollte ich NICHT verwenden ..." Bei einigen Leistungsuntersuchungen kann es sehr hilfreich sein, Pläne nahezu in Echtzeit aus dem Plan-Cache zu ziehen, während die Ressourcennutzung überwacht wird. "Für Ad-hoc-Workloads optimieren" kann dies stören, da die Ad-hoc-Stub-Pläne beim Abfragen des Caches keinen Plan zurückgeben. In einem solchen Fall kann die Einstellung zum Zwecke der Untersuchung aus- und wieder eingeschaltet werden, wenn Abfrage und Plan nicht anderweitig identifiziert werden können. Beachten Sie, dass eine Änderung der Einstellung Abfragen bewirkt, die ab diesem Zeitpunkt kompiliert wurden. Überprüfen Sie außerdem bei jeder Änderung einer Servereigenschaft, ob bei einer Nicht-Produkt-Instanz in derselben Version überprüft wird, ob durch die Änderung der Plan-Cache geleert wird. Ich persönlich hasse es, davon überrascht zu werden. (Wenn Sie beispielsweise maxdop auf Serverebene ändern, wird normalerweise der Plan-Cache geleert.)

"Dem kompilierten Plan-Stub ist kein Ausführungsplan zugeordnet. Wenn Sie nach dem Plan-Handle fragen, wird kein XML-Showplan zurückgegeben." http://technet.microsoft.com/en-us/library/cc645587.aspx

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.