Ich habe eine ASP.NET-Website, die ihr eigenes unabhängiges Caching von Daten durchführt, und Daten ändern sich über einen längeren Zeitraum nicht, sodass SQL Server nicht zum zweiten Mal mit derselben Abfrage abgefragt werden muss. Ich muss die Leistung von erstmaligen (jungfräulichen) Abfragen verbessern, die an diesen SQL Server gesendet werden. Einige Abfragen verarbeiten so viele Daten, dass SQL Server möglicherweise verwendet wird tempdb
. Ich verwende keine temporären Tabellenvariablen oder temporären Tabellen, daher entscheidet sich SQL Server, tempdb
diese bei Bedarf selbst zu verwenden.
Meine Datenbankgröße beträgt 16 GB. Auf meinem Server stehen 32 GB physischer RAM zur Verfügung.
Ich verstehe, dass die MS SQL Server-Caching-Strategie versucht, Daten im RAM zu halten, um die Leistung ähnlicher Abfragen zu beschleunigen, wenn dieselben Daten erneut geladen werden müssen. Darüber hinaus wird versucht, verfügbaren RAM anstelle von Tempdb zu verwenden, um die Leistung zu beschleunigen, ohne den Festplattenzugriff zu verursachen.
Ich nehme an, wenn eine Abfrage kommt, die etwas in tempdb SQL Server speichern muss und nicht genügend RAM verfügbar ist, hat SQL Server zwei Möglichkeiten:
1) einige zwischengespeicherte Daten zu entladen und anstelle von Tempdb ersparten RAM zu verwenden, um Schreibvorgänge auf der Festplatte zu vermeiden
2) Behalten Sie zwischengespeicherte Daten für zukünftige Abfragen bei und beginnen Sie mit der Verwendung von Tempdb, wodurch Schreibvorgänge die Festplatte verlangsamen.
Ich weiß nicht, welche Auswahl SQL Server in dieser Situation treffen wird, aber ich möchte, dass Auswahl 1 getroffen wird, da mir nur die Leistung von erstmaligen (jungfräulichen) Abfragen am Herzen liegt, da ich nie wieder dieselbe Abfrage an SQL Server sende (obwohl ich ähnliche Anfrage senden kann).
Was ist die SQL Server-Caching-Strategie für dieses Szenario?
Wie wird die RAM-Nutzung zwischen der Vermeidung von Tempdb für jungfräuliche Abfragen und der Geschwindigkeit von Abfragen zum zweiten Mal ausgeglichen?
Ist es möglich, SQL Server so zu konfigurieren, dass Auswahl 1 getroffen wird? Wenn ja, wie dann?
Wie kann ich sonst die Leistung aller jungfräulichen SQL-Abfragen steigern?
Da ich nichts über die SQL Server-Caching-Strategie weiß, möchte ich die Datenbank auf der RAM-Disk platzieren. Dadurch wird sichergestellt, dass jede jungfräuliche Abfrage eine hohe Geschwindigkeit beim Laden nicht zwischengespeicherter Daten aufweist, selbst wenn SQL Server immer die erste Wahl trifft. Das Risiko besteht darin, dass SQL Server möglicherweise mehr Tempdb mit weniger verfügbarem RAM verwendet (nur noch 16 GB, nachdem ich 16 GB für RAM Disk verwendet habe), wenn weiterhin Auswahl 2 getroffen wird, wodurch die jungfräulichen Abfragen verlangsamt werden, die zu Verschüttungen führen tempdb
.
Ich interessiere mich für eine Lösung für SQL 2008 R2, aber ich denke, es ist wahrscheinlich dasselbe für SQL 2008, SQL 2005 und möglicherweise SQL 2000.
Erläuterungen:
Auf dieser Box werden keine anderen Anwendungen ausgeführt. Sie ist für SQL Server reserviert . Die Website wird in einer separaten Box ausgeführt.
Es ist SQL Server 2008 R2 Standard Edition 64-Bit unter Windows Server 2008 R2 Enterprise 64-Bit.
Ich führe nur schreibgeschützte Abfragen aus und die Datenbank ist schreibgeschützt .
Nehmen wir an, dass es bereits gute Indizes gibt . Bei dieser Frage geht es darum, wie SQL Server die erste und die zweite Wahl trifft, wie es funktioniert, ob es eine Möglichkeit gibt, es zu steuern, und ob RAM Disk ihm hilft, die richtige Wahl für jungfräuliche Abfragen zu treffen.
Antworten:
Ihre Frage kann grundsätzlich wie folgt umformuliert werden: Wie funktioniert die Gewährung des Abfragespeichers? Eine gute Lektüre zu diesem Thema ist Grundlegendes zur Speichergewährung von SQL Server . Bevor eine Abfrage gestartet wird, ist möglicherweise eine Speicherzuweisung für Sortierungen und Hashes sowie andere speicherintensive Vorgänge erforderlich. Diese Speicherzuweisung ist eine Schätzung . Basierend auf dem aktuellen Systemstatus (Anzahl der ausgeführten und ausstehenden Anforderungen, verfügbarer Speicher usw.) gewährt das System der Abfrage eine Speichergewährung bis zur erforderlichen Menge. Sobald der Speicher gewährt wurde, beginnt die Abfrage mit der Ausführung (möglicherweise muss sie in der gefürchteten Warteschlange "Ressourcensemaphor" warten, bevor sie erteilt wird). Bei der Ausführung ist die Speichergewährung garantiertvom System. Diese Speichermenge kann mit Datenseiten geteilt werden (da sie immer auf die Festplatte gespült werden können), jedoch niemals mit einer anderen Speichernutzung (dh sie kann nicht "stehlen"). Wenn die Abfrage nach festgeschriebenem Speicher fragt, stellt die Engine die von Ihnen als "Strategie Nr. 1" bezeichnete Methode bereit : Datenseiten werden möglicherweise entfernt (gelöscht, wenn sie verschmutzt sind), um der Abfrage den versprochenen Speicher zu geben. Wenn nun die Schätzung korrekt war und die Gewährung 100% des angeforderten Speichers betrug, sollte die Abfrage nicht "verschüttet" werden. Wenn die Schätzung jedoch falsch war (läuft auf Kardinalitätsschätzungen hinaus und unterliegt daher veralteten Statistiken) oder wenn die Abfrage nicht den gesamten beantragten Zuschuss erhalten hat, wird die Abfrage "verschüttet". Dies ist, wenn Tempdb ins Bild kommt und Leistung in der Regel Panzer.
Der einzige Knopf, der Ihnen zur Verfügung steht, um etwas in diesem Prozess zu steuern, ist der Resource Governor . Da die RG verwendet werden kann, um eine MIN- Einstellung für einen Pool anzugeben , kann sie verwendet werden, um Speicher für eine bestimmte Arbeitslast zu reservieren, damit sie tatsächlich die von ihr angeforderte Speichergewährung erhält . Natürlich, nachdem Sie die richtige Untersuchung tat, zeigt , dass reduzierte Speicher Zuschüsse sind die Täter, und natürlich nach dem Aufprall auf andere Workloads bewertet. Und natürlich getestet.
Kehren wir nun zu Ihrer ursprünglichen Frage zurück. Wenn Ihre Untersuchung korrekt ist (ein sehr großes Wenn), möchte ich auf zwei Probleme hinweisen:
Das sagt mir also, dass Sie ein grundlegendes Design- und Architekturproblem haben. Websites sind latenzgesteuert und sollten eine OLTP-ähnliche Arbeitslast ohne Speicherzuweisungen und ohne Speicherdruck auf Abfragen erstellen. Ganz zu schweigen von keinem Verschütten. Analytische Abfragen sollten in Offline-Jobs ausgeführt werden und die vorverarbeiteten Ergebnisse für eine schnelle Verfügbarkeit speichern, wenn HTTP-Anforderungen dies wünschen.
quelle
sys.dm_exec_query_memory_grants
Sie sich an : Sie habenrequested
(das Maximum),required
(das Min) undgranted
(das Ist).Was Sie nicht erwähnt haben, ist, welche Art von Abfragen für die Datenbank ausgeführt werden und ob es richtige Indizes gibt, um die Leistung Ihrer Abfragen zu beschleunigen.
Sie müssen auch sicherstellen, dass andere Anwendungen auf derselben Box ausgeführt werden. Obwohl die Box über 32 GB RAM verfügt, müssen Sie auf dem Datenbankserver eine maximale Speichereinstellung festlegen, um eine künstliche Begrenzung festzulegen. Wenn auf demselben Server Apps ausgeführt werden, konkurrieren SQL und die anderen Apps möglicherweise um Ressourcen und stellen fest, dass SQL sehr speicherintensiv ist.
SQL Server verwendet Tempdb für die interne Sortierung oder für Hash-Joins / Aggregate oder Spool-Operatoren usw., und Sie können dieses Verhalten nicht steuern. Sie können die Menge der zurückgegebenen Daten begrenzen.
Haben Sie die Wartestatistik für dieses Kontrollkästchen aktiviert? Jedes Mal, wenn SQL Server auf eine Ressource wartet, verfolgt SQL Server die Warte-Ressource und das Anzeigen dieser Informationen hilft.
Schauen Sie sich die diagnostischen Fragen von Glenn Berry an, und das ist ein guter Anfang für Sie.
Schauen Sie sich auch PARAMETERISATION FORCED an, wie unter http://weblogs.sqlteam.com/dang/archive/2009/06/27/Forced-Parameterization-A-Turbo-Button.aspx erwähnt
quelle
Diese Frage liest sich derzeit wie eine Lösung, die nach einem Problem sucht. Sie haben entschieden, dass eine RAM-Disk die Lösung ist, und möchten, dass jemand diese Auswahl überprüft. Entschuldigung, das wird nicht passieren.
Wenn Sie einen Überlauf auf Tempdb gemessen und beobachtet haben, liegt dies mit ziemlicher Sicherheit an einer Sortier- oder Hash-Operation und einer unzureichenden Gewährung des Abfragespeichers. Abhängig vom zu verarbeitenden Datenvolumen kann dies unvermeidlich sein, aber es besteht eine gute Chance, dass die Abfrage und / oder Indizierung verbessert werden, um dies zu vermeiden.
Schauen Sie sich die Pufferverwaltung an, um besser zu verstehen, wie SQL Server den Speicher und die SQL Server-Speicherverwaltung verwaltet. Einige grundlegende Tools und DMV-Abfragen erläutern, wo Ihr Speicher zugewiesen ist.
Das ist ein großes Thema. Wenn Sie die Anfrage stellen und planen, erhalten Sie gezieltes Feedback.
quelle