Çevre:
SQL Server 2005 çalıştıran iki adet 32-bit Windows Server 2003 R2 makinemiz var. Donanım yapılandırmaları Xeon 5160 CPU, 4GB RAM ve 13GB RAID0 ile aynı sunuculardır. AWE ve / 3GB bayrakları etkin değil.
Sunucular, önceden tanımlanmış bir yükleme denetim listesi kullanılarak yan yana kuruldu ve TÜM yüklü yazılımlar her iki makinede de aynı.
Kontrol etmek için bildiğimiz her SQL sunucusu kurulum ayarı ve yama seviyesi aynıdır. Bir fark, TEMPDB'nin hızlı makinede 400MB ve yavaş makinede 1.2GB olmasıdır. Ancak, her iki durumda da herhangi bir TEMPDB tahsisi gerçekleşmediğini görmüyoruz.
Sorun:
Birinde 2 saniye, diğerinde 15 dakika süren saklı bir prosedür vardır. Ek 15 dakika boyunca, disk etkinliği çok azdır veya hiç yoktur, bellek kullanımı değişmez, ancak bir CPU çekirdeği tüm zaman boyunca% 100 sabitlenir.
Bu davranış, veritabanları birinden yedeklendiğinde ve diğerine geri yüklendiğinde bile devam eder.
Saklı bir yordam olduğundan, etkinlik izleyicisi ve profil oluşturucu , saklı yordamda bu yüksek CPU etkinliğinin nerede gerçekleştiği hakkında bize hiçbir ayrıntı göstermez .
Soru:
Başka nelere bakmalıyız?
Takip et:
Yavaşlık, aşağıdaki imleç tanımı için FETCH NEXT deyimlerinde oluşur:
DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y
...
FETCH deyimlerinin her biri - yalnızca yaklaşık 1000 satır içeren bir tabloda - yaklaşık 7.25 dakika gerektirir. (Hayır, neden üst üste iki yaptığını bilmiyorum, geliştiricilere sormanız gerekiyor, ancak her iki sunucuda da doğru çalışıyor).
Sanal Okumalar gerçekten yüksek gibi gözüktüğü için, "DEĞİLDE (SEÇ ...)" konusunda biraz şüpheliyim.