Как изменить общесистемное значение по умолчанию MAXRECURSION
?
По умолчанию это 100, но мне нужно увеличить его до 1000.
Я не могу использовать подсказки запроса, так как я использую программу, которая принимает мой запрос и выполняет его для меня, и я, к сожалению, не могу обойти это ограничение.
Тем не менее, у меня есть права администратора на экземпляре сервера. Я копался в аспектах сервера, но не вижу там ничего, связанного с параметрами запроса или рекурсией. Я предполагаю, что где-то должно быть место, где я могу обновить общесистемные настройки по умолчанию.
Есть идеи?
sql-server
configuration
recursive
carl.anderson
источник
источник
Ответы:
Если ваши запросы имеют общую форму, вы можете добавить необходимую подсказку maxrecursion, используя одно или несколько указаний плана.
Там может быть ловкость, чтобы получить их правильно. Если вы добавите конкретные детали запроса в свой вопрос, мы сможем решить эту проблему для вас. Как правило, вы отслеживаете SQL- запрос , фактически попадающий на сервер, или получаете параметризованную форму, используя встроенную процедуру sys.sp_get_query_template , а затем создаете руководство плана TEMPLATE и / или OBJECT / SQL.
См. Документацию для получения дополнительной информации:
Руководства по планированию должны будут проходить повторную проверку всякий раз, когда изменяется код приложения, а также когда исправляется или обновляется SQL Server. Это должно быть просто частью вашего обычного цикла тестирования.
Обратите внимание, что проверка руководства плана с использованием sys.fn_validate_plan_guide может некорректно сообщать об ошибке, если инструкция направляет временную таблицу. Смотрите этот вопрос:
Проверка руководства плана с помощью fn_validate_plan_guide дает ложные срабатывания
Классы « Руководство по плану» и « Руководство по плану» Классы « Неудачный профилировщик» и «Расширенные события» также можно использовать для мониторинга приложений «Руководство по плану».
Connect был удален до того, как было реализовано предложение по улучшению продукта: допустимые предельные значения MAXRECURSION, отличные от 100, для представлений и пользовательских функций Стивом Кассом . Если вы хотите обсудить это с Microsoft сейчас, ознакомьтесь с параметрами справки и отзывами по SQL Server .
источник
Если вам абсолютно необходимо использовать функцию (как вы подразумеваете, это ограничение вашего ETL-инструмента), вы можете указать ее
OPTION
как часть табличной функции с несколькими утверждениями, например что-то вроде этого:Это также сработало для меня, когда обернулось в представление, как вы предлагаете ваши инструменты ETL. Нет никакого способа изменить это в масштабе всей системы, но поскольку рекурсия может быть неэффективной, это, вероятно, хорошая вещь. Вы не можете указать подсказку запроса (используя
OPTION
) в теле встроенной табличной функции, как в вашем примере.Подумайте о том, чтобы изменить свой процесс, чтобы обходить иерархию только один раз, когда вы получаете свои эпизоды и сохраняете выходные данные в реляционной таблице. Вы можете использовать хранимый процесс, чтобы не делать этого ограничения.
Я также думаю, что в вашем коде может быть ошибка: если ваш CTE включается в personId и рекурсивно в eventId, eventId 101 будет представлен дважды, я думаю, как дубликат. Возможно, я неправильно истолковал ваш код, дайте мне знать, что вы думаете.
НТН
источник
Я черпал вдохновение из этой темы .
Вот что я сделал, чтобы решить проблему.
Затем я вызываю эту функцию следующим образом:
Таким образом, ни одна из моих логик CTE не должна повторяться, и я ничего не плачу с точки зрения производительности. Это неприятно, что это должно быть сделано таким образом, но я могу жить с этим.
источник
where
после многоточия предотвращает слишком много рекурсий, используя параметр функции в качестве ограничения. Я думаю, что после определения CTE должно быть заявление . Я добавлю это.EventID=1
(и 101,201, ... 901). Но исходный запрос (если он выполняется с MAXRECURSION = 100000000) может никогда не посетить строку сEventID=101
(и 201, .., 901). Таким образом, два запроса (исходный и ваше решение) могут возвращать разные результаты (нет строки с 101 в первом, да во 2)! Или он может посетить 101, но до шага 100, поэтому ваше решение будет включать строку в результаты дважды (опять же иначе)