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.