为什么 SqlQuery 比在视图上使用 LINQ 表达式快很多?
Why is SqlQuery a lot faster than using LINQ expression on views?
我想从一个视图中查询数据,这是一个table的视图,包含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次。
第一个电话花了我 350ms,下一个电话平均花了我 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 Framework 4.5
第一次运行是不是只需要150毫秒?每次连续通话都应该花费您所说的 1 毫秒左右。 LinqToSql 必须先编译查询以获得 SQL。
看一眼
LinqToSql Precompiling queries benefit?
这个问题不再有效。
var uuid = "AB1-23456";
dbSet.SingleOrDefault(x => x.UserKey == uuid);
花费的时间约为150ms。但是如果我尝试
dbSet.SingleOrDefault(x => x.UserKey == "AB1-23456");
耗时又回到了1ms。我会相应地问另一个问题。
这是对这个问题的最佳回答。
我想从一个视图中查询数据,这是一个table的视图,包含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次。 第一个电话花了我 350ms,下一个电话平均花了我 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 Framework 4.5
第一次运行是不是只需要150毫秒?每次连续通话都应该花费您所说的 1 毫秒左右。 LinqToSql 必须先编译查询以获得 SQL。 看一眼 LinqToSql Precompiling queries benefit?
这个问题不再有效。
var uuid = "AB1-23456";
dbSet.SingleOrDefault(x => x.UserKey == uuid);
花费的时间约为150ms。但是如果我尝试
dbSet.SingleOrDefault(x => x.UserKey == "AB1-23456");
耗时又回到了1ms。我会相应地问另一个问题。
这是对这个问题的最佳回答。