select * from FOO.MBR_DETAILS where BAR= 'BAZ' and MBR_No = '123'
执行时间= 0.25秒
CREATE PROCEDURE My.MEMBER_SEARCH
(
i_BAR varchar(3),
i_member_surname varchar(50),
i_member_code varchar(10),
i_member_given_name varchar(50)
)
RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE c1 cursor with return for
select *
FROM FOO.MBR_DETAILS m
WHERE
BAR= i_BAR
and (i_member_code = '' or m.MBR_No = i_member_code)
and (i_member_surname = '' or m.surname = i_member_surname)
and (i_member_given_name = '' or m.given_names LIKE '%'||i_member_given_name||'%');
OPEN c1;
END
call My.MEMBER_SEARCH('BAZ','','123','')
执行时间= 1.9秒
我认为两个查询的时间应该与i_member_surname相同,而i_member_given_name都是空的,不会被评估。
答案 0 :(得分:3)
解决方案是为任何运行灵活的参数驱动搜索的存储过程启用REOPT ALWAYS。
REOPT ALWAYS选项将强制优化器分析输入参数值,并在每次执行过程时提出新的访问计划,而不是在编译过程时只进行一次。虽然REOPT总是为每次执行存储过程增加额外的毫秒优化器开销,但这很可能比继续重用优化器在初始编译存储过程时所猜测的一刀切的访问计划更快