Wie kann die Leistung von jungfräulichen Abfragen in MS SQL Server gesteigert werden?


10

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, tempdbdiese 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.


Was lässt Sie denken, dass Tempdb verwendet wird, obwohl Sie keine temporären Tabellen erstellen? Verwenden Sie eindeutige oder nach Tabellen gruppierte?
Meerenge

3
32/64 Bit? Physisch oder virtuell? Ist dieser Server für SQL Server reserviert oder führen Sie auch IIS oder andere Apps auf derselben Box aus? Haben Sie den Abfrageausführungsplan analysiert? Können Sie Beispielabfragen und / oder Ausführungspläne veröffentlichen? Und noch eine zum Glück ... folgen Sie Kendras Anleitung zur Protokollierung von sp_whoisactive, während Ihre Problemabfrage ausgeführt wird, und veröffentlichen Sie die Ausgabe.
Mark Storey-Smith

@ Darinstrait Die wahrscheinlichste Erklärung wäre eine Art oder ein Hash-Spill.
Mark Storey-Smith

Antworten:


7

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:

  • Sie werden in Produktionsabfragen ausgeführt, für die Speicherzuweisungen für eine Website erforderlich sind . Dies ist ein großes Nein-Nein. Speicherzuweisungen weisen auf analytische Abfragen hin, die keinen Platz für die Bearbeitung von HTTP-Anforderungen haben.
  • Ihre Abfragen sind wahrscheinlich kein Ereignis, das die von ihnen angeforderte Speichergewährung erhält. Wiederum eher ein No-No für eine latenzkritische Arbeitslast als Websites.

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.


@Mark: Die meisten Abfragen erfordern keine Speicherzuweisung. Nur wenige Operatoren (insbesondere Sortieren und Hash-Join) benötigen einen Arbeitspuffer und fordern daher einen Zuschuss an. Dies ist die Standard-Nomenklatur. Möglicherweise denken Sie an die Ausführungsumgebung und den Ausführungsplan für Abfragen, für die jede einzelne Abfrage eine benötigt und die etwas Speicher enthält. Ein Speicherzuschuss ist viel größer (MBs). Zweitens schauen sys.dm_exec_query_memory_grantsSie sich an : Sie haben requested(das Maximum), required(das Min) und granted(das Ist).
Remus Rusanu

Entschuldigung. Ich hatte irgendwo festgestellt, dass das Minimum pro Abfrage von demselben Speicherangestellten zugewiesen wurde, was falsch war.
Mark Storey-Smith

Ich bin mir immer noch nicht sicher, ob ich Ihren beiden Stichpunkten zustimme. Alle Arten von trivialen Sortierungen und Hash-Join-Operationen erfordern Zuschüsse auf dem Mindestniveau, sodass es übertrieben erscheint, darauf hinzuweisen, dass sie vollständig beseitigt werden müssen. Dass das Auslaufen von Tempdb durch unzureichende Zuschüsse eine rote Fahne ist, ist sicherlich vernünftig, aber ein pauschales Verbot von Vorgängen, für die ein Zuschuss erforderlich ist, könnte viele Menschen auf einen unnötigen vorbeugenden Optimierungspfad bringen?
Mark Storey-Smith

OP behauptet, es habe alle notwendigen Indizes. Wenn dies zutrifft und die Arbeitslast genügend Probleme mit der Speicherzuweisung (und sogar dem Überlaufen) aufweist, um erkennbar zu sein, würde ich sagen, dass die Arbeitslast für eine Website zu analytisch ist . Letztendlich ist die Leistungsoptimierung immer ein Untersuchungsspiel , um die Grundursache zu ermitteln. Alle pauschalen Aussagen und Verbote werden immer ein Gegenbeispiel finden, das beweist, dass sie falsch sind, das ist eine Selbstverständlichkeit. Hat das OP ein Designproblem, das eine zu analytische Arbeitsbelastung verursacht? Ich weiß es nicht. Glaube ich das? Ich würde sagen, 87,5% Vertrauen ja.
Remus Rusanu

@Remus: Ihre Vermutung war gut, meine Website-Anfragen sind 100% analytisch. Benutzer können damit mögliche Abfragen in der Benutzeroberfläche erstellen, um eine mögliche Kombination von Filtern, Aggregaten und Gruppierungen an SQL Server zu senden (was die Indizierung natürlich schwierig macht). Ja, ich könnte sie dazu bringen, im asynchronen Modus ausgeführt zu werden, um Ergebnisse für den späteren Abruf zu speichern. Ziel ist es jedoch, dass alle Abfragen so schnell ausgeführt werden, dass das Ergebnis sofort nach 2 bis 10 Sekunden verfügbar ist und auch analytische Abfragen die einzige Funktion dieser Website sind Ich denke, sie asynchron zu machen ist nur dann sinnvoll, wenn es andere Abfragen gibt, die nicht analytisch sind.
Alpav

3

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


ok, nehmen wir an, dass es bereits richtige Indizes gibt. Ich habe vergessen zu erwähnen, dass dies eine schreibgeschützte Datenbank mit schreibgeschützten Abfragen ist und keine andere Anwendung auf der SQl Server-Box ausgeführt wird.
Alpav

Sind Ihre Statistiken aktuell? Schreibgeschützte Datenbanken können keine Statistiken erstellen, wenn sie fehlen oder veraltet sind. Sind Ihre Daten verzerrt oder haben sie eindeutige Werte für den Schlüssel? Es gibt viele Faktoren, die dieses Verhalten verursachen können.
Sankar Reddy

Was meinst du mit "diesem Verhalten"? Ich habe nicht erwähnt, dass etwas schief geht. Ich möchte nur die Leistung unter meinen besonderen Umständen steigern. SQL Server ist für die Ausführung in jeder Situation optimiert, kann jedoch in meiner Situation möglicherweise nicht optimal ausgeführt werden. Ich bin nicht sicher, ob ich SQL Server vertrauen kann, um eine ausgewogene Wahl zwischen Nummer 1 und Nummer 2 zu treffen. Jedes Mal, wenn ich neue Daten darauf lege, führe ich sp_updatestats aus.
Alpav


2
Wenn Sie sp_updatestats ausführen, welches Stichprobenverhältnis haben Sie ausgewählt? Das Standardverhältnis ist sehr beispielhaft und hängt von der Größe des Index ab. Wenn Ihre Abfragen hauptsächlich (nur) die neuen Daten abfragen und selbst wenn Sie sp_updatestats ausführen, kann SQL Server keine guten Entscheidungen über die Ausführungspläne treffen.
Sankar Reddy

2

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.

Wie kann ich sonst die Leistung aller jungfräulichen SQL-Abfragen steigern?

Das ist ein großes Thema. Wenn Sie die Anfrage stellen und planen, erhalten Sie gezieltes Feedback.

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.