По соображениям производительности крайне важно не выполнять дополнительную клиентскую поездку в оба конца, просто загрузить 500 значений ID и затем снова отправить их на сервер.Вместо этого я бы предложил один из двух подходов:
Использовать специфичный для поставщика SQL
В настоящее время вы поддерживаете только 2 RDBMS.Должно быть легко написать два отдельных оператора SQL.В этом случае, поскольку вы используете только Oracle и SQL Server, вы можете выполнить это с помощью стандартного SQL, фактически:
DELETE FROM records
WHERE id NOT IN (
SELECT id
FROM records
ORDER BY last_access_date DESC
OFFSET 0 ROWS -- SQL Server needs this
FETCH FIRST 500 ROWS ONLY
)
Если вы не делаете это слишком часто и можете жить свременное несоответствие, вы можете даже реализовать гораздо более быстрое решение:
Oracle
CREATE TABLE temp AS
SELECT *
FROM records
ORDER BY last_access_date DESC
FETCH FIRST 500 ROWS ONLY;
TRUNCATE TABLE records;
INSERT INTO records
SELECT * FROM temp;
DROP TABLE temp;
SQL Server
SELECT TOP 500 *
INTO temp
FROM records
ORDER BY last_access_date DESC;
TRUNCATE TABLE records;
INSERT INTO records
SELECT * FROM temp;
DROP TABLE temp;
Использование построителя SQL
Для более сложных SQL, не зависящих от поставщика, вы можете захотеть использовать построитель SQL, например jOOQ .Могут существовать и другие альтернативы.
Отказ от ответственности: я работаю на поставщика.