powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / как лимитировать число удаляемых записей?
8 сообщений из 8, страница 1 из 1
как лимитировать число удаляемых записей?
    #34543976
Vladimir Dyuzhev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть процедура purge старых записей. Их много-много, поэтому попытка просто прогнать

Код: plaintext
1.
DELETE FROM FOO WHERE ... 

приводит к росту лог-файла, блокировкам(?) и прочим неприятным вещам. Возникла задача удалять их порциями, по 100-200 записей за транзакцию -- этакий фоновый процессик. Проблема в том, что синтаксис типа

Код: plaintext
1.
2.
DELETE FROM FOO WHERE ...
FETCH FIRST  100  ROWS ONLY 

DB2 не поддерживает.

Написать

Код: plaintext
1.
2.
3.
4.
DELETE FROM FOO WHERE FOO_KEY IN (
  SELECT FOO_KEY FROM FOO WHERE ...
  FETCH FIRST  100  ROWS ONLY
)

можно, но требует большой работы (в purge существуют сотни скриптов, некоторые очень сложны, и перелопачивать их на предмет DELETE FROM SELECT очень не хочется -- долго и опасно).

Идеально было бы найти способ взять существующий SQL-запрос как строку, и обернуть в что-то или дописать что-то в конце, что могло бы ограничить количество удаляемых записей.

Есть ли какой-то способ, или придётся таки засучивать рукава?
...
Рейтинг: 0 / 0
как лимитировать число удаляемых записей?
    #34544453
user_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно конечно пронумеровать записи
Код: plaintext
1.
ROW_NUMBER() OVER(FOO_KEY) AS r#
WHERE   r# <=  100 ;
но это тоже не без
Код: plaintext
1.
DELETE FROM FOO WHERE ...
       SELECT
Это так рассуждение вслух ...
...
Рейтинг: 0 / 0
как лимитировать число удаляемых записей?
    #34544555
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия базы какая?
...
Рейтинг: 0 / 0
как лимитировать число удаляемых записей?
    #34546765
Vladimir Dyuzhev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
user_aМожно конечно пронумеровать записи
Код: plaintext
1.
ROW_NUMBER() OVER(FOO_KEY) AS r#
WHERE   r# <=  100 ;
но это тоже не без
Код: plaintext
1.
DELETE FROM FOO WHERE ...
       SELECT
Это так рассуждение вслух ...

А можно полный пример запроса, простите за безграмотность?
...
Рейтинг: 0 / 0
как лимитировать число удаляемых записей?
    #34546768
Vladimir Dyuzhev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinВерсия базы какая?

8.х под AIX и Windows
...
Рейтинг: 0 / 0
как лимитировать число удаляемых записей?
    #34546773
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
DELETE FROM
(
SELECT ROWNUMBER() OVER() RN
FROM FOO
WHERE  ...
) T
WHERE RN<= 100 ;
...
Рейтинг: 0 / 0
как лимитировать число удаляемых записей?
    #34548824
Vladimir Dyuzhev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
Код: plaintext
1.
2.
3.
4.
5.
6.
DELETE FROM
(
SELECT ROWNUMBER() OVER() RN
FROM FOO
WHERE  ...
) T
WHERE RN<= 100 ;


А вы знаете, парни, это должно подойти. Вся заморочка с DELETE FROM SELECT была в том, что нужно было писать DELETE FROM FOO WHERE PK IN (SELECT PK FROM FOO WHERE ... ), а вот как раз имя PK везде разное, а кое-где его просто нет (угу). То есть простыми операциями над SQL как строкой получить валидный SQL для всех существующих скриптов затруднительно. А в SQL наверху, я так понимаю, можно просто взять существующий скрипт вида:

Код: plaintext
1.
DELETE FROM FOO WHERE A= 0  and B= 1 

заменить лидирующие DELETE FROM на DELETE FROM (SELECT ROWNUMBER() OVER() RN и добавить в конце

Код: plaintext
1.
) T WHERE RN<= 100 

похоже, должно сработать без модификации существующих скриптов.

Будем пробовать, спасибо!

P.S. Я так понимаю, ROWNUMBER() первичного ключа не требует, а просто присваивает порядковый номер согласно порядку следования в SELECT? Sweet... ;)
...
Рейтинг: 0 / 0
как лимитировать число удаляемых записей?
    #34548897
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir DyuzhevP.S. Я так понимаю, ROWNUMBER() первичного ключа не требует, а просто присваивает порядковый номер согласно порядку следования в SELECT? Sweet... ;)
OLAP functions - мощный инструмент.
В данном, самом простом виде, rownumber работает как простой нумератор строк, начиная с 1.
Порядок нумерации строк в данном случае не определен.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / как лимитировать число удаляемых записей?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]