Eric Bower
·
2026-05-03
1-- find unused accounts
2SELECT count(*) FROM app_users u WHERE NOT EXISTS (SELECT 1 FROM posts WHERE user_id = u.id) AND NOT EXISTS (SELECT 1 FROM projects WHERE user_id = u.id) AND NOT EXISTS (SELECT 1 FROM access_logs WHERE user_id = u.id AND created_at > NOW() - INTERVAL '1 year') AND NOT EXISTS (SELECT 1 FROM feature_flags ff WHERE ff.user_id = u.id) AND NOT EXISTS (SELECT 1 FROM payment_history ph WHERE ph.user_id = u.id);
3-- delete unused accounts
4DELETE FROM app_users u WHERE NOT EXISTS (SELECT 1 FROM posts WHERE user_id = u.id) AND NOT EXISTS (SELECT 1 FROM projects WHERE user_id = u.id) AND NOT EXISTS (SELECT 1 FROM access_logs WHERE user_id = u.id AND created_at > NOW() - INTERVAL '1 year') AND NOT EXISTS (SELECT 1 FROM feature_flags ff WHERE ff.user_id = u.id) AND NOT EXISTS (SELECT 1 FROM payment_history ph WHERE ph.user_id = u.id);
5
6-- how many visits will be deleted
7SELECT count(*) FROM analytics_visits WHERE created_at < NOW() - INTERVAL '1 year';
8-- delete old analytic visits
9DELETE FROM analytics_visits WHERE created_at < NOW() - INTERVAL '1 year';
10-- batch delete
11WITH deleted AS (DELETE FROM analytics_visits WHERE ctid IN (SELECT ctid FROM analytics_visits WHERE created_at < NOW() - INTERVAL '1 year' LIMIT 100000) RETURNING 1) SELECT count(*) FROM deleted;