2012-06-28 104 views
0
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都是空的,他们就不会被消除。

回答

3

解决方案是为任何运行灵活的参数驱动的搜索的存储过程启用REOPT ALWAYS。

REOPT ALWAYS选项将强制优化器分析输入参数值,并在每次执行过程时提出一个新的访问计划,而不是仅在编译过程时执行一次。尽管REOPT ALWAYS为存储过程的每次执行都增加了几毫秒的优化器开销,但这最有可能比连续重用优化器在初始编译存储过程时所猜测的“全尺寸适用所有”访问计划更快。