Обновление схемы Oracle с новым ограничением - как я могу сократить время простоя обновления? - PullRequest
0 голосов
/ 29 июня 2010

У меня есть репозиторий оракула и работает, скажем, 10 миллионов записей. Один из столиков скажет

CREATE TABLE TABLE_A 
NAME VARCHAR2(128),
VER  VARCHAR2(128),
TYPE VARCHAR2(32),
DESCRIPTION VARCHAR2(256),
CONSTRAINT TABLE_A_PK PRIMARY KEY ("NAME","VERSION");

Эта таблица используется давно, и теперь говорят, что у меня есть требование изменить ограничение первичного ключа. Теперь у меня есть требование, чтобы в другом столбце было указано ID и первичный ключ, чтобы они были комбинацией NAME, VER, TYPE и LANG.

В скрипте обновления у меня может быть что-то вроде

 EXECUTE IMMEDIATE
 ALTER TABLE TABLE_A ADD LANG VARCHAR2(32);
 EXECUTE IMMEDIATE
 UPDATE TABLE TABLE_A SET LANG ='|| 'en_US';
 EXECUTE IMMEDIATE
 UPDATE TABLE TABLE_A SET TYPE='||'n/a'||' WHERE TYPE IS NULL;

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

Но выполнение описанных выше действий для 10 миллионов записей требует времени обновления не менее 5 часов. Есть ли какой-нибудь другой способ сделать предыдущий столбец первичным ключом и все равно не потребовать большого времени простоя. Просьба также предложить мне, если я ошибаюсь с моим подходом. Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 30 июня 2010

Текущий первичный ключ будет иметь вспомогательный индекс, который, вероятно, является уникальным индексом NAME / VERSION.

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

Это не сократит общее время, ноэто может позволить вам разбить всю операцию, скажем, на 5 1-часовых шагов, а не на 5-часовой шаг.

0 голосов
/ 29 июня 2010

Прежде всего, я не понимаю, почему с помощью EXECUTE IMMEDIATE.

Затем, что касается создания PK с использованием Enabled Novalidated Constraints, оно будет применяться к новым вставленным строкам, но не к старым.Таким образом, вы можете запустить пакетную обработку, чтобы изменить существующие данные для фиксации нового PK.Узнайте больше: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/data_acc.htm#i6516

Для колонки LANG вы также можете указать значение по умолчанию:

ALTER TABLE TABLE_A ADD LANG VARCHAR2(32) default 'en_US';

затем

ALTER TABLE TABLE_A MODIFY LANG VARCHAR2(32) default null;

Николас.

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