row reads bill per row scanned, not per query, so a full table sweep every 30s on a growing table means the bill scales with total rows even though you're only trashing a handful. index the stale-timestamp column and cursor through just the expired slice, turns O(all) into O(expired).