Следующий запрос очень медленный. Кажется, подзапрос выполняется для каждой строки в таблице?!
delete from HISTORY
where ID in (
select ID from (
select ID, ROW_NUMBER() over(partition by SOURCE order by ID desc) as NUM from HISTORY
) where NUM > 100
);
Это запрос на очистку. Он должен удалить все, кроме 100 самых последних записей за SOURCE
.
Требуемое время, похоже, зависит только от количества записей в таблице, а не от того, сколько записей нужно удалить. Даже при наличии всего 10 000 записей это занимает несколько минут. Однако, если я выполняю только подвыборку, это быстро.
Конечно, есть PK на ID
и FK и индекс на SOURCE
(оба столбца Integer).
> the subselect is executed for each row in the table?!
Точно. Возможно, получите некоторые идеи от stackoverflow.com/questions/11906720/ - person Arioch 'The   schedule 05.11.2020in
(и особенноnot in
) в interbase/firebird, попробуйте проверить, можете ли вы легко переформулировать запрос во что-то другое. Это не всегда плохо, но достаточно часто, чтобы выработать эту привычку. - person Arioch 'The   schedule 07.11.2020volatile variables
в терминах C++, их значение можно менять внутри цикла. Например, в read-commit транзакциях — зафиксировав еще какой-нибудь tx. А до FB3 даже из того же запроса (insert into TableName select * from TableName
запускается бесконечно, пока не встретится ошибка (нарушение PK, нехватка тома диска, нехватка int32 для ID и т. д.), смотрите стабильность курсора на firebirdsql.org/file/documentation/release_notes/html/en/3_0/ - person Arioch 'The   schedule 08.11.2020