【发布时间】:2021-06-09 20:53:00
【问题描述】:
我有以下 DB2 存储过程,它允许用户指定可变数量的参数(为他们不想提供的参数指定 NULL),其中每个参数都可用于过滤 WHERE 子句中的记录。
CREATE PROCEDURE XX.DUMMY(IN I_FIRST_NAME VARCHAR(32),
I_LAST_NAME VARCHAR(100),
I_COMPANY_NAME VARCHAR(100))
SPECIFIC XX.DUMMY
RESULT SETS 1
MODIFIES SQL DATA
NOT DETERMINISTIC
NULL CALL
LANGUAGE SQL EXTERNAL ACTION
INHERIT SPECIAL REGISTERS
BEGIN
DECLARE RESULTS CURSOR WITH RETURN TO CLIENT FOR
WITH RELEVANT_RECORDS (RECORD_ID) AS (
SELECT RECORD_ID
FROM XX.RECORDS R
WHERE (I_FIRST_NAME IS NULL OR R.SEARCH_FIRST_NAME = I_FIRST_NAME)
AND (I_LAST_NAME IS NULL OR R.SEARCH_LAST_NAME = I_LAST_NAME)
AND (I_COMPANY_NAME IS NULL OR R.SEARCH_COMPANY_NAME = I_COMPANY_NAME)
WITH UR
)
SELECT RR.RECORD_ID, RD.*
FROM RELEVANT_RECORDS RR
JOIN XX.RECORD_DETAILS RD ON RD.RECORD_ID = RR.RECORD_ID
FOR READ ONLY WITH UR;
OPEN RESULTS;
END
;
据我了解,此过程将执行得很差,因为该过程的查询计划只会在该过程被绑定(或第一次运行?)时进行评估,如果在以后的执行中指定了不同的参数组合,原始查询计划将被使用,导致使用错误的计划/索引(从而使 proc 非常慢)。
我读到 SQL Server 允许您在过程的定义中指定 OPTION(RECOMPILE) 以告诉服务器为过程的每次执行重新评估查询计划,但是由于我使用的是 DB2,所以我正在寻找对于 DB2 等价物。
在 DB2 中有没有一种方法可以让存储过程在每次执行时重新评估它的查询计划?在运行任何语句之前,我是否必须在我的过程中使用 SET CURRENT QUERY OPTIMIZATION 之类的东西?
【问题讨论】:
标签: sql performance stored-procedures db2 query-optimization