Есть ли эффективный способ удалить все представления / функции / таблицы / sp из базы данных? - PullRequest
6 голосов
/ 16 мая 2011

В базе данных объединения DB2 (на основе удаленных серверов и псевдонимов) мне нужно очистить модель и воссоздать ее из другой базы данных. Мне нужно удалить все объекты базы данных, кроме этих серверов и псевдонимов.

Я знаю, как получить список объектов из схемы SYSCAT. Теперь мне нужно запустить операторы DROP для каждого. Очевидно, что зависимости будут мешать.

Подход с использованием грубой силы будет заключаться в том, чтобы выполнять DROP в цикле, пока все не будут выполнены успешно, но в зависимости от порядка (везет или нет) это может занять очень много времени.

Не знаете ли вы, как эффективно упорядочить оператор DROP, чтобы общее время удаления было максимально коротким?

Идеального решения не ожидается. Достаточно разумное решение достаточно хорошо.

Спасибо

Ответы [ 3 ]

2 голосов
/ 24 мая 2011

Возможно, вы захотите увидеть ссылки на каждую таблицу (что вы можете сделать с syscat.references в соответствии с http://www.ibm.com/developerworks/data/library/techarticle/dm-0401melnyk/) и самостоятельно построить дерево зависимостей) (должно быть выполнимо, например, с временными таблицами, если выограничено только sql.) Затем вы можете опускаться из нижней части этого дерева.

Так что, в принципе, мой ответ на ваш вопрос будет таким: чтобы сделать это быстро, просто закажите таблицы на основе ссылок.они имеют между собой перед удалением. Так как не должно быть никаких циклов зависимости, вы всегда должны иметь возможность выбрать одну таблицу, на которую нет ссылок. Удалите ее и повторите.

Возможно, вы также захотите увидеть это (похоже?) вопрос: Команда DB2 cascade delete? на случай, если вы хотите сначала удалить данные.

Если я ошибаюсь, пожалуйста, исправьте. Этот ответ основан на моем опыте работы сдругие базы данных, поэтому он может не полностью подходить для DB2. Хотя он должен работать;)

1 голос
/ 24 мая 2011

Этот запрос может упорядочить операторы в соответствии с общим количеством элементов, от которых они зависят.Результирующий порядок работает практически без сбоев, второй проход подхода "грубой силы" содержит только несколько объектов (из нескольких тысяч объектов, которые нужно удалить).

Проблема, она очень медленная...

РЕДАКТИРОВАТЬ: В запросе была опечатка, из-за которой он возвращал более или менее правильные данные, но очень и очень медленно.

WITH FIRST_LEVEL_DEPENDENCIES (BSCHEMA, BNAME, DTYPE, DSCHEMA, DNAME) AS
(
  SELECT T1.TABSCHEMA AS BSCHEMA, T1.TABNAME AS BNAME, T1.BTYPE, T1.BSCHEMA, T1.BNAME
    FROM SYSCAT.TABDEP T1
   WHERE T1.TABSCHEMA NOT LIKE 'SYS%'
     AND T1.BTYPE <> 'N'
   UNION ALL
  SELECT T1.ROUTINESCHEMA AS BSCHEMA, T1.SPECIFICNAME AS BNAME, T1.BTYPE, T1.BSCHEMA, T1.BNAME
    FROM SYSCAT.ROUTINEDEP T1
   WHERE T1.ROUTINESCHEMA NOT LIKE 'SYS%'
     AND T1.BTYPE <> 'N'
   UNION ALL
  SELECT T1.TABSCHEMA AS BSCHEMA, T1.TABNAME AS BNAME, 'T', T1.REFTABSCHEMA, T1.REFTABNAME
    FROM SYSCAT.REFERENCES T1
   WHERE T1.TABSCHEMA NOT LIKE 'SYS%'
),
RECURSIVE_DEPENDENCIES (LEVEL, BSCHEMA, BNAME, DTYPE, DSCHEMA, DNAME) AS
(
   SELECT 1, U.BSCHEMA, U.BNAME, U.DTYPE, U.DSCHEMA, U.DNAME
     FROM FIRST_LEVEL_DEPENDENCIES AS U
    UNION ALL
   SELECT LEVEL + 1, REC.BSCHEMA, REC.BNAME, U.DTYPE, U.DSCHEMA, U.DNAME
     FROM RECURSIVE_DEPENDENCIES REC,
          FIRST_LEVEL_DEPENDENCIES U
    WHERE LEVEL < 6
      AND U.BSCHEMA = REC.DSCHEMA
      AND U.BNAME = REC.DNAME
)
SELECT BSCHEMA, BNAME, COUNT(*)
  FROM RECURSIVE_DEPENDENCIES
 GROUP BY BSCHEMA, BNAME
 ORDER BY COUNT(*)
0 голосов
/ 24 мая 2011

У меня нет решения DIRECT для DB2, но я могу предложить следующее:

A) В Microsoft SQL Server 2008 была решена проблема УДАЛИТЬ (не УДАЛИТЬ) таблицы, относящиеся к порядку внешних ключей, по этой ссылке:

Создать оператор удаления из отношений внешнего ключа в SQL 2008?

B) В Oracle PL / SQL была решена проблема, связанная сDELETE (не DROP) относительно порядка внешних ключей, по этой ссылке:

Как генерировать операторы DELETE в PL / SQL на основе отношений FK таблиц?

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

Согласны ли вы или нет?

РЕДАКТИРОВАТЬ 1: По этой ссылке:

http://bytes.com/topic/db2/answers/183189-how-delete-tables-completely

Я могу прочитать:

Роберт, почему бы просто не

LOAD FROM /dev/null of del replace into tablename NONRECOVERABLE

- Это очень быстро усекает таблицу,не уверен, что он восстанавливает статистику обновления пространства по умолчанию?Это дает дополнительное преимущество: вам не нужно выполнять удаление в правильном порядке RI.(хотя вам придется выполнить SET INTEGRITY впоследствии) OK

РЕДАКТИРОВАТЬ 2: Пожалуйста, смотрите следующее:

Удаление схемы и всего ее содержимого в DB2 8.x

...