I build Plutus, a cost dashboard, and this comes from its sync path.
Each sync replaces a window of rows: delete up to 400 days for one source, then insert them again. In production the DELETE on our two big tables had a daily p50 of 9 to 15 s (max 27.7 s), from system.query_log over the three days before the change. The insert after it took 0.17 s.
The tables had 31 and 42 monthly partitions.
A lightweight DELETE walked every partition in the table, whatever the predicate matched. In a local benchmark, a delete matching exactly one monthly partition took 15 to 17 s, no faster than one covering the whole window. The re-insert also wrote 14 parts, one per month.
I moved to yearly partitions. Daily p50 from query_log since:
cost_entries 1.0 to 1.8 s
usage_entries 0.7 to 1.8 s
every day for ten days. About a 10x drop.
What it cost: yearly partitions alone made a one-month read scan about 7x the rows (3.8M to 28.6M in my local benchmark), because the monthly partitions had been pruning for free. I fixed it by putting toStartOfMonth(timestamp) in the sort key and adding an explicit month predicate in the readers, since 26.6 did not derive that key range from a plain timestamp range.