Mam instancję programu SQL Server, której użycie pamięci stopniowo rośnie, dopóki system Windows nie da jej więcej. Wydaje się logiczne, że sporadyczny wynik dużego zapytania spowodowałby wzrost instancji.
Czy jest jakiś sposób, aby przekonać SQL Server do zwolnienia pamięci, której nie potrzebuje więcej (oprócz ponownego uruchomienia usługi)?
Edycja:
Używam SQL Server 2000 SQL Server 8.00.2039 - SP4 (edycja standardowa)
Udało mi się to ustalić za pomocą następującego zapytania:
SELECT 'SQL Server '
+ CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - '
+ CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' ('
+ CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'
memory
sql-server
BIBD
źródło
źródło
Inne plakaty mają rację, że jest to zgodne z projektem, ale absolutnie chcesz ograniczyć maksymalną pamięć do nieco mniejszej pamięci RAM serwera. Pomyśl o tej sekwencji wydarzeń:
Aby tego uniknąć, ustaw maksymalny limit pamięci serwera na około 80–90% faktycznej pamięci fizycznej. Instrukcje dotyczące SQL 2000: http://msdn.microsoft.com/en-us/library/ms178067.aspx
źródło
Zostanie zwolniony tylko wtedy, gdy system operacyjny zasygnalizuje, że RAM jest głodny lub jeśli zatrzymasz i uruchomisz ponownie usługę; należy ograniczyć maksymalną ilość, jaką SQL zużyje, konfigurując wartość „maksymalnej pamięci serwera”. Jeśli na serwerze nie ma nic innego, co wymagałoby pamięci RAM (i mam nadzieję, że nie ma), nie martwiłbym się tym.
źródło
Podsumowując odpowiedzi:
Nie ma sposobu, aby zachęcić MS SQL Server do zwolnienia pamięci, której nie potrzebuje natychmiast. Program SQL Server powinien automatycznie zwalniać pamięć, gdy jest to wymagane, ale nie wcześniej. A jeśli masz problemy z pamięcią, powinieneś zmniejszyć wartość opcji pamięci „maksymalna pamięć serwera”.
źródło
SQL Server zużywa pamięć i jej nie zwraca, chyba że system operacyjny poinformuje ją o presji pamięci. Jak wskazał Portman, jest to zgodne z projektem, a jeśli chcesz ograniczyć zużycie pamięci, musisz ustawić maksymalną pamięć serwera, z której będzie korzystać SQL Server.
źródło
Pamiętaj, że zachowanie, które wszyscy opisujesz, pochodzi od SQL Server 2005, kiedy menedżer pamięci został przepisany, aby (między innymi) odpowiadać na żądania ciśnienia pamięci z systemu operacyjnego.
W przypadku SQL Server 2000 i wcześniej, gdy tylko pobierze pamięć, nie zwróci jej, bez względu na to, jak bardzo system operacyjny na to krzyczy.
CodeSlave - korzystasz z 2000, 2005 lub 2008 roku?
źródło
Wiem, że stare pytanie, ale sposobem na zmuszenie (przynajmniej nowszego) SQL do zwolnienia pamięci jest napisanie aplikacji przydzielającej tak dużo pamięci, jak to możliwe w porcjach, czekając (powiedzmy) 15 sekund (np. Sleep (15000)) oraz uwolnienie przydzielonej pamięci i wyjście; Próbowałem tego i SQL zwalnia pamięć, więc system odzyskuje pamięć RAM; pisanie kodu takiego jak powyższy jest prawie banalne przy użyciu C / C ++, wystarczy kwestia skonfigurowania łańcucha przewodów do przechowywania łańcucha bloków pamięci (wskaźnik i rozmiar), stopniowo zmniejszaj rozmiar, gdy „malloc ()” zawiedzie, dopóki nie osiągnie minimum (powiedzmy mniej niż 1024), a następnie przeglądaj połączoną listę, aby zwolnić przydzielone bloki
źródło