Удалить первую X строку Ingres ANSI

У меня есть 730000+ записей, которые мне нужно удалить в Ingres db, которые работают с ANSI92, и мне нужно удалить их без перегрузки db, просто удалить там, где условие поиска не работает, DB просто использует всю память и ошибку записи. подумал запустить его в цикле и удалить порциями 10-20К записей.

я пытался использовать верх, и это не сработало

 delete top (10)from TABLE where web_id <0 ;

также пытался использовать лимит также не работает

DELETE FROM from TABLE where web_id <0  LIMIT 10;

есть идеи как это сделать? Спасибо!

1 ответ

Решение

Вы можете использовать временную таблицу сеанса для хранения первых 10 приливов (идентификаторов кортежей), а затем удалить их на основе этих:

declare global temporary table session.tenrows as
select first 10 tid the_tid from "table" where web_id<0
on commit preserve rows with norecovery;

delete from "table" where tid in (select the_tid from session.tenrows);

Когда вы говорите "без перегрузки БД", вы имеете в виду избегать превышения предела принудительного прерывания файла журнала транзакций? Если это так, что может работать для вас:

set session with on_logfull=notify;
delete from table where web_id<0;

Это будет автоматически фиксировать вашу транзакцию в точках, где достигается принудительное прерывание, а затем продолжаться, а не откатываться и сообщать об ошибке. Недостатком использования этого параметра является то, что может быть непросто отобрать то, что было / не было сделано, если возникнет какая-либо другая ошибка (ваша работа, вероятно, будет частично зафиксирована), но поскольку это выглядит как прямое удаление из таблицы должно быть совершенно очевидно, какие строки остаются, а какие нет. Оператор "set session" должен выполняться в начале транзакции. Я бы посоветовал не запускать параллельные сеансы с "on_logfull=notify" (в этой области были ошибки, исправлены ли они в вашей установке, зависит от уровня вашей версии / патча).

Другие вопросы по тегам