【发布时间】:2021-11-14 11:29:17
【问题描述】:
为什么以下非常相似的查询会产生截然不同的计划?
查询 1
SELECT *
FROM ACTORREPORTADO_RIESGO ars1
WHERE ars1.fechariesgo =
( SELECT MAX(fechariesgo) FROM actorreportado_riesgo ars2
WHERE ars2.idactorreportado=ars1.idactorreportado
)
AND COALESCE(nivelriesgo,' ') NOT IN ('N',' ') this is the line diff
查询 2
SELECT *
FROM ACTORREPORTADO_RIESGO ars1
WHERE ars1.fechariesgo =
( SELECT MAX(fechariesgo) FROM actorreportado_riesgo ars2
WHERE ars2.idactorreportado=ars1.idactorreportado
)
AND nivelriesgo NOT IN ('N',' '); -- this is the line diff
表格有 15 行
CREATE TABLE ACTORREPORTADO_RIESGO (
IDACTORREPORTADO NUMBER(17) NOT NULL,
FECHARIESGO DATE NOT NULL,
NIVELRIESGO VARCHAR2(10),
USUARIORIESGO VARCHAR2(50),
OBSERVACIONES VARCHAR2(500),
CONSTRAINT PK_ACTORREPORTADO_RIESGO PRIMARY KEY (IDACTORREPORTADO, FECHARIESGO)
)
【问题讨论】:
-
查询在逻辑上是等价的。然而,虽然这对于合格的程序员来说可能(应该是!)显而易见,但对优化器来说并不明显。优化器必须分析
coalesce的第二个参数,注意它是一个文字,然后检查NOT IN列表中的值,并注意到相同的文字出现在列表中,因此可以转换第一个查询进入第二个,计划更便宜。这对优化器要求太多了。最好我们自己编写更简单、更高效的查询。