Считается ли рекурсивный CTE SQL Server циклом? - PullRequest
5 голосов
/ 19 октября 2011

У меня сложилось впечатление, что рекурсивные CTE были установлены на основе, но в недавнем посте SO кто-то упомянул, что они циклы.

Основаны ли рекурсивные CTE? Я ошибаюсь, если предположим, что операция на основе множества не может быть циклом?

Ответы [ 3 ]

2 голосов
/ 19 октября 2011

Они установлены на основе. Рекурсивные наборы все еще наборы.

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

2 голосов
/ 19 октября 2011

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

Для тех, кто заинтересован, здесь есть небольшое небольшое описание производительности с CTE:

http://explainextended.com/2009/11/18/sql-server-are-the-recursive-ctes-really-set-based/

0 голосов
/ 24 мая 2015

Я думаю, что необходимо провести различие между «рекурсией хвоста» и «общей рекурсией».

Все хвостовые рекурсии могут быть реализованы в виде циклов - без использования стека.

Поддержка общей рекурсии также может быть реализована в виде цикла, но со стеком.

Рекурсивные CTE - это рекурсии Tail и, следовательно, по сути, Loop. Единственная разница заключается в том, что условие завершения обрабатывается семантикой SQL / механизмом выполнения. Выходные данные каждой итерации цикла имеют значение UNION или любой другой заданный вами параметр.

...