【问题标题】:Entity Framework query slow if parameters are passed in Oracle如果在 Oracle 中传递参数,实体框架查询会变慢
【发布时间】:2019-12-19 04:13:11
【问题描述】:

这是我的查询,执行大约需要 15 秒。该表在REQID上有一个索引

var tls = (from tradelines in _context.TRADELINEs
    where tradelines.REQID == requestId 
    select tradelines).ToList();

型号:

[StringLength(36)]
[Column(TypeName = "char")]
public string REQID { get; set; }

REQID 的 Oracle Db 类型为 CHAR(36 BYTE)

如果我使用硬编码字符串执行相同的查询,它会在大约 1 秒内返回数据。

var tls = (from tradelines in _context.TRADELINEs
    where tradelines.REQID == "2435d403-0beb-416f-a536-0df4e2fcc03f"
    select tradelines).ToList();

我已经尝试过这种方法:

EntityFunctions.AsNonUnicode(requestId)

仍然没有运气。知道我在这里缺少什么吗?

这样做:

[StringLength(36)]
[Column(TypeName = "varchar")]
public string REQID { get; set; }

抛出一个错误说

在 OracleEFProvider 中找不到存储类型“varchar” 提供者清单

另外,如果我添加,执行时间没有变化

[Column(TypeName = "varchar2")]

EF 日志查询:

SELECT
    // Column List
FROM "TRADELINE" "Extent1"
WHERE (("Extent1"."REQID" = :p__linq__0) OR (("Extent1"."REQID" IS NULL) AND (:p__linq__0 IS NULL)))

-- p__linq__0: '2435d403-0beb-416f-a536-0df4e2fcc03f' (Type = Object)

我想知道为什么它会为string 参数生成(Type = Object)

现在,这很有趣:

同一张表中还有一列,结构如下,

[StringLength(36)]
[Column(TypeName = "char")]
public string ID { get; set; }

此列具有数据类型为CHAR(36 BYTE) 的主键。如果我在此列上应用 where 条件并指定参数值,则只需几毫秒即可执行。 IDREQID 之间的唯一区别是 REQID 允许为空。

【问题讨论】:

  • 试试[Column(TypeName="varchar")]
  • 追踪 EF 流量,或查看 Oracle 查询计划。通常发生这种情况是因为参数和表之间的数据类型不匹配导致表端转换。在 LINQ 中使用字符串文字时,EF 不会生成参数。正如@Train 建议的那样,尝试varcharvarchar2 作为ColumnAttribute。
  • 如果我这样做 varchar 它会给我一个例外,varchar2 根本不会提高性能。
  • 你试过设置UseDatabaseNullSemantics吗?看到这个帖子:stackoverflow.com/questions/38433594/…
  • @Collen:成功了!请将其发布为答案。

标签: c# oracle entity-framework


【解决方案1】:

取自this answer...

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.UseDatabaseNullSemantics = true;
    }
}

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多