NEDEN belirli bir masadaki bir yazının yavaş olduğunu nasıl söyleyebilirim?


29

Bir SQL tablosundaki bir INSERT'in birçok nedenden dolayı yavaş olabileceğini biliyorum:

  • Masada INSERT TRIGGER'lerin varlığı
  • Kontrol edilmesi gereken çok sayıda zorlama kısıtlaması (genellikle yabancı anahtarlar)
  • Tablonun ortasına bir satır eklendiğinde, sayfa kümelenmiş dizinde bölünüyor
  • İlgili tüm kümelenmemiş dizinleri güncelleme
  • Tablodaki diğer etkinliklerden engelleme
  • Kötü IO yazma süresi
  • ... özlediğim bir şey var mı?

Özel durumumda hangisinin sorumlu olduğunu nasıl söyleyebilirim? Sayfa bölmelerinin, kümelenmemiş dizin güncelleştirmelerinin vs diğerlerinin etkisini nasıl ölçebilirim?

Bir seferde yaklaşık 10.000 satır ekleyen (geçici bir tablodan), 10k satır başına yaklaşık 90 saniye alan bir depolanmış procum var. Bu kabul edilemez derecede yavaş, çünkü diğer örümceklerin zaman aşımına uğramasına neden oluyor.

Yürütme planına baktım ve INSERT CLUSTERED INDEX görevini ve FK aramalarından tüm INDEX SEEKS'i görüyorum, ancak hala neden bu kadar uzun sürdüğünden emin değil. Tetikleyici yok, ancak tabloda bir avuç FKey var (bu durum düzgün bir şekilde indekslenmiş gibi görünüyor).

Bu bir SQL 2000 veritabanıdır.


Veri dosyalarınızda otomatik genişletmeyi etkinleştirdiniz mi? Bu, varsayılan yapılandırmada performans sorunlarına neden olabilir.
Larry Coleman

Bir profiler kullanmaktan mı bahsediyoruz? msdn.microsoft.com/en-us/library/ms187929.aspx
Gizli

@Larry: Veri dosyalarında önemli boş alan var, bu yüzden veri dosyalarının büyümesinin bir sorun olduğuna inanmıyorum. Yine de "kontrol edilmesi gerekenler" listesine eklemek için iyi bir şey.
BradC

@ user210: İfade tamamlama profili bana sadece 90 saniye sürdüğünü gösteriyor, bana NEDEN olduğunu söylemiyor. Daha fazla söyleyeceğini düşündüğünüz başka olaylar yoksa.
BradC

Yanıtlar:


10

Bakabileceğiniz bazı şeyler ...

Parti boyutunu 10000'den 2000 veya 1000 gibi daha küçük bir şeye düşürün (satır boyutunuzun ne kadar büyük olduğunu söylemediniz).

FK aramalarının ne kadar IO aldığını görmek için IO İstatistiklerini açmayı deneyin.

Eklendiği sırada (master.dbo.sysprocesses) neden beklediği nedir?

Hadi buradan başlayıp nereye gideceğimizi görelim.


2
Toplu iş boyutunu azaltmak yardımcı olur (1000 kayıt ~ 25 saniye sürer). Bu bizim şu anki "geçici çözümümüz" olacak. IO İstatistikleri belirleyip bekleyemediğimi ve bekleyeceğimi göreceğim (işin bir dosya işlendiğinde müşterinin isteği üzerine çalıştırması nedeniyle, işin gerçekten ne zaman çalışacağını her zaman tahmin edemem).
BradC

7

Brad

Sorgunuz için bekleme istatistiklerini incelemelisiniz. SQL2000 ile bu ayrıntıları almak için DBCC SQLPERF ("waitstats") sözdizimini kullanabilirsiniz.


6

Bir sorgunun performansını analiz ederken aradığımı söyleyebilirim. Belki yardımcı olur.

  • sorgu yürütme planını analiz eder ve indeks taramalarını, tablo taramalarını, sql veri tipleri için convert_implicit fonksiyonlarını kullanma, paralellik kontrol eder.
  • Sorgulamayı SET STATISTICS IO ON ve SET STATISTICS TIME ON ile çalıştırın, yürütme zamanını görün ve her ekleme için io okuma / yazma.
  • oturum spid için sysprocesses waittime göz atın.
  • profiler'ı çalıştırın ve standart şablonu seçin. Aşağıdakini seçin: Performans istatistikleri (eğer tekrarlanırsa planınız birçok kez derlenir - iyi değil), RPC: tamamlandı, SQL: toplu tamamlandı ve SQL: toplu başlatılıyor. Gruptaki satır sayısını tam olarak görmek için bunlara sütun satır sayıları ekleyin . Yalnızca sorgunuzu görmek için sonuçları filtreleyin.
  • en sonunda toplanan Sayfa Ömrü Beklentisi pencerelerinden karşı gelme ve 300'ün altındaysa (5 dak) SQL'in belleği düşüktür. Ayrıca disk sayaçlarını da toplayın: disk sırası uzunluğu , Disk Süresi (veri dosyaları sürücünüz), Disk Saati (Günlük dosyaları sürücünüz) disklerde baskı olup olmadığını görmek için.

5

Kullanmayı deneyin:

SET STATISTICS IO ON

ve

SET STATISTICS PROFILE ON

İSTATİSTİK IO

Hangi tabloların en fazla tablo taraması yaptığını, mantıksal okumaları ve fiziksel okumaları anlatmakta size yardımcı olabilir (bu üçünü, sorgu planının hangi kısmının en fazla ayarlamaya ihtiyaç duyduğuna odaklanmak için kullanırım)

İSTATİSTİK PROFİL

Öncelikle sorgu planını tablo biçiminde döndürecek, daha sonra sorguda en fazla maliyetin ne olduğu konusunda IO ve CPU sütunlarına bakabilirsiniz. kümelenmiş anahtar, vb ...)

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.