【问题标题】:Is there any option to replace NVL in where clause for parameter是否有任何选项可以在参数的 where 子句中替换 NVL
【发布时间】: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


【解决方案1】:

当然:

WHERE 
  (f_date >= :F_DATE_FROM OR :F_DATE_FROM IS NULL) AND
  (f_date <= :F_DATE_TO OR :F_DATE_TO IS NULL) AND
  ...

虽然我不确定它会实现多少性能改进。如果您的查询专门针对性能,请提出一个包含查询计划的问题

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多