
Wir haben Windows Server 2019 Standard (x64) mit 64GB Arbeitsspeicher.
Der Screenshot unten zeigt die Speicherauslastung bei 96% mit demSQL Server Windows NTläuft und nutzt 344,5 MB.
Dies ist der Task-Manager nach dem Beenden des DienstesSQL Server Windows NT. Die Speichernutzung sank auf 8 %.
Ich starte den DienstSQL Server Windows NTnochmal. Der Task-Manager ist mit 9 % sehr niedrig, aber der SQL-Server verwendet jetzt mehr Speicher als damals, als die Speichernutzung bei 96 % lag.
Zwei Fragen:
- Was ist das Problem mit dem Speicher?
- Wie kann ich die Speichernutzung senken, ohne die SQL Server-Instanz neu starten zu müssen?
Antwort1
Sie übersehen hier ein wichtiges Detail: Der Task-Manager zeigt an, dass SQL Server nur 344,5 MB RAM verwendet, aber tatsächlich hat er viel mehr, fast den gesamten Arbeitsspeicher, für die eigene Verwendung reserviert. Der Task-Manager zeigt dies nicht an. Die Zahlen im Task-Manager ergeben nicht wirklich 97 % des Systemspeichers, da der reservierte Speicher dort nicht angezeigt wird.
Ihre Annahme, dass fast Ihr gesamter Speicher von etwas anderem belegt ist und SQL Server daher nicht mehr als 344,5 MB verwenden kann, ist schlichtweg falsch. So funktioniert das nicht. Der Task-Manager kann ziemlich irreführend sein, sehen Sie sich die tatsächlichen Leistungsindikatoren an.
Aktualisieren Sie, um es besser zu erklären.
SQL Servervon Entwurfspeichert Daten im Speicher und verbraucht mit der Zeit fast den gesamten verfügbaren Speicher im System. Dieser Speicher wird jedoch nicht (oder zumindest nicht vollständig) im Task-Manager angezeigt, da SQL Server versucht, nett zu sein und dem Betriebssystem mitteilt: „Ich möchte so viel Speicher, aber nur zum Zwischenspeichern. Ich komme auch ohne aus. Sie können ihn also gerne zurückfordern, wenn Sie ihn brauchen.“ Dies bedeutet, dass der Task-Manager viel weniger von SQL Server verwendeten Speicher anzeigt, als tatsächlich reserviert ist.
Das istauf keinen Fallein Problem; es ist absichtlich und beabsichtigt. Das „Problem“, das Sie sehen, existiert nicht, nur das, was Sie im Task-Manager sehen, ist irreführend.
Wenn Sie SQL Server stoppen, wird natürlich der gesamte zugewiesene Speicher freigegeben, sowohl der im Task-Manager angezeigte als auch der (viel mehr), der nicht angezeigt wird. Wenn Sie ihn erneut starten, wird er sehr wenig Speicher verwenden: Die Nutzung wird mit der Zeit wieder steigen, da SQL Server Daten in den Speicher lädt und sie zwischenspeichert. Aber der größte Teil dieses Speichers wird wiedernichtim Task-Manager angezeigt werden, da dieses bestimmte Tool es nicht sehen kann.
Ich möchte auch hinzufügen, dass wenn SQL Server tatsächlicherforderlichSpeicher, würde es ihn anders zuordnen undDannder Task-Manager würde es anzeigen; Sie würden sehen, dass SQL Server 60 GB Speicher verwendet, wenn es tatsächlicherforderlichso viel Speicher, anstatt ihn nur zum Zwischenspeichern zu verwenden.
Antwort2
Sie führen SQL Server auf dieser Maschine aus, daher macht sie das Gleiche, was SQL Server macht: Sie reserviert (fast) den gesamten verfügbaren Speicher des Betriebssystems, sodass sie bei großen Abfragen oder anderen Vorgängen keinen RAM zuweisen muss, weil sie diesen bereits hat.
Sie haben einige Optionen.
- Akzeptieren Sie es. Wenn Sie auf diesem Computer nur SQL Server ausführen, funktioniert es wie vorgesehen. Lassen Sie es so.
- Begrenzen Sie es. Wenn Sie andere Workloads auf diesem Server ausführen müssen, können Sie die RAM-Menge begrenzen, die SQL reserviert.
Ich würde Option 2 auf keinen Fall wählen, es sei denn, SQL nutzt den belegten RAM nie. Das erfahren Sie nur, wenn Sie SQL-Leistungsindikatoren auf Betriebssystemebene und dynamische Verwaltungsansichten auf SQL-Ebene messen.
Welches Problem versuchen Sie im Großen und Ganzen eigentlich zu lösen? „Speicher freigeben“ ist in diesem Szenario eine sinnlose Aufgabe, es sei denn, Sie wissen, dass Sie ihn für eine andere Verwendung freigeben. Haben Sie SQL-Leistungsprobleme und wenn ja, wie haben Sie festgestellt, dass der RAM-Engpass vorliegt und nicht beispielsweise ein schlechtes Indexdesign oder nicht optimierte Abfragen?
Ich möchte Sie darauf hinweisen,Verwenden Sie eine geeignete Überwachung, um Leistungsprobleme zu diagnostizieren.Dazu müssen Sie viel über SQL und einiges über Windows wissen. Wenn Sie kein DBA sind, stellen Sie einen ein oder binden Sie einen vertraglich ein oder arbeiten Sie mit Ihrem Softwareanbieter zusammen, wenn es sich um SQL für ein gekauftes Produkt handelt. Wenn es sich um etwas handelt, das Ihr Unternehmen selbst ohne DBA geschrieben hat, holen Sie sich einen.
Standardmäßig kann eine SQL Server-Instanz im Laufe der Zeit den größten Teil des verfügbaren Windows-Betriebssystemspeichers auf dem Server verbrauchen. Sobald der Speicher belegt ist, wird er nicht freigegeben, es sei denn, es wird Speichermangel erkannt. Dies ist beabsichtigt und weist nicht auf einen Speicherverlust im SQL Server-Prozess hin.
/Bearbeiten basierend auf Ihrer Bearbeitung:
Obwohl ich kein Systemadministrator bin, scheint es mir, dass der SQL Server nur wenig Speicher verbraucht, weil alles andere von Windows belegt wird.
Hier liegen Sie mit ziemlicher Sicherheit falsch. Wie ich oben erwähnt habe, wird SQL Server im Laufe der Zeit fast den gesamten System-RAM zuweisen. Die vom Prozess sqlserver.exe verwendete RAM-Menge sagt Ihnen NICHT, wie viel RAM SQL tatsächlich zugewiesen hat. Die DMVs und Leistungszähler werden Ihnen das sagen.
Ich verwende SSMS, um mit den Datenbanken zu arbeiten, und mir fällt sofort auf, wie langsam alles ist. Selbst einfache Dinge wie das Öffnen des Tabellenbereichs, um alle meine Tabellen anzuzeigen, dauern eine Weile und treten manchmal auf.
Führen Sie es nicht auf dem SQL-Server aus, sondern von Ihrer Arbeitsstation aus.