2014-10-01 9 views
1

Мне нужно обновить первичный ключ большой индексной таблицы (20 миллионов строк) на Oracle 11g.Уточненные индексы индекса с использованием нескольких запросов UPDATE (временные дубликаты)

Возможно ли это, используя несколько запросов UPDATE? то есть много меньших UPDATE, например, 100 000 строк за раз. Проблема состоит в том, что одна из этих пакетов UPDATE может временно создать дублирующее значение первичного ключа (после завершения всех UPDATE не будет дубликатов).

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

Единственное решение, которое я вижу, - это создать новую таблицу и по завершении отбросить исходную таблицу и переименовать новую таблицу в исходное имя таблицы.

Я пропустил другой возможность?

ответ

0

Вы не можете отключить/исключить ограничение первичного ключа из IOT, так как это уникальный индекс по определению.

Когда мне нужно изменить IOT, как это, я либо делаю CTAS (создаю таблицу как) для новой обычной таблицы кучи, выполняю мое обслуживание, а затем CTAS - новый IOT.

Что-то вроде:

create table t_temp as select * from t_iot; 
-- do maintenance 
create table t_new_iot as select * from t_temp; 

Если, однако, вам нужно просто добавить или присоединиться новое поле к существующему ключу, вы можете сделать это за один шаг, создав новую структуру IOT, затем заселение непосредственно из старого IOT с запросом.

К сожалению, это одна из минусов IOT.

0

Я бы рекомендовал следующий метод:

  1. Создать новую IOT таблицу, разделенную системой с одним разделом с точно такой же структурой, как текущий.

  2. Заблокировать текущую таблицу IOT для предотвращения любого DML.

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

  4. Обменный раздел нового стола с оригинальной таблицей.