Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Frage zum SQL Server-Cache

Wenn Sie Ihre Abfrage ausführen, werden die Daten blockweise in den Speicher eingelesen. Diese Blöcke bleiben im Speicher, werden aber "gealtert". Dies bedeutet, dass die Blöcke mit dem letzten Zugriff gekennzeichnet sind und wenn SQL Server einen weiteren Block für eine neue Abfrage benötigt und der Speichercache voll ist, wird der am längsten verwendete Block (der älteste) aus dem Speicher geworfen. (In den meisten Fällen werden vollständige Tabellen-Scan-Blöcke sofort gealtert, um zu verhindern, dass vollständige Tabellen-Scans den Speicher überlaufen und den Server überlasten).

Was hier passiert, ist, dass die Datenblöcke im Speicher der ersten Abfrage noch nicht aus dem Speicher geworfen wurden, sodass sie für Ihre zweite Abfrage verwendet werden können, was bedeutet, dass der Festplattenzugriff vermieden und die Leistung verbessert wird.

Ihre Frage lautet also wirklich:"Kann ich die Datenblöcke, die ich brauche, in den Speicher bekommen, ohne sie in den Speicher zu lesen (tatsächlich eine Abfrage durchzuführen)?". Die Antwort ist nein, es sei denn, Sie möchten die gesamten Tabellen zwischenspeichern und dauerhaft im Speicher behalten, was aufgrund der von Ihnen beschriebenen Abfragezeit (und damit der Datengröße) wahrscheinlich keine gute Idee ist.

Ihre beste Möglichkeit zur Leistungsverbesserung besteht darin, sich Ihre Abfrageausführungspläne anzusehen und zu prüfen, ob eine Änderung Ihrer Indizes möglicherweise zu einem besseren Ergebnis führt. Hier gibt es zwei Hauptbereiche, die die Leistung verbessern können:

  • Erstellen eines Indexes, wo die Abfrage einen verwenden könnte, um ineffiziente Abfragen und vollständige Tabellenscans zu vermeiden
  • Hinzufügen weiterer Spalten zu einem Index, um ein zweites Lesen von der Festplatte zu vermeiden. Sie haben beispielsweise eine Abfrage, die die Spalten A und B mit einer where-Klausel für A und C zurückgibt, und Sie haben einen Index für Spalte A. Ihre Abfrage verwendet den Index für Spalte A, was einen Lesevorgang auf der Festplatte erfordert, aber dann eine zweite Festplatte erfordert Hit, um die Spalten B und C zu erhalten. Wenn der Index alle Spalten A, B und C enthält, kann der zweite Plattentreffer zum Holen der Daten vermieden werden.