Oracle 唯一索引 字段太多,实体框架5和Oracle:在查询非唯一索引字段时,带有关闭影响性能的表达式...

我对Entity Framework 5和Oracle DB存在性能问题.

我有一个简单的SQL选择:SELECT * FROM NOTE WHERE NOTENUMBER =’1A23456′

NOTENUMBER包含在名为NOTE的表的索引中,但该字段不是主键/唯一.

>当我使用Oracle SQL Developer执行语句时,返回结果

快速和查询计划显示正在使用RANGE SCAN

应该.

>当我使用Entity Framework时,生成的SQL需要很多

更长(5秒对30ms).

>当我使用Entity Framework和查询时

使用主键字段(NOTE_KEY),结果的返回速度与SQL一样快

开发人员.

我怀疑有两件事:

> EF和Oracle.DataAccess-provider存在一些问题,没有使用可用的非唯一索引.如果我有Entity Framework 5的调试符号会有所帮助,但我无法在任何地方找到它们.

>性能问题在EF的某个地方,关于闭包和/或我在EF中使用通用存储库模式的方式:

如果我这样调用我的存储库:

var notenumber =“1A23456”;

var notes = repository.All(n => n.NOTENUMBER == notenumber).ToList();

谓词来自All as:

{n => (n.NOTE == value(Tester.Program<> c__DisplayClass0).notenumber)}

并且EfProf-profiler将生成的SQL跟踪为:

选择“Extent1”.“NOTE_KEY”AS“NOTE_KEY”,

“Extent1”.“NOTENUMBER”为“NOTENUMBER”,

“Extent1”.“NOTETEXT”作为“NOTETEXT”,

FROM“NOTE_DBA”.“NOTE”“Extent1”

WHERE(“Extent1”.“NOTENUMBER”=’1PSA0500237500’/ * @ p__linq__0 * /)

查询需要大约5500毫秒.

另一方面,如果我像这样调用我的存储库:

var notes = repository.All(n => n.NOTENUMBER ==“1A23456”).ToList();

那么谓词就是:

{n => (n.NOTENUMBER ==“1A23456”)}

并且EfProf-profiler将生成的SQL跟踪为:

选择“Extent1”.“NOTE_KEY”AS“NOTE_KEY”,

“Extent1”.“NOTENUMBER”为“NOTENUMBER”,

“Extent1”.“NOTETEXT”作为“NOTETEXT”,

FROM“NOTE_DBA”.“NOTE”“Extent1”

WHERE(‘1PSA0500237500’=“Extent1”.“NOTENUMBER”)

查询需要大约30ms.

所以唯一的区别是WHERE子句中条件的顺序,以及后者似乎没有EF替换参数的事实.

我使用VS2010和.NET4,并参考EF5(v4.4.0.0).

存储库的All-method是:

public IQueryable All(Expression> predicate = null)

{

var setOfNotes = GetDbSet();

var notesQuery = from note in setOfNotes select note;

if (predicate != null)

{

notesQuery = notesQuery.Where(predicate);

}

return notesQuery;

}

我尝试创建CompiledQuery,我尝试使用setOfNotes.AsNoTracking(),我尝试使用.NET 4.5 – 性能没有差异.

我能够快速获得这个特定查询的一种方法是使用Oracle的基本.NET数据提供程序(ODB.NET)并手动构建查询,但我宁愿不坚持使用该解决方案.同样,如果我在where子句中使用主要字段,即使使用EF和相同的All-method,查询也很快.

所以问题似乎在EF的某个地方.如果我只有EntityFramework.dll的符号,我觉得可以找到更多.

EF调用谓词的方式会有问题吗?如何在EF中替换’@p_linq_0’参数?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值