【发布时间】:2021-08-20 07:54:10
【问题描述】:
我一直在我的 WHERE 子句中使用 NVL,它到目前为止运行良好。 但是在这种情况下,列有 NULL 值并且参数也为 NULL,它没有返回任何查询。
select * from Table
where
f_date BETWEEN NVL(:F_DATE_FROM,F_DATE) AND NVL(:F_DATE_TO,F_DATE)
AND op_code = NVL(:CODE, OP_CODE)
AND T_CBC = NVL(:TO_CBC,T_CBC)
order by fiscal_date desc
我更新了如下查询,它按预期返回了所有记录。但是,执行查询花费的时间太长。原始查询耗时 1.5 分钟,新查询耗时 7 分钟。请问有什么方法可以微调下面的查询吗?
select * from Table
where
f_date BETWEEN NVL(:F_DATE_FROM,F_DATE) AND NVL(:F_DATE_TO,F_DATE)
AND (OP_CODE = :CODE or :CODE is null)
AND (T_CBC = :TO_CBC or :TO_CBC is null)
order by fiscal_date desc
【问题讨论】:
-
查询在做不同的事情。如果很多数据值都是
NULL,那么包含这些值会对性能产生很大影响。 -
如果列值为NULL应该是什么结果?如果你想包含它,你可以将你的条件重构为
(column IS NULL or column = nvl(column, param))
标签: sql oracle performance