2015-05-28 47 views
5

8 GB RAM'e sahip bir sunucuda çalıştırmaya çalıştığım bir sql sorgum var. Sunucuyu yeniden başlatırsam, başlatılır ve bellek kullanımı yaklaşık 1,2GB'tır.SQL Sorgu ve RAM sorunları

Sorguyu çalıştırırsam, sorgu bittiğinde RAM kullanımı yaklaşık 4 GB'a gider ve gece boyunca bile orada kalır gibi görünür.

Sorguyu tekrar çalıştırırsam (bir sonraki gün), RAM kullanımı yaklaşık 7 GB'a kadar çıkar ve sorgu bittiğinde bile orada kalır.

Sorguyu 24 saat bekledikten sonra yeniden çalıştırmayı denerseniz, RAM kullanımı hala 7 GB'tır, ancak bu kez sorgu bellek hatalarını geri döndürmeye başlar.

Sorunuz, sorgu çalışmayı bitirdiğinde bellek kullanımını nasıl temizlerim? İdeal olarak, sql betiğinin kendisi ana işi bitirdiğinde RAM kullanımını temizlemesi iyi olurdu.


sunucu sürümü:

Microsoft SQL Server 2008 R2 var (RTM) - 10.50.1600.1 (X64).


hata iletisi:

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

Detaylı hata mesajları ekleyebilir misiniz? –

+2

SQL Server Management Studio'da, sunucu örneğini sağ tıklatın, Özellikler'i seçin, "Bellek" sayfasına tıklayın ve "Maksimum sunucu belleği" seçeneğinin sizin durumunuzda 4096 makul bir değere ayarlandığından emin olun.Varsayılan olarak, SQL Server tüm kullanılabilir belleği kullanacak ve üzerine basılı tutacaktır. Bu ilk adım. – pmbAustin

+0

Umarım bu sadece kişisel test sunucunuz ya da bunun gibi bir şeydir. Aksi takdirde daha fazla RAM satın almanızı kesinlikle tavsiye ederim. –

cevap

4

En az bir konser veya OS ve sunucu üzerinde başka herhangi bir yazılım mevcut ikisini bırakmak için en fazla sunucu belleği belirlesin. SQL, verileri önbelleğe alır ve yalnızca sınırlarına yaklaşırken onu serbest bırakır.

Kullanım fazla sunucu belleği böylece hızla diğer uygulamaları başlatmak için kullanılabilir hafızayı kalan bırakarak bellek belirtilen miktardan daha fazlasını kullanarak SQL Server tampon havuzu önlemek için. SQL Server , başlangıçta en fazla sunucu belleğinde belirtilen belleği hemen ayırmaz. Bellek kullanımı, maksimum sunucu belleğinde belirtilen değere ulaşan SQL Server tarafından 'a kadar artırılır. En fazla sunucu belleği değeri yükseltilmemişse, SQL Server bu bellek kullanımını aşamaz.

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

Sen nesne izleyicide sunucu ve seçme özelliklerine sağ tıklayarak Yönetim Studio ile değiştirebilirsiniz

. Sonra Maksimum Sunucu Bellek değerini değiştirmek:

enter image description here

0

bellekte yer için, ama bu komutları kullanabilirsiniz ancak örnek sabit çerçevede değerlendirilerek sorgu süresini test etmek için sadece yararlıdır. SQL Server, gerektiğinde RAM'den uzak nesneye yetecek kadar akıllıdır.

DBCC DROPCLEANBUFFERS 
DBCC FREEPROCCACHE 

Bu komut kuvvet SQL RAM içinde nesneyi tutmak için çünkü DBCC PINTABLE kullanmayın emin misin?

+0

DBCC PINTABLE 2000 yılında kaldırılmamış mıydı ya da böyle bir şey? Her neyse, hala var olsa bile kullanılmamalıdır :) –