Größe des Prozedurcaches (Plan-Cache)

7

Ich entwickle eine Anwendung mit vielen, dinamisch zusammengestellten, komplizierten SQL-Abfragen. Ich möchte die Abfragepläne so lange wie möglich im Prozedurcache belassen. Um zu verhindern, dass die Abfragepläne (aufgrund des Speicherdrucks) aus dem Prozedurcache verworfen werden, möchte ich dem Prozedurcache genügend Speicher zuweisen. Gemäß diesem nur 10% des „sichtbares Ziel“ -Speicher in dem 4 GB-64GB Bereich wird für das Verfahren Cache verwendet; Ich möchte, dass diese Rate höher ist.

Gibt es eine Möglichkeit, die Größe des Prozedur-Cache zu steuern? SQL Server 2008 oder 2012; Vielleicht einige Enterprise Edition-Funktionen?

Gilt auch diese Regel "10% des sichtbaren Zielspeichers", wenn ich explizit die min. Speicher für den SQL Server?

(Mir sind die Hinweise zu KEEP PLAN / KEEPFIXED PLAN bekannt . Ich bin mir auch der Vorteile der Vorbereitung der Anweisungen über Ad-hoc-Abfragen bewusst. Empfehlen Sie diese Möglichkeiten daher nicht. Ich bin besonders neugierig auf die Steuerung des Prozedur-Cache Größe.)

