2015-05-28 16 views
5

Tôi có truy vấn sql mà tôi đang cố gắng chạy trên một máy chủ có RAM 8GB. Nếu tôi khởi động lại máy chủ, nó khởi động và mức sử dụng bộ nhớ là khoảng 1.2GB.Các vấn đề về truy vấn và RAM SQL

Nếu sau đó tôi thực hiện truy vấn, vào thời điểm truy vấn đã kết thúc, mức sử dụng RAM sẽ tăng lên khoảng 4GB và dường như ở lại đó, thậm chí qua đêm.

Nếu sau đó tôi thực hiện lại truy vấn (ngày tiếp theo), việc sử dụng RAM tăng lên khoảng 7 GB và vẫn ở đó ngay cả khi truy vấn đã kết thúc.

Nếu sau đó tôi thử thực hiện lại truy vấn sau khi chờ 24 giờ, mức sử dụng RAM vẫn ở mức 7 GB, nhưng lần này, truy vấn bắt đầu trả về lỗi bộ nhớ.

Câu hỏi của tôi là, làm cách nào để xóa sử dụng bộ nhớ khi truy vấn đã chạy xong? Lý tưởng nhất, nó sẽ là tốt nếu kịch bản sql chính nó có thể xóa việc sử dụng RAM khi nó đã hoàn thành công việc chính của nó.


Phiên bản máy chủ là:

Đó là Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64).


Các thông báo lỗi là:

System.Data.SqlClient.SqlException (0x80131904): There is insufficient memory available in the buffer pool. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
    at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 
    at System.Data.SqlClient.SqlDataReader.get_MetaData() 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
    at System.Data.SqlClient.SqlCommand.ExecuteReader() 
    at Project1.Form1.intenseProcess3() in c:\Users\oshirowanen\Documents\Visual Studio 2013\Projects\Project1\Form1.cs:line 117 
ClientConnectionId:33f515db-0086-4f88-a8fd-e7779d92d030 
Error Number:802,State:20,Class:17 SqlException caught. 
+0

Bạn có thể thêm thông báo lỗi chi tiết không? –

+2

Trong SQL Server Management Studio, nhấn chuột phải vào cá thể máy chủ, chọn Properties, bấm vào "Memory" trang, và đảm bảo "tối đa bộ nhớ máy chủ" được thiết lập để một cái gì đó hợp lý, trong trường hợp của bạn, 4096.Theo mặc định, SQL Server sẽ sử dụng hết bộ nhớ có sẵn và giữ nó. Đây là bước đầu tiên. – pmbAustin

+0

Tôi hy vọng đó chỉ là máy chủ thử nghiệm cá nhân của bạn hoặc một cái gì đó tương tự. Nếu không, tôi chắc chắn sẽ khuyên bạn nên mua thêm RAM. –

Trả lời

4

Bạn nên thiết lập bộ nhớ máy chủ tối đa của bạn để lại ít nhất một hai dành cho hệ điều hành và bất kỳ phần mềm khác trên máy chủ của bạn gig hoặc. SQL sẽ lưu trữ dữ liệu và chỉ phát hành nó khi tiếp cận giới hạn của nó.

Sử dụng tối đa bộ nhớ máy chủ để ngăn chặn các bộ đệm hồ bơi SQL Server từ việc sử dụng nhiều hơn số tiền quy định của bộ nhớ, do đó để lại còn bộ nhớ còn trống để bắt đầu ứng dụng khác một cách nhanh chóng. SQL Server hiện không ngay lập tức cấp phát bộ nhớ được chỉ định trong bộ nhớ máy chủ tối đa khi khởi động . Sử dụng bộ nhớ được tăng lên khi cần thiết bởi SQL Server cho đến khi đạt đến giá trị được chỉ định trong bộ nhớ máy chủ tối đa. SQL Server không thể vượt quá mức sử dụng bộ nhớ này trừ khi giá trị của bộ nhớ máy chủ tối đa là được nâng lên.

https://msdn.microsoft.com/en-us/library/ms178067%28v=sql.105%29.aspx

Bạn có thể thay đổi nó bằng Management Studio bằng cách nhấp chuột phải vào máy chủ trong trình xem đối tượng và chọn Properties. Sau đó thay đổi giá trị máy chủ Memory tối đa:

enter image description here

0

Để bộ nhớ miễn phí, bạn có thể sử dụng nhưng lệnh này, nhưng chúng chỉ hữu ích ví dụ để kiểm tra thời gian truy vấn trong một CONTEX liên tục. SQL Server là đủ thông minh để thông qua đối tượng đi từ RAM khi nó là cần thiết.

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

Bạn có chắc chắn không sử dụng DBCC PINTABLE vì lệnh này buộc SQL giữ đối tượng trong RAM không?

+0

Không phải DBCC PINTABLE đã được gỡ bỏ vào năm 2000 hay một cái gì đó như thế? Nhưng dù sao, nó không nên được sử dụng ngay cả khi nó vẫn còn tồn tại :) –

Các vấn đề liên quan