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:
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.
quelle
Antworten:
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.
quelle
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".
quelle
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.quelle