不管输入什么,查询都必须只有一个执行计划。因此,如果将参数传递 in_id
为NULL,则应该返回所有行。如果传递非NULLin_id
,则应仅返回单个PK值。
因此,Oracle选择了“最糟糕的”执行程序。计划应对“最坏的情况”。“通用”查询是通向地狱的道路。只需将查询分为两个即可。
select col1, col2, col3
from table1 tab
where in_id is null or in_id is not null;
select col1, col2, col3
from table1 tab
where tab.id = in_id; -- tab.id is the PK