Быстрый способ сбросить все значения столбца по умолчанию - PullRequest
1 голос
/ 18 ноября 2010

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

Хотя процедуры преобразования еще находятся в стадии разработки, я хотел бы иметь возможность быстро сбросить все значения статуса на NULL.

Оператор UPDATE для таблиц слишком медленный (слишком много записей). Кто-нибудь знает быстрый альтернативный способ сделать это?

Ответы [ 6 ]

3 голосов
/ 18 ноября 2010

Самый быстрый способ сбросить столбец: SET UNUSED столбец, затем добавить столбец с тем же именем и типом данных.

Это будет самый быстрый способ, поскольку обе операциине будет касаться действительной таблицы (только обновление словаря).

Как и в ответе Nivas фактическое упорядочение столбцов будет изменено (столбец сброса будет последним столбцом).Если ваш код основан на упорядочении столбцов (не должно!), Вы можете создать представление, в котором столбец будет иметь порядок right (переименовать таблицу, создать представление с тем же именем, что и у старой таблицы,отозвать гранты из базовой таблицы, добавить гранты для просмотра).

Метод SET UNUSED не освобождает пространство, используемое столбцом (тогда как удаление столбца освободит пространство в каждом блоке).

2 голосов
/ 18 ноября 2010

Если столбец имеет значение NULL (так как по умолчанию NULL, я думаю, что это так), удалить и добавить столбец снова?

1 голос
/ 19 ноября 2010

Вы пробовали использовать таблицу воспоминаний?

Например:

select current_scn from v$database;
-- 5607722 

-- do a bunch of work

flashback table TABLE_NAME to scn 5607722;

Это гарантирует, что таблица, над которой вы работаете, является ИДЕНТИЧНОЙ при каждом запуске ваших тестов. Конечно, вы должны убедиться, что у вас достаточно отката для сохранения ваших изменений.

1 голос
/ 18 ноября 2010

Пока подпрограммы преобразования еще находятся в стадии разработки, я хотел бы иметь возможность снова быстро сбросить все значения статуса на NULL.

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

0 голосов
/ 23 ноября 2010

Мне нравятся некоторые другие ответы, но я только что прочитал в книге настройки, что по нескольким причинам часто быстрее воссоздать таблицу, чем делать массивные обновления на столе. В этом случае это кажется идеальным, поскольку вы пишете CREATE TABLE X AS SELECT с, надеюсь, очень небольшим количеством столбцов.

0 голосов
/ 18 ноября 2010

гм.возможно, добавьте индекс в столбец состояния.

или, альтернативно, добавьте новую таблицу только с первичным ключом.затем вставьте в эту таблицу, когда запись преобразуется, и TRUNC эту таблицу для сброса ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...