Verwendeter Speicher nach einem SQL BULK Insert / BCP Export nicht freigegeben


10

Ich habe eine sehr einfache SQL-Tabelle wie folgt erstellt

CREATE TABLE [dbo].[TickData](
[Date] [varchar](12) NULL,
[Time] [varchar](12) NOT NULL,
[Symbol] [varchar](12) NOT NULL,
[Side] [varchar](2) NOT NULL,
[Depth] [varchar](2) NOT NULL,
[Quote] [varchar](12) NOT NULL,
[Size] [varchar](18) NOT NULL
    ) ON [PRIMARY]

Ich habe dann einen 3 Gig Bulk Insert durchgeführt

    BULK
    INSERT TickData
    FROM 
    'C:\SUMO.csv'
    GO

Dann ging die RAM-Nutzung für SQL Server in die Höhe und verbrauchte ~ 30Go RAM:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Ich denke lieber, dass dies ein abnormales Verhalten ist und dass Maßnahmen ergriffen werden können, um dies zu vermeiden.

EDIT:
Ok, dies scheint das Standardverhalten zu sein. Meinetwegen.
Doch warum nicht Speicher freigegeben wurde lange nach dem Bulk Insert ist abgeschlossen?

Ein paar zusätzliche Überlegungen:
Nach den Kommentaren zum SQL Server, der den Speicher freigibt, wenn er vom Betriebssystem "dazu aufgefordert" wird, beweist meine praktische Erfahrung auf einem 24-Core-Xeon-Server mit 32 Gbit, dass dies ungenau ist: Sobald ein speicherintensiver BCP-Extrakt beendet ist Ich habe einen Pool von .NET-Instanzen meiner Datenverarbeitungsanwendung, die die extrahierten Daten verarbeiten müssen, und sie müssen ersticken / kämpfen, um den verbleibenden Speicher gemeinsam zu nutzen, um zu versuchen, ihre Jobs auszuführen. Dies dauert länger als beim Einschalten von SQL Server Aus und Speicher steht allen Anwendungen zur gemeinsamen Nutzung zur Verfügung. Ich muss den SQL Server-Agenten stoppen, damit alles reibungslos funktioniert und Apps nicht für Articiallt-verursachte OutOfMemmroy-Ausnahmen abstürzen. In Bezug auf künstliche Brutal Memory Capping / Limitation, wenn freier Speicher verfügbar ist, warum nicht benutzen? Idealerweise wäre es eher dinamisch eingestellt, sich an das anzupassen, was verfügbar ist, als nur "zufällig" gewaltsam eingeschränkt zu werden. Aber ich denke, das ist beabsichtigt, also ist der Fall in diesem letzten Punkt abgeschlossen.


6
Warum sollte SQL Server den Speicher freigeben? Wenn der Speicher für diesen Vorgang einmal benötigt wird, wird er erneut benötigt. Wenn SQL Server den Speicher freigeben würde, wofür würden Sie ihn verwenden? Warum muss der Speicher frei sein? Wenn Sie den Speicher für etwas anderes verwenden, wird diese Masseneinfügung erneut ausgeführt. Was sollte passieren?
Aaron Bertrand

Die einzige Maßnahme, die Sie ergreifen können, um dies zu vermeiden, besteht darin, die maximale Speichergröße festzulegen. Um den Speicher wiederherzustellen, können Sie den SQL Server-Dienst neu starten. Dadurch wird natürlich der Speicher freigegeben, und wenn der Dienst neu gestartet wird, wird der Speicher normal zugewiesen.
TMN

Ich habe die letzte Bearbeitung aufgeräumt. Wenn Sie ein Argument / eine Diskussion über die Vorzüge oder Probleme der Codierung von SQL Server (oder einer anderen DB-Engine) haben möchten, suchen Sie sich einen besseren Ort dafür. Die ursprüngliche Frage wurde anscheinend richtig und ausreichend beantwortet. Wenn dieses Q weiter kriecht, kann es gesperrt werden.
JNK

Es ist nichts Falsches daran, Antworten wissen und Methoden diskutieren zu wollen, nur nicht hier auf einer Q & A-Site. Sie können diese Diskussion definitiv irgendwo im Chat oder in einem Forum führen, aber Stack Exchange ist etwas strukturierter und Diskussionsfragen werden sehr schnell beendet.
JNK

3
Als Nicht-Moderator frage ich mich auch, warum Sie auf Ihrem Server Nicht-SQL-Funktionen ausführen. Die Box sollte NUR für SQL Server reserviert werden. Dies entspricht DBA 101. Die Engine wurde nicht für eine Umgebung mit gemeinsam genutzten Ressourcen entwickelt.
JNK

Antworten:


12

Es ist normal, dass SQL Server so viel Speicher wie möglich in seinen Pufferpool einordnet. Datenbanken funktionieren am besten mit viel Puffer. Wenn Sie das Verhalten ändern möchten, können Sie die Einstellung "Maximaler Serverspeicher" festlegen . Einige gute Hintergrundinformationen dazu finden Sie hier.


1
In Bezug auf Ihre Bearbeitung ist Aarons Kommentar gut. Der Grund dafür ist, dass ein Datenbankserver wenig Sinn macht, um Speicherplatz freizugeben. SQL Server reagiert auf Speicherdruck und gibt Speicher frei, wenn dies wirklich erforderlich ist, aber das sollte eigentlich nicht erforderlich sein.
Matt Whitfield

