>在.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倍的响应.
任何人都可以解释为什么实体正在减慢这么多,当我甚至没有访问这个左连接查询?
解决方法
var member = (from m in context.Members where m.MemberID.Equals(EntityFunctions.AsNonUnicode(memberId),StringComparison.OrdinalIgnoreCase) select m).FirstOrDefault();