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.
źródło
Odpowiedzi:
SQL Server przydziela jak najwięcej pamięci do swojej puli buforów. Bazy danych działają najlepiej z dużą ilością bufora. Jeśli chcesz zmienić zachowanie, możesz ustawić ustawienie „maksymalna pamięć serwera” . Kilka dobrych lektur na ten temat jest tutaj.
źródło
Jeśli naprawdę chcesz, aby system operacyjny zabrał pamięć z SQL Server, weź duży plik o wielkości 20 GB i skopiuj go przez sieć. SQL Server zwolni pamięć zgodnie z wymaganiami systemu operacyjnego. Ale w tym czasie oglądałbym różne liczniki wydajności i sprawdzałbym, jak zmienia się wydajność twojego WSTAWKI LUZOWEJ, jeśli uruchomisz ją ponownie podczas działania kopii lub bezpośrednio po niej.
Jeśli chcesz to zrobić ręcznie, powinieneś ustawić dolny limit maksymalnego ustawienia pamięci serwera SQL Server i zrestartować usługę. Teraz SQL Server nie będzie używać 28 GB, nawet jeśli będzie go potrzebować. Ale to wydaje się sztucznie ograniczać SQL Server.
Wydaje się, że oczekujesz bardziej elastycznego zachowania, w którym możesz mieć przez pewien czas wolną pamięć. W jakim celu? Czy to jest jak zmniejszanie pliku bazy danych w celu zwolnienia miejsca na dysku, którego nie można użyć do innych celów, ponieważ plik bazy danych znów się powiększy?
To zabawne, jeśli wpiszesz w wyszukiwarce Google hasło „dlaczego SQL Server”, najczęstszym automatycznym uzupełnianiem jest „zwolnij pamięć”.
źródło
Jest to niestety zgodne z projektem, zapoznaj się z tym postem. Jednak w tym poście zawiera instrukcje dotyczące kontrolowania tego.
/server/251832/sql-server-bulk-insert-physical-memory-issue
Edycja alokacji pamięci
Brak pamięci
freed
, ponieważ alokuje pamięć bardzo podobnie jak aplikacja .NET. Ponieważ przydział pamięci jest kosztowny, zostanie on zachowany, chyba że system operacyjny tego zażąda. Ale nie obawiaj się, jeśli system operacyjny chce pamięci, dostanie ją, podobnie jak w aplikacji .NET.źródło