-- L15 OFFSET deep page (scan-then-discard) — page 100 of 100, offset 1980 -- FeedKeysetIT.l15ExplainOffsetScansThenDiscardsKeysetSeeksAndNeedsIndex (seed 2000, keyset index present) -- SELECT fi.id, fi.first_highlighted_at FROM feed_items fi -- ORDER BY fi.first_highlighted_at DESC, fi.id DESC OFFSET 1980 LIMIT 20 -- 읽기 포인트: 정렬키 인덱스가 있어도 깊은 페이지에선 Seq Scan(2000)+Sort(2000) 로 전량을 훑고 20만 남긴다. -- Limit 하위 actual rows=2000 = 결과 20행을 위해 훑은 행(over-scan = offset+20). buffers shared hit=141. Limit (cost=275.61..275.66 rows=20 width=24) (actual time=0.945..0.949 rows=20 loops=1) Buffers: shared hit=141 -> Sort (cost=270.66..275.66 rows=2000 width=24) (actual time=0.759..0.865 rows=2000 loops=1) Sort Key: first_highlighted_at DESC, id DESC Sort Method: quicksort Memory: 189kB Buffers: shared hit=141 -> Seq Scan on feed_items fi (cost=0.00..161.00 rows=2000 width=24) (actual time=0.124..0.369 rows=2000 loops=1) Buffers: shared hit=141 Planning: Buffers: shared hit=5 read=1 Planning Time: 0.137 ms Execution Time: 0.996 ms