Для отчета мне пришлось написать рекурсивную хранимую процедуру GET_RECIPE_STEPS_ID(recipe_id)
.Он возвращает идентификаторы шагов, которые имеют тип рецепта.IE
SELECT GET_RECIPE_STEPS_ID.ID FROM GET_RECIPE_STEPS_ID(3189)
It Returns
3189
3190
3191
3192
Когда я запускаю его самостоятельно, это быстро (например, время выполнения 0,031 сек).Но если он будет использоваться с предложением IN в запросе, это займет много лет.Как и следующий запрос, занял почти 12 минут.
SELECT rs.RECIPEID
FROM RECIPESTEPS rs
WHERE rs.RECIPEID IN (select GET_RECIPE_STEPS_ID.ID from GET_RECIPE_STEPS_ID(3189))
Что эквивалентно следующему запросу и почти так же быстро, как сама хранимая процедура (0,038 с)
Select rs.RECIPEID
FROM RECIPESTEPS rs
WHERE rs.RECIPEID IN (3189, 3190, 3191, 3192)
Хранимая процедура
CREATE OR ALTER PROCEDURE GET_RECIPE_STEPS_ID
(recipe_id integer)
RETURNS
(id integer)
AS
declare variable coType integer;
BEGIN
/* Recursive Procedure
* For Passed Recipe 'Recipe_id', it Returns the step's which are of type Recipe again.
*
* If any step is of type Recipe(i.e COTYPE = 1)
* Then it calls itself again for that step(Recipe)
*/
id =: recipe_id;
SUSPEND;
FOR SELECT rs.COMMODITYID, c.COTYPE
FROM RECIPESTEPS rs
LEFT JOIN COMMODITIES c ON c.COMMODITYID = rs.COMMODITYID
WHERE rs.RECIPEID =: recipe_id INTO :id, :coType
Do
BEGIN
IF(coType = 1)
THEN
FOR SELECT r.RECIPEID FROM RECIPES r WHERE r.LATEST = 1 AND r.COMMODITYID =:id into :id
DO
BEGIN
FOR SELECT GET_RECIPE_STEPS_ID.ID
FROM GET_RECIPE_STEPS_ID(:id) INTO :id
DO
BEGIN
SUSPEND;
END
END
END
END^