-- L16 (c) precompute (CQRS read model) — per-viewer feed_visible table, single covering index scan
-- FeedVisibilityIT.l16ExplainThreeWayPlanCompare / l16PrecomputeIsSingleIndexScanNoOrNoSort (seed 2000)
-- CREATE TABLE feed_visible AS SELECT :me AS viewer_id, fi.id AS feed_item_id, fi.first_highlighted_at
--   FROM feed_items fi WHERE <visible to me>;
-- CREATE INDEX ix_feed_visible ON feed_visible (viewer_id, first_highlighted_at DESC, feed_item_id DESC);
-- SELECT feed_item_id AS id, first_highlighted_at FROM feed_visible
--   WHERE viewer_id=:me ORDER BY first_highlighted_at DESC, feed_item_id DESC LIMIT 20
-- 읽기 포인트: 단일 Index Only Scan(커버링) — OR 도 조인도 Sort 도 없다. buffers shared hit=1(+2 read),
--            훑는 행 20. 단일 OR(122)·UNION(200) 대비 order-of-magnitude 적음 = CQRS 읽기 모델의 정체.

Limit  (cost=0.28..1.84 rows=20 width=24) (actual time=0.021..0.025 rows=20 loops=1)
  Buffers: shared hit=1 read=2
  ->  Index Only Scan using ix_feed_visible on feed_visible  (cost=0.28..117.22 rows=1500 width=24) (actual time=0.021..0.023 rows=20 loops=1)
        Index Cond: (viewer_id = :me)
        Heap Fetches: 20
        Buffers: shared hit=1 read=2
Planning Time: 0.102 ms
Execution Time: 0.034 ms
