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?

Paul White mówi GoFundMonica
źródło

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 .

Mike Stankavich
źródło
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';
Aaron Bertrand
źródło
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.

Barry Guvenkaya
źródło
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.

Tahir Khalid
źródło
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
David Bridge
źródło