Ich habe eine SQL Server-Instanz, deren Speichernutzung allmählich zunimmt, bis Windows sie nicht mehr bereitstellt. Es scheint logisch, dass das gelegentliche große Abfrageergebnis dazu führen würde, dass die Instanz wächst.
Gibt es eine Möglichkeit, SQL Server davon zu überzeugen, den nicht mehr benötigten Speicher freizugeben (außer den Dienst neu zu starten)?
Bearbeiten:
Ich verwende SQL Server 2000 SQL Server 8.00.2039 - SP4 (Standard Edition)
Das konnte ich anhand der folgenden Abfrage herausfinden:
SELECT 'SQL Server '
+ CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - '
+ CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' ('
+ CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'
quelle
Die anderen Poster stimmen, dass dies beabsichtigt ist, aber Sie möchten den maximalen Speicher unbedingt auf etwas weniger als den RAM Ihres Servers beschränken. Denken Sie an diese Abfolge von Ereignissen:
Um dies zu vermeiden, konfigurieren Sie Ihr maximales Server-Speicherlimit auf etwa 80-90% Ihres tatsächlichen physischen Speichers. Anweisungen für SQL 2000 unter: http://msdn.microsoft.com/en-us/library/ms178067.aspx
quelle
Es wird nur freigegeben, wenn das Betriebssystem signalisiert, dass der Arbeitsspeicher knapp ist, oder wenn Sie den Dienst beenden und neu starten. Sie müssen lediglich die maximale Menge begrenzen, die SQL verwendet, indem Sie den Wert für den maximalen Serverspeicher konfigurieren. Wenn es auf dem Server nichts anderes gibt, das RAM benötigt (und hoffentlich auch nicht), würde ich mir darüber keine Sorgen machen.
quelle
Um die Antworten zusammenzufassen:
Es gibt keine Möglichkeit, MS SQL Server aufzufordern, nicht sofort benötigten Speicher freizugeben. SQL Server sollte bei Bedarf automatisch Speicher freigeben, jedoch nicht vorher. Und wenn Sie Speicherprobleme haben, sollten Sie den Wert der Speicheroption "Maximaler Serverspeicher" reduzieren.
quelle
SQL Server verbraucht Speicher und gibt ihn nicht zurück, es sei denn, das Betriebssystem teilt ihm mit, dass Speicherdruck besteht. Wie Portman angegeben hat, ist dies beabsichtigt. Wenn Sie den Speicherverbrauch begrenzen möchten, müssen Sie den maximalen Serverspeicher festlegen, den SQL Server verwendet.
quelle
Denken Sie daran, dass das Verhalten, das Sie alle beschreiben, ab SQL Server 2005 erfolgt, als der Speichermanager neu geschrieben wurde, um (unter anderem) auf Speicherdruckanforderungen vom Betriebssystem zu reagieren.
Bei SQL Server 2000 und früheren Versionen wird der Speicher nach dem Zugriff nicht zurückgegeben, unabhängig davon, wie viel das Betriebssystem dafür benötigt.
CodeSlave - laufen Sie auf 2000, 2005 oder 2008?
quelle
Alte Frage, ich weiß, aber eine Möglichkeit, SQL (zumindest neuer) zum Freigeben von Speicher zu zwingen, besteht darin, eine Anwendung zu schreiben, die so viel Speicher wie möglich in Blöcken zuweist und auf (sagen wir) 15 Sekunden wartet (z. B. Sleep (15000)). und das Freigeben des zugewiesenen Speichers und das Verlassen; Ich habe dies versucht und SQL gibt den Speicher frei, damit das System seinen RAM zurückerhält. Das Schreiben von Code wie dem oben genannten ist mit C / C ++ fast trivial. Es geht lediglich darum, eine Kette von Strukturen einzurichten, die die Speicherblockkette (Zeiger und Größe) halten. Reduzieren Sie die Größe schrittweise, wenn ein "malloc ()" ausfällt, bis es erreicht ist ein Minimum (sagen wir weniger als 1024) und durchlaufen dann die verknüpfte Liste, um die zugewiesenen Blöcke freizugeben
quelle