我想從一個視圖查詢數據,這是一個包含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
這是可重現的嗎?如果您首先使用新查詢發送查詢,會發生什麼情況?生成的查詢會是最快的嗎? – nvoigt
我非常懷疑你的「生成的sql」在這裏被準確地表示出來。 EF很可能會使用參數,而不是像顯示的那樣在查詢中嵌入字符串文字。 –
@ErenErsönmez我使用LinqPad來生成SQL語句,並向我展示了該語句。 – Moozz