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

前端之家收集整理的这篇文章主要介绍了c# – 使用Entity Framework进行Oracle查询的速度非常慢前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的设置:

>在.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

猜你在找的C#相关文章