У нас есть требование удалять строки порядка миллионов из нескольких таблиц в виде пакетного задания (обратите внимание, что мы удаляем не все строки, мы удаляем на основе метки времени, хранящейся в индексированном столбце). Очевидно, что обычное DELETE занимает вечность (из-за ведения журнала, проверки ссылочных ограничений и т. д.). Я знаю, что в мире LUW ИЗМЕНЕНИЕ ТАБЛИЦЫ ИЗНАЧАЛЬНО НЕ ЗАРЕГИСТРИРОВАНО, но я не могу найти эквивалентную инструкцию SQL для DB2 v8 z/OS. У кого-нибудь есть идеи, как это сделать очень быстро? Кроме того, есть идеи, как избежать ссылочных проверок при удалении строк? Пожалуйста, дай мне знать.
удаление большого количества строк из таблицы
Ответы (3)
В прошлом я решал эту проблему, экспортируя данные и повторно загружая их с помощью команды стиля замены. Например:
EXPORT to myfile.ixf OF ixf
SELECT *
FROM my_table
WHERE last_modified < CURRENT TIMESTAMP - 30 DAYS;
Затем вы можете ЗАГРУЗИТЬ его обратно, заменив старый материал.
LOAD FROM myfile.ixf OF ixf
REPLACE INTO my_table
NONRECOVERABLE INDEXING MODE INCREMENTAL;
Я не уверен, будет ли это быстрее или нет для вас (вероятно, это зависит от того, удаляете ли вы больше, чем сохраняете).
У внешних ключей уже есть индексы?
Как у вас настроено действие удаления?
CASCADE, NULL, NO ACTION
Используйте SET INTEGRITY, чтобы временно отключить ограничения на пакетный процесс. http://www.ibm.com/developerworks/data/library/techarticle/dm-0401melnyk/index.html
http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r
Мы изменили табличное пространство, чтобы блокировка происходила на уровне табличного пространства, а не на уровне страницы. Как только мы изменили это, DB2 требовала только одну блокировку для выполнения DELETE, и у нас не было никаких проблем с блокировкой. Что касается ведения журнала, мы просто попросили клиента знать о необходимом объеме ведения журнала (поскольку не было решения, позволяющего обойти проблему ведения журнала). Что касается ограничений, мы просто удалили их и создали заново после удаления.
Спасибо всем за вашу помощь.