Management Studio System.OutOfMemoryException


38

Używam Microsoft SQL Server 2012 i próbuję uruchomić proste zapytanie w Management Studio. Otrzymuję następujący błąd (w SSMS, uruchomiony na serwerze):

Wystąpił błąd podczas wykonywania partii. Komunikat o błędzie: Zgłoszono wyjątek typu „System.OutOfMemoryException”.

W systemie zainstalowano 24 GB pamięci RAM, ale w menedżerze zadań proces sqlservr.exe używa tylko 2,9 GB.

Czy jest jakieś ustawienie, które ogranicza użycie pamięci RAM?

Odpowiedzi:


39

Ten błąd wskazuje, że w Management Studio kończy się pamięć, a nie usługa SQL Server. Nawet jeśli zainstalowano 64-bitowy program SQL Server, plik wykonywalny SQL Server Management Studio jest aplikacją 32-bitową.

Jest to prawdopodobnie spowodowane wielkością zestawu wyników zwracanego do Management Studio. Czy wykonujesz coś takiego jak WYBIERZ * z naprawdę_tabela? Więcej informacji można znaleźć na stronie http://support.microsoft.com/kb/2874903 .


19

Mike ma rację, że otrzymany komunikat o błędzie pochodzi z samej aplikacji Management Studio, a nie z programu SQL Server. Wyczerpana jest pamięć na lokalnej stacji roboczej, prawdopodobnie z powodu próby wciągnięcia 16 miliardów wierszy do aplikacji klienckiej (renderowanie tak dużej ilości danych w siatce jest dość drogie pod względem pamięci, więc spróbuj ograniczyć zapytania przy użyciu TOPitp. - Nie wiem, jakie praktyczne rzeczy można by zrobić przy wystarczającej ilości danych, aby mimo to wykorzystać całą pamięć lokalną).

Ale chcę rozwiązać inny problem: użycie Menedżera zadań do oceny ilości pamięci używanej przez SQL Server. Nie rób tego; to odważny kłamca. Kopiowanie z tej odpowiedzi (twoje pytanie jest dwojakie, więc nie mogę tak naprawdę zamknąć go jako duplikat):


NIGDY, NIGDY nie ufaj Menedżerowi zadań, który powie ci, ile pamięci używa SQL Server. Przestań używać Menedżera zadań dla tego okresu. Użyj licznika wydajności - możesz również wykonać kwerendę licznika wydajności za pomocą DMV:

SELECT object_name, cntr_value 
  FROM sys.dm_os_performance_counters
  WHERE counter_name = 'Total Server Memory (KB)';

Możesz zapisać to jako skrót do zapytania w Narzędzia> Opcje> Środowisko> Klawiatura> Skróty do zapytań i uzyskać dokładne wyniki w oknie zapytania znacznie szybciej niż uzyskiwanie niedokładnych wyników z Menedżera zadań.

Możesz również sprawdzić presję pamięci (i czy możesz coś z tym zrobić) za pomocą tych zapytań:

SELECT object_name, cntr_value
  FROM sys.dm_os_performance_counters
  WHERE counter_name IN ('Total Server Memory (KB)', 'Target Server Memory (KB)');

-- SQL Server 2012:
SELECT physical_memory_kb FROM sys.dm_os_sys_info;

-- Prior versions:
SELECT physical_memory_in_bytes FROM sys.dm_os_sys_info;

EXEC sp_configure 'max server memory';

Powyższe polecenia dotyczą nowych wersji SQL. W przypadku serwerów SQL 2008 R2 polecenia są nieco inne. Dodam kolejny post do tego niższego poziomu dla tych serwerów, ponieważ komentarze uzupełniające nie są wystarczająco sformatowane, aby je tutaj umieścić
— David Bridge

15

Tak samo było ze mną. Moje SQL Server Management Studio było otwarte przez kilka dni. Uruchomiłem go ponownie i problem został rozwiązany.


9

Odkryłem, że wyłączenie IntelliSense pomogło. Polecam również sprawdzenie wszelkich posiadanych dodatków (rzeczy takie jak narzędzia RedGate i ApexSQL również zaostrzyły ten problem).

Ten problem nękał mnie od kilku dni i szczerze mówiąc, jest dość słaby od Microsoftu. Powinny naprawdę mieć 64-bitowe zestawy narzędzi, ponieważ obecnie mamy do czynienia z dużymi zbiorami danych, 64-bitowymi serwerami i środowiskami komputerowymi.


1
W moim przypadku RedGate SQL Prompt walczył z SSMS wbudowanym w intellisense. Wyłączenie inteligencji SSMS sprawiło, że zapytanie SQL również działało znacznie lepiej.
— TTT

1

W przypadku SQL 2008 R2 polecenia zapytania do pamięci (z postu Aarona Bertranda) są następujące

SELECT object_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Total Server Memory (KB)';

SELECT object_name, cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Total Server Memory (KB)', 'Target Server Memory (KB)');

-- SQL Server 2012:
SELECT physical_memory_in_bytes FROM sys.dm_os_sys_info;

-- Prior versions:
SELECT physical_memory_in_bytes FROM sys.dm_os_sys_info;

Zauważ też, że polecenie

EXEC sp_configure 'max server memory';

może nie działać, chyba że masz włączone opcje zaawansowane. np. zrób to pierwszy

EXEC sp_configure 'show advanced options',1
RECONFIGURE

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.