加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

实体框架5和Oracle:在查询非独一索引字段时,带有封锁影响机能的

发布时间:2021-01-22 21:33:08 所属栏目:站长百科 来源:网络整理
导读:我对Entity Framework 5和Oracle DB存在机能题目. 我有一个简朴的SQL选择:SELECT * FROM NOTE WHERE NOTENUMBER =’1A23456′ NOTENUMBER包括在名为NOTE的表的索引中,但该字段不是主键/独一. 当我行使Oracle SQL Developer执行语句时,返回功效 快速和查询计

我对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”,
FROM“NOTE_DBA”.“NOTE”“Extent1”
WHERE(‘1PSA0500237500’=“Extent1”.“NOTENUMBER”)

查询必要约莫30ms.

以是独一的区别是WHERE子句中前提的次序,以及后者好像没有EF替代参数的究竟.

我行使VS2010和.NET4,并参考EF5(v4.4.0.0).
存储库的All-method是:

public IQueryable<NOTE> All(Expression<Func<NOTE,bool>> predicate = null)
{
    var setOfNotes = GetDbSet<NOTE>();
    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’参数?

办理要领

我碰着了相同的题目.在我的环境下没有行使索引的缘故起因是我从.NET转达一个字符串(unicode)作为参数.将其与非unicode数据库字段举办较量.

办理方案是在将字符串参数转达给非unicode之前将其转达给where子句:

using System.Data.Objects;

EntityFunctions.AsNonUnicode( myUnicodeParam)

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读