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

c# – 使用Entity Framework进行Oracle查询的速度非常慢

发布时间:2020-12-15 08:41:44 所属栏目:百科 来源:网络整理
导读:这是我的设置: 在.NET 4.0上编译(我不能高于此) 对Oracle 11gR2数据库使用EntityFramework 使用ODP.NET 11.2.0.3.20 使用Visual Studio 2012 Ultimate和Oracle Developer Tools for Visual Studio 11.2.0.3.20 使用LINQ to Entity执行查询 所以这就是我的问
这是我的设置:

>在.NET 4.0上编译(我不能高于此)
>对Oracle 11gR2数据库使用EntityFramework
>使用ODP.NET 11.2.0.3.20
>使用Visual Studio 2012 Ultimate和Oracle Developer Tools for Visual Studio 11.2.0.3.20
>使用LINQ to Entity执行查询

所以这就是我的问题:我使用Oracle Developer Tools for Visual Studio(11.2.0.3.20)创建了一些实体.一些实体很快就会返回结果.但是,对于查询包含超过2000万条记录的视图/表的其他人,对于这个简单的查询,一直需要10分钟才能返回结果(我已通过单元测试验证了这一次):

var member = (from m in context.Members
              where m.MemberID.Equals(memberId,StringComparison.OrdinalIgnoreCase)
              select m).FirstOrDefault();

我以前使用Devart dotConnect for Oracle非常好用……但是我的公司没有更新这个产品的许可证,并告诉我使用新的Oracle Developer Tools for Visual Studio来完成任务.

作为一种解决方法,我使用ODP.NET(Oracle.DataAccess.dll)提供的OracleCommand直接连接到数据库,我在不到一秒的时间内得到了结果.与使用管理客户端直接对数据库执行其他查询相同.

关于为什么会发生这种情况我最好的猜测是,Entity可能正在将整个数据库加载到内存中,然后在其上运行我的查询…这将是可怕的,但我真的不相信这是正在发生的事情.

有人可以解释为什么会发生这种情况以及我如何使用Entity修复它以便我不必手动重写所有数据库查询?

更新:

所以我找到了我的查询需要10分钟才能完成的原因.我(我对数据库的经验很少)把它放在我的EDMX文件中:

...
<EntityContainer Name="MyStoreContainer">
  <EntitySet Name="MY_TABLE" EntityType="MyDB.Store.MY_TABLE" store:Type="Views" store:Schema="MYUSERNAME" store:Name="MY_TABLE">
    <DefiningQuery>
      SELECT
      "MY_TABLE"."COL1" AS "COL1","MY_TABLE"."COL2" AS "COL2","MY_TABLE"."COL3" AS "COL3","MY_TABLE"."COL4" AS "COL4","MY_TABLE"."COL5" AS "COL5","MY_TABLE"."COL6" AS "COL6","MY_TABLE"."MEMBERSHIP_ID" AS "MEMBERSHIP_ID","MEMBERS"."EXTRA_INFO1" AS "EXTRA_INFO1","MEMBERS"."EXTRA_INFO2" AS "EXTRA_INFO2"
      FROM "MYUSERNAME"."MY_TABLE" "MY_TABLE"
      LEFT JOIN "MYUSERNAME"."MEMBERS" ON "MY_TABLE"."MEMBERSHIP_ID" = "MEMBERS"."MEMBER_ID"
    </DefiningQuery>
  </EntitySet>
...

事实证明,直接查询管理客户端时,LEFT JOIN大约需要10分钟.所以我把LEFT JOIN拿出来……现在我看到了速度的提高.这是捕获,这个EntitySet不是我在查询时反应非常慢的EntitySet.如果我用OracleCommand手动编写代码,我仍会得到大约4-5倍的响应.

任何人都可以解释为什么实体正在减慢这么多,当我甚至没有访问这个左连接查询?

解决方法

使用EntityFunctions.AsNonUnicode(memberId)包装输入参数.
var member = (from m in context.Members
          where m.MemberID.Equals(EntityFunctions.AsNonUnicode(memberId),StringComparison.OrdinalIgnoreCase)
          select m).FirstOrDefault();

见https://community.oracle.com/message/10725648

(编辑:李大同)

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

    推荐文章
      热点阅读