Почему рекурсивный sql используется в табличных пространствах, управляемых словарем, в оракуле?

В документах Oracle указывается, что табличное пространство, управляемое локально, лучше, чем табличное пространство, управляемое словарем, в нескольких аспектах. во-первых, рекурсивный sql используется, когда база данных выделяет свободные блоки в табличном пространстве, управляемом словарем. В таблице fet$ есть столбцы (TS#, FILE#, BLOCK#, LENGTH)

Может ли кто-нибудь объяснить, почему рекурсивный sql используется для распределения с помощью fet$?


person englefly    schedule 14.01.2014    source источник


Ответы (1)


Кажется, вы интерпретируете «рекурсивный» в обычном смысле программирования; но может иметь немного другое значение:

  1. опираясь на себя, ссылаясь на себя.
    рекурсивный характер историй, которые заимствуют друг у друга
  2. (математика, несопоставимо) выражения, каждый член которого определяется применением формулы к предшествующим терминам
  3. (вычисление, несопоставимо) программы или функции, которая вызывает сама себя
  4. ...

Если вы интерпретируете это как рекурсивную функцию (что означает 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
comment
+1: на самом деле больше нет необходимости использовать табличные пространства, управляемые словарем. - person David Aldridge; 14.01.2014
comment
@AlexPoole Я понимаю, что LMT лучше, чем DMT. Я хочу сказать, почему DMT использует рекурсивный запрос. Я думаю, что оракул запускает рекурсивный запрос к $fet, но я не могу понять, что такое рекурсивный запрос. Не могли бы вы рассказать об этом подробнее? Большое спасибо. - person englefly; 15.01.2014
comment
@englefly - я думаю, вы интерпретируете «рекурсивный» как аналог рекурсивной функции, которая вызывает сама себя; это не совсем так буквально. Я обновил свой ответ, чтобы, надеюсь, прояснить это. - person Alex Poole; 15.01.2014