Hệ thống quản lý Studio.OutOfMemoryException


38

Tôi đang sử dụng Microsoft SQL Server 2012 và đang cố gắng chạy một truy vấn đơn giản đối với nó trong Management Studio. Tôi đang gặp lỗi sau (trong SSMS, đang chạy trên máy chủ):

Đã xảy ra lỗi trong khi thực hiện lô. Thông báo lỗi là: Ngoại lệ của loại 'System.OutOfMemoryException' đã bị ném.

Hệ thống có 24GB RAM được cài đặt nhưng trong trình quản lý tác vụ, quá trình sqlservr.exe chỉ sử dụng 2.9GB.

Có một thiết lập nào đó đang hạn chế việc sử dụng RAM của nó không?

Câu trả lời:


39

Lỗi này chỉ ra rằng Management Studio sắp hết bộ nhớ, không phải dịch vụ SQL Server. Ngay cả khi bạn đã cài đặt SQL Server 64 bit, tệp thực thi SQL Server Management Studio là một ứng dụng 32 bit.

Điều này có thể xảy ra do kích thước của tập kết quả mà bạn đang quay lại Management Studio. Bạn đang thực hiện một cái gì đó như CHỌN * TỪ really_big_table? Xem http://support.microsoft.com/kb/2874903 để biết thêm.


19

Mike nói đúng rằng thông báo lỗi bạn nhận được là từ chính ứng dụng Management Studio chứ không phải từ SQL Server. Đó là bộ nhớ trên máy trạm cục bộ của bạn đã cạn kiệt, có khả năng là do cố gắng kéo 16 tỷ hàng vào ứng dụng khách (khiến cho nhiều dữ liệu trong lưới khá tốn kém về bộ nhớ, vì vậy hãy cố gắng hạn chế truy vấn của bạn bằng cách sử dụng, TOPv.v. . - Tôi không biết những điều thực tế nào bạn có thể làm với đủ dữ liệu để sử dụng hết bộ nhớ cục bộ của mình.

Nhưng tôi muốn giải quyết một vấn đề khác: sử dụng Trình quản lý tác vụ để đánh giá dung lượng bộ nhớ SQL Server đang sử dụng. Đừng làm điều này; đó là một kẻ nói dối mặt táo bạo. Sao chép từ câu trả lời này (câu hỏi của bạn là hai lần, vì vậy tôi thực sự không thể đóng nó dưới dạng trùng lặp):


Bạn KHÔNG BAO GIỜ, EVER tin tưởng Trình quản lý tác vụ để cho bạn biết SQL Server đang sử dụng bao nhiêu bộ nhớ. Ngừng sử dụng Trình quản lý tác vụ cho giai đoạn này. Sử dụng bộ đếm hiệu suất - bạn cũng có thể truy vấn bộ đếm hiệu suất bằng DMV:

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

Bạn có thể lưu nó dưới dạng phím tắt truy vấn trong Công cụ> Tùy chọn> Môi trường> Bàn phím> Phím tắt truy vấn và nhận kết quả chính xác trong cửa sổ truy vấn nhanh hơn nhiều so với nhận kết quả không chính xác từ Trình quản lý tác vụ.

Bạn cũng có thể kiểm tra áp suất bộ nhớ (và liệu bạn có thể làm bất cứ điều gì về nó không) bằng các truy vấn sau:

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';

Các lệnh trên dành cho các phiên bản mới của SQL. Đối với máy chủ SQL 2008 R2 thì các lệnh có hơi khác nhau. Tôi sẽ thêm một bài đăng khác vào phần dưới này cho các máy chủ đó vì các bình luận tiếp theo không đủ định dạng để đặt ở đây
David Bridge

15

Đó là trường hợp tương tự với tôi. Studio quản lý máy chủ SQL của tôi đã mở trong vài ngày. Tôi khởi động lại nó và nó đã được giải quyết.


9

Tôi thấy tắt IntelliSense giúp. Tôi cũng khuyên bạn nên kiểm tra bất kỳ bổ trợ nào bạn có (những thứ như công cụ RedGate và ApexQuery cũng làm trầm trọng thêm vấn đề cho tôi).

Vấn đề này đã làm tôi khó chịu trong nhiều ngày nay và thành thật mà nói nó khá yếu của Microsoft. Họ thực sự nên có bộ công cụ 64 bit, vì chúng ta đang xử lý dữ liệu lớn hiện nay, máy chủ 64 bit và môi trường máy tính để bàn.


1
Trong trường hợp của tôi, RedGate SQL Prompt đã chiến đấu với SSMS được xây dựng trong intellisense. Tắt SSMS intellisense khiến SQL Prompt hoạt động tốt hơn nhiều.
TTT

1

Đối với SQL 2008 R2, các lệnh truy vấn bộ nhớ (từ bài đăng của Aaron Bertrand) như sau

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;

Cũng lưu ý rằng lệnh

EXEC sp_configure 'max server memory';

có thể không hoạt động trừ khi bạn bật tùy chọn nâng cao. ví dụ làm điều này trước

EXEC sp_configure 'show advanced options',1
RECONFIGURE

1

Xin lưu ý rằng có một sự cố kết nối của Microsoft vì đây là lỗi rò rỉ bộ nhớ SSMS. Họ nghĩ rằng họ đã giải quyết nó trong v16.5

Xem sự cố trên Connect.microsoft.com bằng cách nhấp vào đây

Nếu bạn cài đặt bản mới nhất mà vẫn gặp sự cố thì hãy bỏ phiếu để được mở lại.

SSMS v16.5 tại đây

Vấn đề kết nối cho thấy rò rỉ bộ nhớ đã được sửa trong 16.5 tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.