这是我的设置:
- 在 .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 来完成任务。
作为一种解决方法,我使用OracleCommand
ODP.NET (Oracle.DataAccess.dll) 提供的直接连接到数据库,并在不到一秒的时间内得到结果。与使用管理客户端直接对数据库执行其他查询相同。
关于为什么会发生这种情况,我最好的猜测是,也许 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
.
任何人都可以解释为什么 Entity 让事情变慢了这么多,当我什至没有访问这个左连接查询时?