Path: blob/master/src/scripts/postgresql/delete-in-batches.sql
1381 views
-- This is for the old patches table, but can be handy for other tables.1-- run psql and the just copy/paste this.2-- Expected output (about 2 seconds per line ...)3-- NOTICE: Deleted 10000 rows in 00:00:00.688278. Delay 1.3765564-- NOTICE: Deleted 10000 rows in 00:00:00.589805. Delay 1.179615-- NOTICE: Deleted 10000 rows in 00:00:00.645825. Delay 1.291656-- [...]78DO $$9DECLARE10rows_deleted INTEGER;11start_time TIMESTAMP;12elapsed_time INTERVAL;13delay DOUBLE PRECISION;14BEGIN15LOOP16-- Record start time17start_time := clock_timestamp();1819-- Perform the deletion20DELETE FROM patches WHERE time <= (SELECT time FROM patches ORDER BY time ASC LIMIT 1 OFFSET 9999);2122-- Get number of rows deleted23GET DIAGNOSTICS rows_deleted = ROW_COUNT;2425-- Calculate elapsed time26elapsed_time := clock_timestamp() - start_time;2728-- Exit loop if no rows were deleted29EXIT WHEN rows_deleted = 0;3031-- Commit the transaction32COMMIT;3334delay := 2 * EXTRACT(EPOCH FROM elapsed_time);3536RAISE NOTICE 'Deleted % rows in %. Delay %', rows_deleted, elapsed_time, delay;3738-- Wait for twice the elapsed time (in seconds)39PERFORM pg_sleep(delay);40END LOOP;41END $$;42434445