Обновите несколько столбцов с миллионами записей - PullRequest
0 голосов
/ 26 июня 2018

У меня есть таблица с миллионами записей, и я добавил два новых столбца

alter table hr.employees add (ind char(1Byte), remove Char(1 Byte)); commit;

У меня есть другое представление hr.department, которое содержит больше данных, чем это, и у него есть эти два столбца.

Так что, если я пишу и обновляю эти записи, это занимает так много времени.

update hr.employees a 
set (ind, remove) =(select ind, remove 
                    from hr.department b 
                    where a.dept_id = b.dept_id ) ;

Прошёл уже час, как всё ещё идет с обновлением. Может ли кто-нибудь помочь в этом?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Если в вашей таблице миллионы строк, использование UPDATE с большой вероятностью займет слишком много времени.

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

RENAME employees to employees_old;

CREATE TABLE employees AS
SELECT a.col1, a.col2, ... a.coln, b.ind, b.remove 
  FROM employees_old a
  LEFT JOIN department b
    ON a.dept_id = b.dept_id;
0 голосов
/ 26 июня 2018

Самый простой способ справиться с этим обновлением, вероятно, будет следующим:

  1. Найдите время, когда никто больше не будет критически использовать систему.
  2. Сделайте резервную копию.
  3. Если они еще не существуют, скопируйте DDL для создания всех индексов / ограничений для этой таблицы.
  4. Удалить все индексы / ограничения в этой таблице.
  5. Обновите две колонки.
  6. Воссоздание индексов / ограничений (это может занять некоторое время, но обычно на несколько порядков меньше, чем обновление каждой строки в большой таблице с несколькими индексами).

Как обычно, Burleson Consulting - хороший ресурс: http://www.dba -oracle.com / t_efficient_update_sql_dml_tips.htm

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