小编Mik*_*ila的帖子

实体框架5和Oracle:在查询非唯一索引字段时,带有影响性能的闭包表达式

我对Entity Framework 5和Oracle DB存在性能问题.

我有一个简单的SQL选择: SELECT * FROM NOTE WHERE NOTENUMBER = '1A23456'

NOTENUMBER 包含在名为NOTE的表的索引中,但该字段不是主键/唯一.

  • 当我使用Oracle SQL Developer执行语句时,结果很快返回,查询计划显示正在使用RANGE SCAN.

  • 当我使用Entity Framework时,生成的SQL需要更长的时间(5秒对30ms).

  • 当我使用Entity Framework并使用主键字段(NOTE_KEY)进行查询时,结果会像SQL Developer一样快速返回.

我怀疑有两件事:

  • EF和Oracle.DataAccess-provider存在一些问题,没有使用可用的非唯一索引.如果我有Entity Framework 5的调试符号会有所帮助,但我无法在任何地方找到它们.

  • 性能问题在EF的某个地方,关于闭包和/或我在EF中使用通用存储库模式的方式:

    如果我像这样调用我的存储库:
    var notenumber = "1A23456";
    var notes = repository.All(n => n.NOTENUMBER == notenumber).ToList();
    谓词在方法All中出现:
    {n => (n.NOTE == value(Tester.Program+<>c__DisplayClass0).notenumber)}
    并且EfProf-profiler将生成的SQL跟踪为:

    SELECT "Extent1"."NOTE_KEY" AS "NOTE_KEY",
    "Extent1"."NOTENUMBER" AS "NOTENUMBER",
    "Extent1"."NOTETEXT" AS "NOTETEXT",
    FROM "NOTE_DBA"."NOTE" "Extent1"
    WHERE ("Extent1"."NOTENUMBER" = '1PSA0500237500' /* @p__linq__0 */)

    查询需要大约5500毫秒.


    另一方面,如果我像这样调用我的存储库:
    var notes = …

oracle performance entity-framework repository-pattern

4
推荐指数
1
解决办法
1950
查看次数