Sql 参数的where子句中是否有替换NVL的选项
我一直在WHERE子句中使用NVL,至今效果良好。 但在这种情况下,如果列的值为NULL,并且参数也为NULL,则不会返回任何查询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
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
...