Медленное обновление после усечения

У меня есть относительно простой оператор обновления:

update sv_konginfo ki set AnzDarl = 1 where kong_nr in ( select kong_nr from sv_darlehen group by kong_nr having count (*) = 1); 

который работает нормально (около 1 секунды для около 150 000 записей).

Однако, если я усекаю таблицу и затем снова вставляю записи:

 truncate table sv_konginfo; insert into sv_konginfo (kong_nr) select distinct kong_nr from sv_darlehen; 

оператор обновления работает очень медленно (более минуты), работая над точно такими же данными.

Что я могу сделать, чтобы улучшить производительность во втором сценарии? (Мы используем Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 – 64bit.)

Спасибо за вклад, они помогли мне разобраться, что вызвало проблему: Chained Rows!

  • после вставки новых строк AnzDarl (и ряда других столбцов) являются нулевыми
  • когда столбцы установлены в 1 (или другие значения), они занимают некоторое пространство

Я смог проверить это, используя следующий SQL:

 select chain_cnt from user_tables where table_name='SV_KONGINFO'; 

После Truncate цепочка_cnt равнялась 0. После запуска Update chain_cnt резко увеличился и был равен числу затронутых строк.

Увеличение PCT_FREE, как это, решило проблему производительности для меня:

 alter table sv_konginfo pctfree 40; 

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

Мое первое предположение было бы

 ANALYZE TABLE sv_konginfo COMPUTE STATISTICS; 

или с использованием DBMS_STATS . Посмотрите на Управление объектами схемы .