Кажется, вы интерпретируете «рекурсивный» в обычном смысле программирования; но может иметь немного другое значение:
- опираясь на себя, ссылаясь на себя.
рекурсивный характер историй, которые заимствуют друг у друга
- (математика, несопоставимо) выражения, каждый член которого определяется применением формулы к предшествующим терминам
- (вычисление, несопоставимо) программы или функции, которая вызывает сама себя
- ...
Если вы интерпретируете это как рекурсивную функцию (что означает 3), то это не совсем понятно; fet$
не обновляется повторно, и оператор SQL не выполняет себя повторно. Здесь «рекурсивный» используется в более общем смысле (означает, что-то вроде 1) в том смысле, что выполняемый вами SQL генерирует еще один уровень SQL «под капотом». Не тот же SQL или та же самая функция, вызываемая сама по себе, а «SQL, основанный на SQL», или «SQL, ссылающийся на SQL», если хотите.
руководство по концепциям, где я думаю, вы получили свой вопрос от - говорит:
- Избегает использования словаря данных для управления экстентами.
Рекурсивные операции могут выполняться в управляемых словарем табличных пространствах, если потребление или освобождение пространства в экстенте приводит к другой операции, которая потребляет или освобождает пространство в таблице словаря данных или сегменте отмены.
С таблицей в табличном пространстве, управляемом словарем (DMT), когда вы вставляете данные, Oracle должен выполнять операторы SQL для таблиц словаря, чтобы идентифицировать и выделять блоки. Обычно вы этого не замечаете, но можете увидеть это в файлах трассировки и других представлениях производительности. Операторы SQL будут выполняться для fet$
и т. д. для управления пространством.
«Рекурсивная» часть заключается в том, что один оператор SQL должен выполнять другой (другой) оператор SQL; и это, в свою очередь, может потребовать выполнения еще одного (снова другого) оператора SQL.
В локально управляемом табличном пространстве (LMT) информация о блоках хранится в растровом изображении внутри самого табличного пространства. Нет зависимости от словаря (для этого, во всяком случае). Этот дополнительный слой SQL не нужен, что экономит время как на самом запросе словаря, так и на потенциальных задержках параллелизма, поскольку несколько запросов (по всей базе данных, для всех табличных пространств) обращаются к словарю в одно и то же время. Управление этим локальным блоком намного проще и быстрее.
В руководстве по концепциям также говорится:
Примечание. Oracle настоятельно рекомендует использовать локально управляемые табличные пространства с автоматическим управлением пространством сегментов.
Как говорит Дэвид, на самом деле нет никакой пользы от использования табличных пространств, управляемых словарем, и если вы не унаследовали старую базу данных, которая все еще использует их — в этом случае следует рассмотреть возможность миграции на LMT — или просто учитесь ради из-за этого вы можете в значительной степени забыть о них; все новое должно действительно использовать LMT, и мы надеемся, что ссылки на DMT имеют только историческое значение.
Я хотел продемонстрировать разницу, запустив трассировку одного и того же оператора insert
для LMT и DMT и показав дополнительные операторы SQL из файла трассировки в версии DMT; но я не могу найти DMT ни в одной базе данных, к которой у меня есть доступ, начиная с 9i, что, я полагаю, подтверждает точку зрения Дэвида. Вместо этого я укажу вам на ещё больше документации а>:
Иногда для выполнения оператора SQL, введенного пользователем, база данных Oracle должна выполнить дополнительные операторы. Такие операторы называются рекурсивными вызовами или рекурсивными операторами SQL. Например, если вы вставляете строку в таблицу, в которой недостаточно места для хранения этой строки, Oracle Database выполняет рекурсивные вызовы для динамического выделения пространства. Рекурсивные вызовы также генерируются, когда информация словаря данных недоступна в кэше словаря данных и должна быть получена с диска.
Вы можете использовать инструменты отслеживания, описанные в этом документе, для самостоятельного сравнения, если у вас есть доступ к DMT; или вы можете поискать примеры.
Вы можете увидеть ссылки на рекурсивный SQL в другом месте, обычно в ошибках; ошибка не непосредственно в SQL, который вы выполняете, а в дополнительных внутренних проблемах SQL Oracle, чтобы выполнить ваш запрос. LMT просто удаляют один экземпляр там, где они раньше были необходимы, и в процессе могут устранить существенное узкое место.
person
Alex Poole
schedule
14.01.2014