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

4

1 回答 1

3

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

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

于 2012-06-28T03:31:55.003 回答