【发布时间】:2015-04-14 14:42:27
【问题描述】:
我对一个执行速度非常慢的存储过程有点卡住了。存储过程基本上包含一个使用传入参数 (in_id) 的查询,并像这样放在游标中:
open tmp_cursor for
select col1, col2, col3
from table1 tab
where ((in_id is null) or (tab.id = in_id)); -- tab.id is the PK
当我使用预定义的值分别获得 SQL 查询的执行计划时,我使用索引的查询得到了很好的结果。但是,当我从我的应用程序中调用该过程时,我发现没有使用任何索引,并且该表被完全扫描,从而导致性能下降。
如果我删除 WHERE 子句“(in_id is null)”的第一部分,应用程序的性能又会很快。
为什么在我的应用程序调用期间没有使用索引(传入了in_id)?
【问题讨论】:
-
如果查询假设在传入参数为空或匹配表 ID 的情况下返回数据,那么执行 if/else 语句是否会更好,如果它为空则它将运行不带 where 子句的查询,否则它将只使用表 ID 条件运行?
标签: sql oracle sql-execution-plan