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:
'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
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