2015-01-09 14 views
9

Verileri 583.000 kayıt içeren bir tablonun görünümü olan bir görünümden sorgulamak istiyorum. Yani buSqlQuery, görünümlerde LINQ ifadesini kullanmaktan neden daha hızlı?

var uuid = "AB1-23456"; 
dbSet.SingleOrDefault(x => x.UserKey == uuid); 

Bu gibi görünümden sorgulamak için basit bir sorgu ben 5 kez sorgu ran oluşturulan SQL

SELECT "Extent1"."UserKey" AS "UserKey", 
     CAST("Extent1"."IsDeleted" AS number(3,0)) AS "C1", 
     "Extent1"."FirstName" AS "FirstName", 
     "Extent1"."LastName" AS "LastName", 
     "Extent1"."UserLogin" AS "UserLogin", 
     "Extent1"."AccLocationKey" AS "AccLocationKey", 
     "Extent1"."CompanyKey" AS "CompanyKey" 
FROM "UsersView" "Extent1" 
WHERE ('AB1-23456' = "Extent1"."UserKey") 

edilir yazın. ilk çağrı bana 350ms aldı ve ertesi çağrılar çok yavaştı bu sorguyu ortalama bana 150ms aldı, bu yüzden ben 5 kez için ran bu

var queryString = 
    "SELECT \"Extent1\".\"UserKey\" AS \"UserKey\", " + 
      "CAST(\"Extent1\".\"IsDeleted\" AS number(3,0)) AS \"IsDeleted\", " + 
      "\"Extent1\".\"FirstName\" AS \"FirstName\", " + 
      "\"Extent1\".\"LastName\" AS \"LastName\", " + 
      "\"Extent1\".\"UserLogin\" AS \"UserLogin\", " + 
      "\"Extent1\".\"AccLocationKey\" AS \"AccLocationKey\", " + 
      "\"Extent1\".\"CompanyKey\" AS \"CompanyKey\" " + 
    "FROM \"UsersView\" \"Extent1\" " + 
    "WHERE ('AB1-23456' = \"Extent1\".\"UserKey\")"; 
dbSet.SqlQuery(queryString).SingleOrDefault(); 

gibi olmak sorgu değişti İlk çağrı beni 40ms aldı ve sonraki aramalar beni sadece 1ms ortalama aldı!

Yanlış yaptığım herhangi bir fikri olan var mı?

Çevre

  • Varlık Framework 5.0
  • Oracle 11g Veritabanı
  • ODP.NET 11.2 Release 3
  • .NET Framework 4,5
+0

Bu yeniden üretilebilir mi? Sorgularınızı önce yeni sorgunuzu kullanarak gönderirseniz ne olur? Oluşturulan sorgu hızlı olanı mı olacak? – nvoigt

+0

"Oluşturulan sql" inizin burada doğru bir şekilde temsil edildiğinden şüphe duyuyorum. EF, büyük olasılıkla parametreleri kullanır ve gösterdiğiniz gibi sorgudaki bir dizgi değişmezini içermez. –

+0

@ ErenErsönmez SQL deyimini oluşturmak için LinqPad'i kullandım ve bana bu ifadeyi gösterdi. – Moozz

cevap

4

o öyle değil mi'ü ilk kez çalıştırdığında sadece 15012 ? Her ardıl çağrı, belirttiğiniz 1 ms civarında olmalıdır. LinqToSql, SQL'i almak için önce sorgusu derlemelidir. LinqToSql Precompiling queries benefit?

+0

Hayır, her çalıştırıldığında 150 ms'dir. – Moozz

+0

Daha açık olmak gerekirse, süreci yeniden başlatmadan birçok kez koştum, İlk çağrı bana 350 ms sürdü ve sonraki aramalar ortalama 150ms beni aldı. – Moozz

+0

EF5'in otomatik olarak sorguyu önbelleğe aldığını buldum. http://stackoverflow.com/questions/9739925/entity-framework-compiled-query – Moozz

0

Bu sorun artık geçerli değildir.

var uuid = "AB1-23456"; 
dbSet.SingleOrDefault(x => x.UserKey == uuid); 

harcanan zaman etrafında 150ms olduğunu. Ben

dbSet.SingleOrDefault(x => x.UserKey == "AB1-23456"); 

çalıştı Ama eğer harcanan zaman geri 1ms etmektir. Buna göre başka bir soru soracağım.

+0

Tek… Eğer string uuid = "AB1-23456" kullanırsanız; ? –

+0

@PaulZahra Denedim ama farklı değildi. – Moozz

+0

Sorgu ifadesini denediniz mi? Örneğin. (dbSet'te x, burada x.UserKey = uuid seçin x) .SingleOrDefault(); Fark var mıydı? - Sadece merak. –

İlgili konular