存储的Proc性能很慢

时间:2012-06-28 00:13:17

标签: database db2 database-performance

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都是空的,不会被评估。

1 个答案:

答案 0 :(得分:3)

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

REOPT ALWAYS选项将强制优化器分析输入参数值,并在每次执行过程时提出新的访问计划,而不是在编译过程时只进行一次。虽然REOPT总是为每次执行存储过程增加额外的毫秒优化器开销,但这很可能比继续重用优化器在初始编译存储过程时所猜测的一刀切的访问计划更快