6

bir sorguyu dramatik değişen okur ben Uygun bir dizin vardır ve civardaki yaklaşık 1.5 tahmini alt ağaç maliyeti sorgu planında gösterilen bir sorgu var. Plan, bir Endeks Arama, ardından da Anahtar Arama'yı gösterir - bu, 5 satır ile 20 satırlık bir kümeden 1 sırayı döndürmesi beklenen bir sorgu için sorun yaratır (Dizin Arayışı 5 ile 20 satır arasında ve 5 - 20 arasında olmalıdır. Anahtar Aramalar, 1 satır dönmeliyiz). etkileşimli çalıştırdığınızdaVeritabanı endeksler

, sorgu hemen döner. Ancak, bu sabahki DB izleri, çılgınca değişen canlı (bir web uygulaması) çalışma zamanlarını gösteriyor; Genellikle sorgu < 100 DB Reads ve etkin 0 çalışma zamanı alıyor ... ama biz 170.000 DB Reads, ve 60s kadar çalışma zamanı (zaman aşımı değerinden büyük) tüketen birkaç çalışma alıyoruz. Disk okur içinde

Bunun varyasyonu açıklayabilir? Sorguları etkileşimli bir şekilde karşılaştırmayı ve hızlı ve yavaş koşulardan alınan iki paralel koşumdan Gerçek Zamanlı yürütme planlarını kullanmayı denedim, ancak etkileşimli olarak bunlar kullanılan planda etkili bir farklılık göstermiyor.

Ayrıca bunu kilitleyen diğer sorguları da tanımlamayı denedim, ancak DB Okurlarını bu kadar çok etkileyeceğinden emin değilim ... ve her halükarda bu sorgu çalışma zamanımdaki en kötü çalışma eğilimi gösterdi günlükleri.

Güncelleme: İşte sorgu etkileşimli çalıştırıldığında üretilen planının bir örneği verilmiştir:

alt text

'kayıp endeksi' metnini görmezden gelin. , geçerli dizinlerde yapılan değişikliklerin daha az sayıda sorgulama ile daha hızlı bir sorgulamaya izin verebildiğini doğrular ancak buradaki sorun bu değil (zaten uygun dizinler var). Bu, Gerçek Satır Sayısı gibi rakamları gördüğümüz bir Gerçek Yürütme Planıdır. Örneğin, Dizin Aramasında, Gerçek satır sayısı 16'dır ve G/Ç maliyeti 0,003'tür. G/Ç maliyeti, Anahtar Arama'da aynıdır.

Güncelleme 2: Bu sorgu için izlemesi Sonuçlar şu şekildedir:

SqlBuilder sb = new SqlBuilder(StatementType.Select, typeof(ApplicationStatus)); 
sb.AddConstraint(Operator.Equals, "ApplicationGUID", guid); 
sb.AddConstraint(Operator.Equals, "ApplicationStatusCode", 10); 
SqlStatement stmt = sb.GetStatement(true); 
IList apps = ObjectFactory.GetCollection(typeof(ApplicationStatus), stmt.Execute()); 
: sorgu şu şekilde parameterize sorgular inşa Gentle.Framework SqlBuilder sınıfı kullanılarak inşa edilmektedir

exec sp_executesql N'select [...column list removed...] from ApplicationStatus where ApplicationGUID = @ApplicationGUID and ApplicationStatusCode = @ApplicationStatusCode;',N'@ApplicationGUID uniqueidentifier,@ApplicationStatusCode bigint',@ApplicationGUID='ECEC33BC-3984-4DA4-A445-C43639BF7853',@ApplicationStatusCode=10 

cevap

1

Veriler önbellekten kaldırılıyor olabilir mi? Bu, sıcak bir önbellek (bellekte zaten mevcut olan), kaydedilen okumaların çok düşük olduğu bir açıklama olabilir .... ve sonra veriler artık RAM'de olmadığında, okumalar disketi okumak zorunda olduğu için artacaktır. tekrar.

Her şeyi hareket ettirmek için tek bir fikir. istatistikler aynı zamanda etrafında güncellenmektedir eğer

+0

Sanırım; Benim anlayışım, profillemenin önbellekten alınsa bile mantıksal disk okumaları göstermesiydi. Ancak, emin olduğum bir şey değil. – Nij

1

Çalıştır profilci görmek için. Ya da başka neler olduğunu görmek için.

Ayrıca SQL sorgusu yanı istemci kodu ekleyin.

Düşünceler: Bu sizin "5-20" satır gibi geliyor

  • Eğer
  • nasıl olabilir sürekli kötü performans elde ediyorum koklama Kötü bir plan/parametreyle o
  • çok fazla olabilir Bu tablo üzerinde yazıyor: istatistikleri güncellemek için yeterli?
  • Bazı veri türü sorunu var mı? (örneğin, parametrelerin birleştirilmesi ve bir veri türü dönüşümü sunumu)
+0

@gbn: İlgili dizinlere ait istatistikler, görebildiğim kadarıyla 3 gün önce güncellendi (zorlayan bir işimiz var). Sorgu planının bir ekran görüntüsünü ekledim (etkileşimli olarak çalıştırıldığında). Veri türü sorunu olduğuna inanmıyorum. Bu, sıkça eklenen kayıtlara (PK üzerinde bir kimlik) sahip olan bir tablodur. Bu, güncelleme istatistiklerini zorlayabilecek koşullar altında bir araştırma yapmam gerekecek ve eğer bir sorgunun okumaları altında gösterilecekse. – Nij

+0

@Nij: Plan açıkçası Tamam (iyi, kapsanabilir) ve burada yardımcı olmuyor ... bu yararlı olacak SQL kodu ve istemci kodu. – gbn

+0

@gbn: Sorgu, ekranın üst tarafındaki ekran görüntüsünde gösterilir. İstemci kodu derken ne demek istediğimin% 100'ü değilim, ama C# kaynak kodu gibi bir şeyden bahsediyorsan, bunun DB'yi nasıl etkileyeceğinden emin değilim? – Nij