Slobo
quelle
1
Was ist mit der Option "Für Ad-hoc-Workloads optimieren"? Dadurch werden viel kleinere Stubs in den Cache gestellt, bis derselbe Plan mehr als einmal verwendet wird, und erst dann wird das Ganze zwischengespeichert. In der Standardkonfiguration und insbesondere in Fällen, in denen viel dynamisch zusammengestelltes SQL vorhanden ist, verschwenden Einwegpläne häufig viel Speicherplatz im Cache. Wenn Sie die Menge an verschwendetem Platz reduzieren, die diese belegen, lassen Sie mehr Platz für Pläne, die mehrmals verwendet werden, und genau diese möchten Sie sowieso behalten.
Aaron Bertrand
danke, aber ich habe keine Ad-hoc-Abfragen, die die Prozedur-Cache-Ressourcen
1
Können Sie dann bitte erklären, was Sie unter "dinamisch zusammengesetzten, komplizierten SQL-Abfragen" verstehen? Das klingt für mich sehr nach Ad-hoc-Anfragen. (Dies gilt unabhängig davon, ob Sie Ad-hoc-SQL aus einer Anwendung senden
Aaron Bertrand
Nun, ich habe einen Mechanismus, der dynamisch Abfragen erzeugt. Wenn eine Abfrage erstellt wird, entspricht sie manchmal der Struktur einer vorherigen Abfrage. und manchmal hat es eine neue Struktur. Da die Erstellungsphase des Abfrageplans viel Zeit in Anspruch nimmt, möchte ich die vorherigen Abfragepläne so weit wie möglich wiederverwenden. Ich habe viel Phisycal-Speicher, daher wäre es durchaus sinnvoll, ihn für diesen Zweck zu verwenden.
3
"Ich möchte meine Frage nicht ändern" ... das stinkt nach "Ich habe eine schlechte Frage gestellt" ... Dies ist ein Grund, in Zukunft für andere als nicht hilfreich zu schließen.
Jcolebrand

Antworten:

8

Sie können die Plan-Cache-Größe nicht manuell steuern. Das folgende Connect-Element beschreibt sowohl die Tatsache, dass in Kürze kein Knopf mehr hinzugefügt wird, als auch, dass Resource Governor in einigen engen Anwendungsfällen möglicherweise nur geringfügig nützlich ist:

http://connect.microsoft.com/SQLServer/feedback/details/293188/amount-of-ram-for-procedure-cache-should-be-configurable

Wie ich in den Kommentaren angedeutet habe, gibt es jedoch andere Möglichkeiten, den Plan-Cache effektiver zu gestalten (z. B. die Einstellung "Für Ad-hoc-Workloads optimieren" ). Kimberly erklärt dies ausführlicher, aber im Wesentlichen platziert diese Einstellung viel kleinere Stubs im Cache, bis derselbe Plan mehr als einmal verwendet wird, und erst dann wird das Ganze zwischengespeichert. In der Standardkonfiguration und insbesondere in Fällen, in denen viel dynamisch zusammengestelltes SQL vorhanden ist, verschwenden Einwegpläne häufig viel Speicherplatz im Cache. Wenn Sie die Menge an verschwendetem Platz reduzieren, die diese belegen, lassen Sie mehr Platz für Pläne, die mehr als einmal verwendet werden, und genau diese möchten Sie sowieso behalten.

Aaron Bertrand
quelle
Die MS-Ausgabe wurde 2007 geschlossen. Sind Sie sicher, dass es in der Ausgabe 2012 (oder 2012 Enterprise Edition) noch keine solche Möglichkeit gibt?
Ja, ich bin sicher. Die Speicherverwaltung wurde in SQL Server 2012 erheblich verbessert, es ist jedoch noch kein Steuerelement für die Größe des Plan-Cache verfügbar. (Obwohl ich glaube, dass Sybase eine ähnliche Serverkonfigurationsoption hat.)
Aaron Bertrand
Wissen Sie vielleicht, wie die Regel "10% des sichtbaren Zielspeichers" funktioniert, wenn ich auch die min. Speicher für den SQL Server? Zum Beispiel: Wenn ich 16 GByte RAM habe und die min. Speicher für SQL Server bis 14 GByte, was ist die max. Größe des Prozedur-Cache? Werden es 4 GByte * 75% + (16-4) GByte * 10% = 4,2 GByte sein (unabhängig von der minimalen Speichereinstellung)?
@slobo Da Sie es nicht kontrollieren können, denke ich immer noch, dass Sie die falsche Frage stellen - und nicht, dass ich zu faul bin, um zu rechnen, ich denke nur, dass es sinnlos ist - wenn die Antwort 4,2 GB oder 4,4 GB oder ist 3,95 GB, was machst du anders? <Achselzucken>
Aaron Bertrand
Ich hatte gehofft, wenn ich die min. Speicher für den SQL Server, die Berechnung ist anders und der Prozedur-Cache wäre viel größer.
4

Wenn Sie die Größe Ihres Prozedurcaches ermitteln möchten, führen Sie den folgenden Befehl aus:

dbcc memorystatus

Hier erfahren Sie, wie groß Ihr Prozedur-Cache in Seiten ist. Um in KB zu konvertieren, multiplizieren Sie diese Zahl mit 8.

Außerdem erfahren Sie, wie viele Prozeduren zwischengespeichert werden. Dies kann aus verschiedenen Gründen hilfreich sein, z. B. wenn Sie herausfinden möchten, ob zu viele Ad-hoc-Abfragen für die Datenbank ausgeführt werden.

Wenn Sie den prozentualen Speicherbedarf des Prozedurcaches anpassen möchten, passen Sie den für den Server verfügbaren MAX-Speicher (nicht den minimalen Speicher) an. 75% der ersten 4 GB sind für den Prozedur-Cache verfügbar und 10% für alles andere. Ich sehe jedoch keinen Vorteil darin. Theoretisch könnten Sie mehrere Instanzen von SQL Server mit einem maximalen Speicher von 4 GB installieren, um 75% des vom Prozedurcache verwendeten Speichers zu erhalten. Ich sehe den Vorteil nicht, aber dann nicht Kennen Sie Ihr System. Es hört sich so an, als hätten Sie eine Menge Geschäftslogik in der Datenbankebene.

Dave Hilditch
quelle
Eigentlich habe ich keine Geschäftslogik in der Datenbankebene, aber ich habe wirklich große SQL SELECTs, und ich habe viele davon, und sie werden wiederholt verwendet.
Slobo