Utworzyłem bardzo podstawową tabelę SQL w następujący sposób
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]
Następnie wykonałem 3 Gig Bulk Insert
BULK
INSERT TickData
FROM
'C:\SUMO.csv'
GO
Następnie użycie pamięci RAM dla serwera SQL poszło w górę Skyrocking, pochłaniając ~ 30Go pamięci RAM:
Wolę myśleć, że jest to zachowanie nienormalne i że można to zrobić, aby tego uniknąć.
EDYCJA:
Ok, wydaje się, że jest to zachowanie domyślne. Słusznie.
Jednak dlaczego nie jest pamięć zwolniona długo po Bulk Insert jest zakończona?
Kilka dodatkowych uwag:
Jeśli chodzi o komentarze dotyczące zwalniania pamięci przez serwer SQL, gdy system operacyjny „nakazuje mu to”, moje praktyczne doświadczenia z 24-rdzeniowym serwerem Xeon 32 Gb dowodzą, że jest to niedokładne: gdy skończy się żarłoczny wyciąg BCP Mam pulę wystąpień .Net mojej aplikacji do przetwarzania danych, które muszą przetwarzać wyodrębnione dane, i pozostawiają duszenie / walkę o współdzielenie pozostałej pamięci, aby spróbować wykonać swoje zadania, co zajmuje faaaaar dłużej niż po włączeniu SQL Server wyłączone i pamięć jest dostępna dla wszystkich aplikacji do udostępniania. Muszę zatrzymać SQL Server Agent, aby wszystko poszło gładko i zapobiec awariom aplikacji w przypadku Articiallt, które spowodowało wyjątek OutOfMemmroy. Jeśli chodzi o sztuczne ograniczenie / ograniczenie pamięci brutalnej, jeśli dostępna jest wolna pamięć, dlaczego tego nie użyć? Idealnie byłoby raczej dynamicznie przystosować się do tego, co jest dostępne, niż po prostu ograniczać się „losowo”. Ale myślę, że jest to zgodne z projektem, więc sprawa została zamknięta w tej ostatniej kwestii.