7

这是我的设置:

  • 在 .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 来完成任务。

作为一种解决方法,我使用OracleCommandODP.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 让事情变慢了这么多,当我什至没有访问这个左连接查询时?

4

4 回答 4

6

用 . 包装您的输入参数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

于 2014-09-18T20:56:42.873 回答
2

我们遇到了类似的性能问题。感谢@CameronP 建议使用 EntityFunctions.AsNonUnicode,它解决了性能问题。我们的项目使用 EF6 和 Oracle 12.1* 托管数据访问。我们没有对每个 EF 查询参数进行更改,而是在实体模型上使用了 TypeName 属性,它起作用了!

Public Class Table1
    <Column("COLUMN_1", TypeName:="VARCHAR2")>
    Public Property Column1 As String
End Class 
于 2017-02-01T19:28:40.900 回答
1

另一个解决方案是更新您的预言机提供商!Odac 12c 修复了这个问题:https ://community.oracle.com/message/11065799#11065799

它将阻止您使用 EntityFunctions.AsNonUnicode() 更改所有查询

于 2016-12-08T13:18:21.623 回答
-2

另一个技巧是禁用延迟加载。

如果可以禁用,请执行此操作。

无法禁用延迟加载的示例:

当您有一个名为“客户”的表时。然后,当你调用这样的东西时:

var obj = myCustomerList.FirstOrDefault().ORDERS.ToList()

如果您有访问儿童的代码,则无法禁用延迟加载

于 2016-04-19T19:07:07.050 回答