На работе у нас есть скрипт обновления для некоторой базы данных Oracle 11g, который занимает около 20 часов, и некоторые из самых требовательных запросов - это обновления, в которых мы изменяем некоторые значения, например:
UPDATE table1 SET
column1 = DECODE(table1.column1,null,null,'no info','no info','default value'),
column2 = DECODE(table1.column2,null,null,'no info','no info','another default value'),
column3 = 'default value';
Ивот так у нас много обновлений. Проблема в том, что таблицы имеют около 10 миллионов строк. У нас также есть некоторые обновления, где некоторые столбцы будут иметь значение по умолчанию, но они могут иметь значение NULL (я знаю, что если они имеют значение NULL и ограничения по умолчанию, то добавление таких столбцов происходит почти сразу, потому что значения находятся в каталоге),а затем обновление или добавление таких столбцов стоит много времени.
Мой подход заключается в воссоздании таблицы (как сказал TOM в https://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:6407993912330). Но я понятия не имею, как извлечь некоторые столбцы из исходной таблицы, которые останутся прежними, а также другие, которые изменятся на значение по умолчанию (и до обновления у такого столбца была разумная информация), потому чтонам нужно сохранить некоторую информацию в секрете.
Итак, мой подход примерно такой:
CREATE TABLE table1_tmp PARALLEL NOLOGGING
AS (select col1,col2,col3,col4 from table1);
ALTER TABLE table1_tmp ADD ( col5 VARCHAR(10) default('some info') NOT NULL;
ALTER TABLE table1_tmp ADD ( col6 VARCHAR(10) default('some info') NOT NULL;
ALTER TABLE table1_tmp ADD ( col7 VARCHAR(10);
ALTER TABLE table1_tmp ADD ( col8 VARCHAR(10);
MERGE INTO table1_tmp tt
USING table1 t
ON (t.col1 = tt.col1)
WHEN MATCHED THEN
UPDATE SET
tt.col7 = 'some defaul value that may be null',
tt.col7 = 'some value that may be null';
Я также попытался создать значения Nullable как ненулевые, чтобы сделать это быстро, исработало, проблема в том, что когда я возвращаю столбцы к нулю, тогда эта операция занимает слишком много времени. Последний код также занял много времени (более одного часа в процессе слияния).
Надеюсь, у вас есть представление о том, как улучшить производительность в подобных вещах. Заранее спасибо!