【发布时间】:2022-09-23 06:43:39
【问题描述】:
有问题的表有 ~30mio 记录。使用实体框架,我编写了一个 LINQ 查询,如下所示:
dbContext.MyTable.FirstOrDefault(t => t.Col3 == \"BQJCRHHNABKAKU-KBQPJGBKSA-N\");
Devart DotConnect for Oracle 生成:
SELECT
Extent1.COL1,
Extent1.COL2,
Extent1.COL3
FROM MY_TABLE Extent1
WHERE (Extent1.COL3 = :p__linq__0) OR ((Extent1.COL3 IS NULL) AND (:p__linq__0 IS NULL))
FETCH FIRST 1 ROWS ONLY
查询大约需要四分钟,显然是全表扫描。
但是,手工制作这个 SQL:
SELECT
Extent1.COL1,
Extent1.COL2,
Extent1.COL3
FROM MY_TABLE Extent1
WHERE Extent1.COL3 = :p__linq__0
FETCH FIRST 1 ROWS ONLY
在 200 毫秒内返回预期的匹配。
问:为什么会这样?我希望查询优化器注意到如果参数不为空,则右侧部分为假,那么为什么第一个查询没有命中索引?
-
你能展示解释计划吗?
标签: oracle entity-framework devart