У меня есть следующая хранимая процедура 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
;
Насколько я понимаю, эта процедура будет работать очень плохо, потому что план запроса процедуры будет оцениваться только тогда, когда процедура связана (или запущена в первый раз?), где, если в более поздних запусках указаны разные комбинации параметров, исходный план запроса будет используется, что приводит к использованию неправильного плана/индекса (что делает процесс очень медленным).
Я читал, что SQL Server позволяет указать OPTION(RECOMPILE)
в определении процедуры, чтобы указать серверу переоценивать план(ы) запроса для каждого выполнения процедуры, однако, поскольку я использую DB2, я ищу эквивалент DB2.
Есть ли способ в DB2, с помощью которого вы можете указать хранимой процедуре переоценивать свой план запроса при каждом выполнении? Должен ли я использовать что-то вроде SET CURRENT QUERY OPTIMIZATION
внутри моей процедуры перед выполнением каких-либо операторов?