@MikaJacobi Sorry, aber deine zweite Bearbeitung ist einfach falsch. Aus Entwicklersicht verstehe ich Ihre Sichtweise, aber es gibt einen Unterschied zwischen dem Erstellen einer Reihe von Anwendungen, die nebeneinander existieren, und einem Serverdienst, der eigentlich der einzige speicherintensive Dienst auf dem Computer sein sollte. Wenn Sie möchten, dass sich SQL Server wie eine "normale" Anwendung verhält, legen Sie den maximalen Speicher fest und gehen Sie weg. Ihre Frage war, warum es so funktioniert, und das wurde beantwortet. Wenn Ihre Frage jetzt lautet "Nun, ich mag es nicht, dass es so funktioniert" - Entschuldigung, aber das ist keine Frage mehr.
Aaron Bertrand

Meinetwegen. Mein Standpunkt ist nur, dass es eine Option geben sollte, um dies ein- oder auszuschalten, und die Annahme, dass SQL Server die einzige Anwendung auf einem Server ist, ist wirklich missbräuchlich (könnte für große Unternehmen mit großen Netzwerken zutreffen, aber das ist nicht die einzige möglich noch das häufigste Setup)
Mehdi LAMRANI

Ich verstehe immer noch nicht, warum Sie SQL Server benötigen, um den Speicher freizugeben. Wenn andere Anwendungen es benötigen, nehmen sie es von SQL Server zurück und SQL Server erfüllt die Anforderungen. Welchen Zweck hat die Freigabe des Speichers, bis diese anderen Anwendungen dies benötigen?
Aaron Bertrand

1
@AaronBertrand Ok, ich könnte mich irren, aber wie in meiner neuen letzten Bearbeitung angegeben, habe ich dies nicht gesehen: Der Speicher wurde nicht freigegeben, als andere Anwendungen ihn kaum benötigten, was zu Speicherabstürzen führte (daher meine Unzufriedenheit ...) Schließen Sie das Thema, ich denke, es gibt keinen wirklichen Grund, mehr als das zu streiten.
Mehdi LAMRANI

7

Wenn Sie wirklich möchten, dass das Betriebssystem den Speicher von SQL Server zurücknimmt, nehmen Sie eine große 20-GB-Datei und kopieren Sie sie über das Netzwerk. SQL Server gibt den Speicher frei, wenn das Betriebssystem ihn benötigt. Aber ich würde mir währenddessen verschiedene Leistungsindikatoren ansehen und sehen, wie sich die Leistung Ihres BULK INSERT ändert, wenn Sie es entweder während des Kopierens oder unmittelbar danach erneut ausführen.

Wenn Sie dies manuell tun möchten, sollten Sie eine Untergrenze für die maximale Serverspeichereinstellung von SQL Server festlegen und den Dienst neu starten. Jetzt verwendet SQL Server keine 28 GB mehr, selbst wenn es benötigt wird. Dies scheint jedoch SQL Server künstlich einzuschränken.

Was Sie zu erwarten scheinen, ist ein flexibleres Verhalten, bei dem Sie zeitweise freien Speicher haben können. Für welchen Zweck? Ist dies so, als würde man eine Datenbankdatei verkleinern, um Speicherplatz freizugeben, den Sie nicht für andere Zwecke verwenden können, da die Datenbankdatei wieder wachsen wird?

Es ist lustig, wenn Sie eine Google-Suche nach "Warum nicht SQL Server" eingeben, ist die häufigste automatische Vervollständigung "Speicher freigeben".



"Was Sie zu erwarten scheinen, ist flexibleres Verhalten." Genau. Ich möchte, dass SQL Server den gesamten verfügbaren Speicher verwendet, wenn er verfügbar ist, aber wenn diese schweren Momente vorbei sind, in den Ruhezustand zurückkehren und die anderen speicherbedürftigen Anwendungen ihre Arbeit bequem erledigen können (Sie können sich meinen ansehen neue letzte
Änderung

Für einen konkreten Fall, der veranschaulicht, warum ich dies tun muss, können Sie einen Blick auf meinen letzten Kommentar zu JNK am Ende der Frage
werfen

4

Dies ist leider beabsichtigt, bitte verweisen Sie auf diesen Beitrag. In diesem Beitrag erhalten Sie jedoch einige Anweisungen zur Steuerung.

/server/251832/sql-server-bulk-insert-physical-memory-issue

Speicherzuordnung bearbeiten

Der Speicher ist nicht aktiv freed, da er ähnlich wie eine .NET-Anwendung Speicher zuweist. Da die Speicherzuweisung teuer ist, wird diese Zuweisung beibehalten, sofern das Betriebssystem dies nicht anfordert. Aber keine Angst, wenn das Betriebssystem den Speicher will, wird es ihn bekommen, genau wie in einer .NET-Anwendung.


@ MikaJacobi Klar, kein Problem. Eine andere Sache, die Sie beachten sollten, damit Sie wissen, dass SQL Server auch alle Kerne übernimmt. Stellen Sie daher sicher, dass Sie die Anzahl der verfügbaren Kerne begrenzen. Ich habe gesehen, dass SQL Server tatsächlich das Betriebssystem zerstört, auf dem es zuvor ausgeführt wurde, und ich musste einen SQL Server eines Rechenzentrums hart neu starten.

Gut zu wissen. Ich habe 24 Kerne, also ist das jetzt in Ordnung. Aber warum wird nach dem Bulk Insert kein Speicherplatz freigegeben?

Solange die Masseneinfügung abgeschlossen ist, wird das Betriebssystem, wenn es den Speicher benötigt, an ihn übergeben, aber es weist Speicher ähnlich wie eine .NET-Anwendung zu, sodass es, wenn es benötigt wird und niemand anderes, schneller darauf zugreifen kann.

Meine Erfahrung widerspricht dem (siehe letzte Bearbeitung).
Mehdi LAMRANI
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.