C # VS SSMS'den aynı isteği yürütmek farklı yürütme süresi verir


12

Bunun gibi bir isteğim var

SELECT 
[EstimateId], 
[CreationUserId], 
[EstimateStatusValueId], 
[LanguageId], 
[LocationId], 
[EstimatorUserId], 
[FilterUnitSystemTypeId], 
[EstimateNumber], 
[RevisionNumber], 
[CreationDate], 
[ModificationDate], 
[ProjectDescription], 
[IsBsdq], 
[ClosingDate], 
[ClosingTime], 
[ClosingUpdatedOn], 
[DeadLineDate], 
[IsReceived], 
[Inclusion], 
[Exclusion], 
[Misc], 
[Note], 
[WorkDeadLines], 
[Comments], 
[Validity], 
[PlansLocation], 
[PlansReceivedFrom], 
[Price]
FROM [Estimate].[Estimates] 
ORDER BY [ClosingDate] ASC, [ClosingTime] ASC

SSMS bu sorguyu çalıştırdığınızda 953ms yürütme süresi olsun, ancak bu sorguyu bir C # Linq Query çalıştırdığınızda 1813 ms yürütme süresi olsun.

Linq Sorgusu, ".Net SqlClient Veri Sağlayıcısı" nı kullanır ve EntityFramework (EDMX dosyası) için yayınlanır. Bu bir sorun olabilir mi?

Herkes aynı istekleri aynı veritabanına karşı farklı bağlamdan yürütmek bu isteklerin yürütme süreleri arasında neden büyük bir fark olduğunu biliyor mu?

Her iki isteğin tüm yürütme planlarını doğruladım ve aynı sorguyu karşılamak için aynı dizini kullanıyorlar.

C # isteğinin yürütme planını görmek için Plan XML olayını yakalamak için SQL profiler kullanın ve SSMS biriyle karşılaştırın ve her ikisi de aynı.


sadece küçük bir soru - neden herhangi bir arama koşulu olmadan tüm tablo verilerini seçiyorsunuz? Hiçbir filtreleme olmadan uygulamadaki tüm verilere gerçekten ihtiyacınız var mı?
Marian

Evet bu ihtiyacım olan bir özellik ama bu özellik sık kullanılmayacak. Nerede madde olmadan büyük bir sorgu vermek için uygun olmadığını biliyorum.
Nico

Neyse benim endişe isteğin kendisi değil, yürütme süreleri arasındaki farktır. Size bu sorguyu gösteriyorum ancak tüm sorgular benzer sonuçlar veriyor. Neden ?
Nico

Yanıtlar:


6

Bu, zaman zaman tutarlı mı?

Derleme zamanı olabilecek bir CPU farkı görüyorum. Bunu etkileyen herhangi bir LINQ ayarı var mı?

Düzenle:

  • Profiler'daki planları yakalayın
  • Profiler'de SQL'in aynı olduğundan emin misiniz ?

Evet, her seferinde tutarlı. Linq ayarlarını bilmiyorum. ama bu bağlantıyı buldum codeproject.com/KB/cs/linqsql2.aspx
Nico

Her iki sorgu için yukarıdaki resimde planı görebilirsiniz. Evet SQL profiler aynı olduğundan eminim. SQL, Profiler, SSMS ve C # uygulaması geliştirme amacıyla bilgisayarımda barındırılıyor.
Nico

Profiler'dan XML'deki gerçek planı yakalayın . Önbellekten değil. Farklı yanıtlarınız var, ancak farklı bir plan gösteriyorsunuz = yukarıda gösterilen yanlış plan belki
gbn


3

İki sorgu için Yürütme planlarına bakmak ve bunların nerede farklı olduğunu görmek isteyeceksiniz.


ben sadece benim yazı düzenlemek ... ve ben zaten her iki sorgu aynı planı kullanmak doğrulamak.
Nico

1
Bana söylediğin etkinliği profillere ekliyorum ve soruma gönderdiğim son isteğimle aynı. Aynı planları aldım .. başka bir fikrim var ...
Nico

2
Her şey doğru görünüyor. Bunu açıklayabilecek tek şey, .NET uygulamasının verileri yeterince hızlı almamasıdır. SQL Profiler'da bildirilen süre, verilerin sunucudan istemciye aktarılması için geçen süreyi içerir. Dolayısıyla istemci her şeyi yeterince hızlı indirmezse rapor edilen çalışma süresi daha uzun olacaktır.
mrdenny

2
Sonra uygulamanın veri ile ne yaptığı ve veriyi veritabanından nasıl okuduğuna gelir.
mrdenny

3
Mrdenny'nin cevabını desteklemek için 3 farklı SQL istemcisinde bir sorguyu test ettiğimi ve bildirilen zamanların IO istatistikleri ve yürütme planları aynı olmasına rağmen farklı olduğunu ekledim. Tüm bunlar, müşterilerin verileri nasıl ele aldıklarıyla ilgili dahili yöntemden kaynaklandı. Bir dosyaya, Management Studio'daki ızgaraya veya metin çıktısına çıktı vererek farklı zaman sonuçları alabileceğinizi düşünüyorum. Neyse, hatırladığım kadarıyla, belgeler SQL her zaman LINQ to SQL daha hızlı olacağını söyledi, bu yüzden bu bir sürpriz değil :-).
Marian
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.