【发布时间】:2015-03-07 12:10:02
【问题描述】:
我想从一个视图中查询数据,这是一个包含 583,000 条记录的表的视图。 所以我写了一个简单的查询来像这样从视图中查询
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 毫秒,下一次调用平均花了我 150 毫秒 这个查询太慢了,所以我把查询改成这样
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 次 第一次通话花费了我 40 毫秒,接下来的通话平均只花费了我 1 毫秒!
有人知道我做错了什么吗?
环境
- 实体框架 5.0
- Oracle 11g 数据库
- ODP.NET 11.2 第 3 版
- .NET Framework 4.5
【问题讨论】:
-
这是可重现的吗?如果您先使用新查询发送查询会发生什么?生成的查询会很快吗?
-
我非常怀疑您的“生成的 sql”是否在此处准确表示。 EF 很可能会使用参数,而不是像您显示的那样在查询中嵌入字符串文字。
-
@ErenErsönmez 我使用 LinqPad 生成 SQL 语句,它向我展示了该语句。
-
@nvoigt 我试过以不同的顺序调用这两个查询,结果还是一样。
-
您是否从 LinqPad 获得这些时间结果?因为如果您使用的是 LinqPad,我认为您的 linq 查询不会被缓存。因此,实际上运行多少次并不重要(除了可能在数据库端缓存查询计划)。
标签: c# sql entity-framework oracle11g