Производительность Oracle при отбрасывании всех таблиц - PullRequest
2 голосов
/ 07 октября 2010

У меня есть следующий Oracle SQL:

Begin

-- tables
for c in (select table_name from user_tables) loop
execute immediate ('drop table '||c.table_name||' cascade constraints');
end loop;

-- sequences
for c in (select sequence_name from user_sequences) loop
execute immediate ('drop sequence '||c.sequence_name);
end loop;

End;

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

Это работает, но это занимает вечность!

Script Output

Я не думаю, что отбрасывание всех моих столов должно занять много времени.В чем дело?И можно ли улучшить этот скрипт?

Примечание: Всего около 100 таблиц.

Ответы [ 3 ]

4 голосов
/ 07 октября 2010

«Это работает, но это занимает вечность!»

В этом случае навсегда означает, что таблица занимает менее трех секунд :)

Это еще не всестол, чем просто уронить стол.Есть также зависимые объекты, которые нужно отбросить - ограничения, индексы, триггеры, хранилище больших или вложенных таблиц и т. Д. Существуют представления, синонимы хранимых процедур для аннулирования.Есть гранты, которые нужно отозвать.Пространство таблицы (и ее индексов и т. Д.) Должно быть выделено.

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

В отличие от обычного SQL, мы не можем настроить рекурсивный SQL, но мы можем настроить среду так, чтобы она работала быстрее.

Я предполагаю, что это база данных разработки, в которой объекты создаются и разрываютсявниз на регулярной основе, и что вы используете 10 г или выше.

  1. Очистите корзину.

    SQL> purge recyclebin;

  2. Сбор статистики для словаря данных (потребуются полномочия администратора БД).Они уже могут быть собраны, так как это поведение по умолчанию в 10g и 11g. Узнайте больше .

  3. Если у вас есть словарная статистика, убедитесь, что вы используете оптимизатор на основе затрат.В идеале это должно быть установлено на уровне базы данных, но мы можем исправить это на уровне сеанса:

    SQL> alter session set optimizer_mode=choose;

1 голос
/ 07 октября 2010

Я бы попытался изменить инструкцию DROP TABLE, чтобы использовать ключевое слово Purge. Поскольку вы отбрасываете все таблицы, вам не нужно каскадировать ограничения одновременно. Это действие, вероятно, заставляет его быть медленным. У меня нет экземпляра Oracle, чтобы проверить это, поэтому он может выдать ошибку.

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

Документация Oracle по команде DROP TABLE: здесь .

0 голосов
/ 13 декабря 2013

Один из вариантов - удалить пользователя вместо отдельных таблиц и т. Д. И воссоздать их при необходимости.Как правило, он более надежен, так как отбрасывает все таблицы, представления, процедуры, последовательности и т. Д. И, вероятно, будет быстрее.

...