Sql 参数的where子句中是否有替换NVL的选项

Sql 参数的where子句中是否有替换NVL的选项,sql,oracle,performance,Sql,Oracle,Performance,我一直在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

我一直在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
当然可以:

在哪里
(f_date>=:f_date_FROM或:f_date_FROM为空)和

(f_date查询正在做不同的事情。如果许多数据值都是
NULL
,那么包含这些值将对性能产生很大影响。如果列值为NULL,结果会是什么?如果要包含它,可以将条件重构为
(列为NULL或列=nvl(列,参数))
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
  ...