2015-01-09 26 views
9

我想從一個視圖查詢數據,這是一個包含583,000條記錄的視圖。 所以我寫了一個簡單的查詢從視圖查詢這樣爲什麼SqlQuery比在視圖上使用LINQ表達式要快得多?

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

這是生成的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") 

我跑的查詢5次。 第一個電話把我350毫秒和未來電話把我150ms的平均此查詢這是太慢了,所以我改變了查詢是這樣

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(); 

我跑了5次 第一個電話接我40ms,接下來的電話平均只帶了我1ms

有沒有人有任何想法我做錯了什麼?

環境

  • 實體框架5.0
  • 在Oracle 11g數據庫
  • ODP.NET 11.2版本3
  • .NET框架4.5
+0

這是可重現的嗎?如果您首先使用新查詢發送查詢,會發生什麼情況?生成的查詢會是最快的嗎? – nvoigt

+0

我非常懷疑你的「生成的sql」在這裏被準確地表示出來。 EF很可能會使用參數,而不是像顯示的那樣在查詢中嵌入字符串文字。 –

+0

@ErenErsönmez我使用LinqPad來生成SQL語句,並向我展示了該語句。 – Moozz

回答

4

是不是它第一次運行時只需要150毫秒?每個連續的呼叫應該在你說的1ms左右。 LinqToSql必須先編譯查詢才能獲取SQL。 看看 LinqToSql Precompiling queries benefit?

+0

不,它每次運行時都是150ms。 – Moozz

+0

爲了更清楚起見,我跑了很多次,沒有重新啓動過程,第一次通話花了350ms,接下來的通話平均花費了150ms。 – Moozz

+0

我發現EF5會自動緩存查詢。 http://stackoverflow.com/questions/9739925/entity-framework-compiled-query – Moozz

0

此問題已無效。

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

花費的時間約爲150毫秒。但是,如果我試圖

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

花費的時間是回1ms的。我會相應地提出另一個問題。

+0

奇怪...如果你使用字符串uuid =「AB1-23456」; ? –

+0

@PaulZahra我試過了,但沒有什麼不同。 – Moozz

+0

你試過查詢表達式嗎?例如(從dbSet中的x,其中x.UserKey = uuid選擇x).SingleOrDefault();有什麼區別嗎? - 只是好奇。 –

相關問題