Arka fon
Katılan ve / veya yaklaşık 12 farklı "tablo" sola katılan SQL Server 2008 R2 karşı çalışan bir sorgu var. Veritabanında 50 milyondan fazla satır ve yaklaşık 300 farklı tablodan oluşan birçok tablo bulunmaktadır. Ülke genelinde 10 depoya sahip büyük bir şirket için. Bütün depolar veri tabanına okuyor ve yazıyor. Bu yüzden oldukça büyük ve oldukça meşgul.
Sorun yaşıyorum sorgusu şuna benzer:
select t1.something, t2.something, etc.
from Table1 t1
inner join Table2 t2 on t1.id = t2.t1id
left outer join (select * from table 3) t3 on t3.t1id = t1.t1id
[etc]...
where t1.something = 123
Katılmalardan birinin korelasyonsuz bir alt sorguda olduğuna dikkat edin.
Sorun şu ki, bu sabah başlamak, sistemde herhangi bir değişiklik yapmadan (benim veya ekibimdeki herkesin bildiği gibi), genellikle yaklaşık 2 dakika süren, çalıştırmak için bir buçuk saat süren sorgu - hiç koştum. Veritabanının geri kalanı sadece iyi boyunca uğultu yapıyor. Bu sorguyu genellikle çalıştığı sproc'tan çıkardım ve aynı yavaşlıkta SSMS w / sabit kodlanmış parametre değişkenlerinde çalıştırdım.
Tuhaflık, ilişkili olmayan alt sorguyu alıp, geçici bir tabloya atıp alt sorgunun yerine kullandığımda sorgunun iyi çalıştığıdır. Ayrıca (ve bu benim için garip) bu kod parçasını sorgunun sonuna eklersem, sorgu harika çalışır:
and t.name like '%'
Yavaşlama sebebinin, SQL'in önbelleğe alınmış yürütme planının nasıl oluşturulduğuna bağlı olduğuna dair bu küçük deneylerden (belki de yanlış) karar verdim - sorgu biraz farklı olduğunda, yeni bir yürütme planı oluşturmak zorundadır.
Sorum şu: Hızlıca çalışan bir sorgu aniden yavaş yavaş yayınlanmaya başladığında ve bu sorgunun dışında başka hiçbir şey etkilenmiyorsa, nasıl sorun giderebilirim ve gelecekte nasıl olmasını engelleyebilirim ? SQL'in bu kadar yavaş hale getirmek için dahili olarak ne yaptığını nasıl bilebilirim (kötü bir sorgu çalıştırılırsa, yürütme planını alabilirim ancak çalışmayacak - belki de beklenen yürütme planı bana bir şey verebilir mi?)? Bu sorun yürütme planındaysa, SQL'in gerçekten berbat yürütme planlarının iyi bir fikir olduğunu düşünmesini nasıl önleyebilirim?
Ayrıca, bu parametre koklama ile ilgili bir sorun değildir. Bunu daha önce görmüştüm ve bu o değil, çünkü SSMS'deki değişkenleri kodladığımda bile performansım yavaşlıyor.