2016-01-20 28 views
5

Bazı .NET kodlarında, SqlConnection'da birkaç saklı yordamı çağırıyorum. SQL Server tarafından yapılan önbelleğe almayı devre dışı bırakmak istiyorum, böylece performansı düzenli olarak ölçebiliyorum (muhtemelen önbelleğe alınmış herhangi bir veriye sahip olmayacak başka bir sunucuyla karşılaştırıyorum). Bu sprocs değiştirmeden yapmak mümkün mü?SQL Server'ın .NET koduyla önbelleğe alınıp devre dışı bırakılması

using (SqlConnection connection = new SqlConnection(/* connection string goes here */)) { 

    SqlCommand command = new SqlCommand(procName, connection); 
    command.Parameters.AddRange(parameters); 
    command.CommandType = System.Data.CommandType.StoredProcedure; 
    connection.Open(); 

    SqlDataReader r = command.ExecuteReader(); 
    // todo: read data here 
    r.Close(); 
    connection.Close(); 
} 
+2

Bu zor. Önbelleğe alınmış performansı ölçmelisiniz, çünkü daha fazla temsilci mi? – usr

+0

Sorgunuzdan önce 'dbcc dropcleanbuffers'ı göndermeye ne dersiniz? –

+2

Bu kötü bir fikir ve muhtemelen bunu yapmak istemiyorsunuz; iki kat üretimde. Ancak, 'dbcc dropcleanbuffers' ve 'dbcc freeproccache' gerekiyorsa https://msdn.microsoft.com/en-AU/library/ms187762.aspx ve https://msdn.microsoft.com/en-us/library/ ms174283.aspx –

cevap

0

ilk şey, "cacheing" Burada sana İcra Planı Önbellek Bahsettiğiniz sanıyorum:

Bu

Şu anda kullanıyorum kodudur. SQL Server, ifadelerinizi yürütmek için en iyi sırayı belirledikten sonra, bir süreliğine saklar. Bu sorun genellikle "Parametre Sniffing" olarak bilinir. Bu, dbcc freeproccache çalıştırdığınızda temizlediğinizdir. Ne yazık ki, bu yönetici ayrıcalıklı bir komuttur ve tüm bağlantıları etkiler.

Sorunun kökü SQL'inizin muhtemelen farklı bir parametre kümesiyle farklı performans göstermesidir. SQL Server yalnızca gördüğü ilk yürütme yürütme planını ve onunla ilişkili parametreleri depolar. Bu nedenle, ilk uygulamadaki argümanlar genel durum için uygunsa, uygulamanız iyi sonuç verecektir. Ancak bir süre sonra, ilk argümanda yanlış argümanlar kullanılacak ve tüm uygulamanız kötü performans gösterebilir.

Bunun etkisini azaltmak için SQL ifadenizi optimize etmenin birçok yolu vardır, ancak tamamen önlenemez. Her yürütme bir sorgu planı oluşturma isabet performans almak ama yanlış yürütme planını kullanarak asla geri sorgunuzu neden olursa bu buna değer olabilir -

  1. dinamik SQL oluşturun. Bu yolu öneririm, ancak daha hantaldır. SET STATISTICS TIME ON ve SQL Profiler'i plan oluşturma süresini azaltmada yardımcı buldum. En büyük iyileştirme, tablolar için 3 bölümlük adlandırma (owner.schema.table) kullanılarak yapılmıştır.
  2. Sorgu ipuçlarıyla sorgunuz için başlangıç ​​parametrelerinin bir "iyi kümesini" belirtin.
SELECT Col1, Col2 
FROM dbo.MySchema.MyTab 
WHERE [email protected] 
OPTION (OPTIMIZE FOR (@Parameter='value')); 

Bu bağlantı oldukça iyi parameter sniffing problem açıklar. Bu, SQL 2005'te daha büyük bir sorundu. Daha sonraki SQL sürümleri bundan kaçınmak için daha iyi bir iş yaptı.

İlgili konular