Özdeş (?) SQL Server 2005 makineleri; sorgu biri 2sn, diğeri 15dk alır


12

Ç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.


Dbo.B ve dbo.BX kayıtları nasıl dizine eklenebilir?
Mark Storey-Smith

1
Eğer bu ile gitti bir performans farkı olup olmadığını merak ediyorum: seçin dbo.ax, dbo.a dbo.a sol dış katılmak dbo.b üzerinde dbo.b = dbo.bx null seçin ve z <= 0
DForck42

Bir tane daha karıştırmayı düşündü. Yavaşlamanın imleç getirmesinden kaynaklandığından emin misiniz? Bunu yürütme planından mı (hepsi tahminlerle ilgili) mı yoksa bir profil izinden mi belirliyorsunuz?
Mark Storey-Smith

Bir profil izinden.
ryandenki

İcra planları aynı mı? Bunlardan birinin kötü bir yürütme planı kullanıyor olması mümkündür.
Zane

Yanıtlar:


7

Bekler ve Kuyruklar gibi bir performans sorun giderme yöntemi kullanmak , yüksek CPU tüketiminin nedenini belirler, bu nedenle darboğaz tanımlandıktan sonra uygun eylem önerilebilir.


6

SQL Server, diğer kutuda farklı bir plan seçiyor.

Geri yükleme genellikle istatistikleri temel alan sorunları kaldırır, bu yüzden sunucu farklılıklarına bakarım.

Önce bazı kaba kontroller. Varsaymayın: kontrol edin

  • SQL Server ayarlarının sys.configuration'da aynı olup olmadığını kontrol edin, örn. Maks. Derece veya paralellik
  • Çalışma zamanında herhangi bir ANSI ayarının farklı olup olmadığını görmek için DBCC USEROPTIONS komutunu çalıştırın (ANS ayarları seçilen planı etkileyebilir)
  • Herhangi bir sorun olup olmadığını görmek için Windows ve SQL Server günlüklerini kontrol edin

Sonra Remus'un cevabına göre derin uca atlayın.


İpuçları için teşekkürler. Hem sys.configurations hem de DBCC USEROPTIONS, iki makine arasında aynıdır. Herhangi bir Windows veya SQL sunucu günlüğünde hata veya uyarı yok.

1
Aynı veritabanı düzenini de çalıştırıyorlar mı? Üzerinde optimizasyon yapan yönetici planı yok (dizin yeniden oluşturma vb.), Veritabanları ilgili nesneler için aynı istatistiklere ve aynı disk düzenine sahip mi? Aynı yama seviyesi mi?
TomTom

Evet, aynı disk, DB düzeni ve yama düzeyi. Aslında, hızlı makinedeki veritabanı yavaş makineden geri yüklenen bir yedeklemedir. Gördüğüm kadarıyla değişen hiçbir yönetici planı yok.
ryandenki

6

Tüm diğer şeyler eşitse, her sunucuda farklı bir yürütme planı oluşturuluyor olabilir (@ gbn'nin cevabına göre). Akademik bir alıştırma olarak, her iki planı da görmek ilginç olacaktır, bu yüzden onları her sunucudaki plan önbelleğinden alın ve mümkünse sorunuza ekleyin. Daha sonra performansta bu kadar büyük bir değişikliğe neden olan planlardaki farklılıkları belirleyebiliriz.

Hızlı bir düzeltme için KULLANIM PLANI ipucuna bir göz atın . Bu, iyi planın hızlı sunucudan yavaş sunucuda saklı yordama eklenmesini mümkün kılar.

Düzenleme: Güncelleme sonrasında yeniden: imleç

Diğer cevaplarda bahsedilen görmüyorum denemek için sorgunuzda bir başka varyasyon:

DECLARE C CURSOR FOR
    SELECT X, Y
    FROM dbo.A
    WHERE NOT EXISTS (SELECT 1 FROM dbo.B WHERE dbo.B.X = dbo.A.X)
    AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y

Bu iyi bir tavsiye, sorgu planlarını kontrol ediyoruz. Aslında, saklı yordamdaki yavaşlama bir imleç bağlı görünüyor. Bkz. Düzenleme.
ryandenki

4

Beni mizah edin ve değiştirmeyi deneyin:

DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0

Bununla:

DECLARE C CURSOR FOR
SELECT 
    X, 
    Y
FROM dbo.A

    LEFT OUTER JOIN dbo.B
        ON dbo.A.X = dbo.b.X

WHERE dbo.B.X IS NULL
AND Z <=0

Bu kendini kodunuzun FETCH NEXT FROM bölümünde bir performans sorunu olarak göstermesi gerektiğini düşünmüyorum, ancak henüz kafein enjeksiyonum olmadı. Önerimi bir deneyin ve bana bildirin.

Bu yardımcı olur umarım,

Mat


4

Dizinlerinizi kontrol edin ve tüm istatistiklerinizi güncelleyin. Çok similerle ilgili bir sorun yaşadım ve bir makinedeki istatistiklerin sakat olduğu ortaya çıktı.


1

Aynı davranışı iki kez yaşadım ve size her seferinde neyin düzeltildiğini söyleyeceğim:

1.) Önbelleğe alınan plan korkunç olduğundan saklı yordamla RECOMPILE İLE ipucu ekledim.

2.) Saklı yordamı tablo değişkenleri yerine geçici tablolar kullanmak için değiştirdim.

Umarım bu yardımlardan herhangi biri. İyi şanslar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.