Почему запрос выходит за пределы рекурсии?

Ссылка скопирована
1 ответ

Есть фрагмент запроса, только он вытягивает данные и имеет рекурсию в функции F1.
Сам по себе фрагмент работает достаточно быстро и по тестам не выходит за ограничение в 10 рекурсий.
Но если его вставить в процедуру или функцию он начинает выходить за пределы 100 рекурсий, и работать почти бесконечно.
В чем может быть проблема?

SELECT * FROM V1 JOIN V2 ON V1.aunr = V2.aunr JOIN T1 ON T1.aunr = V2.aunr AND T1.a_typ = 'AU' JOIN V3 ON V3.verweis = V2.plan_id CROSS APPLY F1(V2.aunr) LEFT JOIN T2 ON T2.aunr_source = F1.aunr_source AND T2.aunr_new = F1.aunr_new OUTER APPLY F2(F1.aunr_source, T2.anr) JOIN T3 ON T3.auftrag_nr = F2.auftrag_nr AND T3.a_typ IN ('AG', 'SPL') JOIN V4 ON T3.user_n_07 = V4.verweis JOIN T4 ON T3.auftrag_nr = T4.auftrag_nr

SELECT * FROM V1 JOIN V2 ON V1.aunr = V2.aunr JOIN T1 ON T1.aunr = V2.aunr AND T1.a_typ = 'AU' JOIN V3 ON V3.verweis = V2.plan_id CROSS APPLY F1(V2.aunr) LEFT JOIN T2 ON T2.aunr_source = F1.aunr_source AND T2.aunr_new = F1.aunr_new OUTER APPLY F2(F1.aunr_source, T2.anr) JOIN T3 ON T3.auftrag_nr = F2.auftrag_nr AND T3.a_typ IN ('AG', 'SPL') JOIN V4 ON T3.user_n_07 = V4.verweis JOIN T4 ON T3.auftrag_nr = T4.auftrag_nr

Дополнительно:

Ну прям какое-то "у меня в подполе происходит стук"... вы правда думаете, что вот так, без исходного кода и вменяемого примера мы можем сказать что-то определённое?

если его вставить в процедуру или функцию он начинает выходить за пределы 100 рекурсий

Ну так. во-первых, ограничьте глубину рекурсии принудительно, во-вторых, добавьте в текст функции вывод в отдельную таблицу реперных значений, позволяющих понять, что дала очередная итерация и почему потребовалась следующая - и проанализируйте их при запуске отдельно и в процедуре при тех же исходных данных.

Akina:

добавьте в текст функции вывод в отдельную таблицу реперных значений, позволяющих понять, что дала очередная итерация и почему потребовалась следующая

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Никита Орлов Ответ

Проблема с выходом за пределы рекурсии может возникать по нескольким причинам. Рассмотрим наиболее распространенные из них:

1. Отсутствие базового случая: Рекурсивная функция должна содержать условие выхода из рекурсии, которое указывает, когда функция должна прекратить вызывать саму себя. Если базовый случай не определен или некорректно определен, функция может продолжать вызывать себя бесконечно, что приведет к переполнению стека.

2. Неправильное использование рекурсии: Иногда разработчики могут неправильно использовать рекурсию, вызывая функцию с неправильными параметрами или не учитывая все варианты выхода из рекурсии. Например, некорректное уменьшение параметра, который должен приближаться к базовому случаю, может привести к бесконечному вызову функции.

3. Слишком большая глубина рекурсии: Если рекурсивная функция вызывается слишком много раз, это может привести к переполнению стека из-за ограничений на глубину вызовов функций в языке программирования.

Для предотвращения выхода за пределы рекурсии необходимо внимательно следить за определением базового случая, правильно использовать рекурсию и контролировать глубину вызовов функций. Также можно использовать циклы вместо рекурсии там, где это возможно, чтобы избежать проблем с переполнением стека.

Пример использования рекурсии на языке PHP:

function factorial($n) {
    if ($n == 0) {
        return 1; // базовый случай
    } else {
        return $n * factorial($n - 1); // рекурсивный вызов
    }
}
echo factorial(5); // Выведет 120

function factorial($n) { if ($n == 0) { return 1; // базовый случай } else { return $n * factorial($n - 1); // рекурсивный вызов } } echo factorial(5); // Выведет 120

Если вы столкнулись с проблемой выхода за пределы рекурсии, рекомендуется внимательно проверить вашу рекурсивную функцию на наличие указанных выше причин и внести необходимые исправления для избежания данной проблемы.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно