Files
document-haness/docs/n+1liner/final/evidence/raw/explain/l15-visibility-or-probe.txt
T

34 lines
2.7 KiB
Plaintext
Executable File

-- L15 probe (→ L16): keyset + visibility OR/EXISTS — the sort-key index is lost
-- FeedKeysetIT.l15ProbeVisibilityOrBreaksKeysetIndex (seed 2000, ix_feed_items_keyset present)
-- SELECT fi.id, fi.first_highlighted_at FROM feed_items fi
-- WHERE (fi.visibility='PUBLIC'
-- OR (fi.visibility='MENTIONED' AND EXISTS(SELECT 1 FROM feed_item_mentions m WHERE m.feed_item_id=fi.id AND m.mentioned_user_id=:me))
-- OR (fi.visibility='PRIVATE' AND fi.user_id=:me))
-- AND (fi.first_highlighted_at, fi.id) < (:cursor)
-- ORDER BY fi.first_highlighted_at DESC, fi.id DESC LIMIT 20
-- 읽기 포인트: ix_feed_items_keyset(정렬키) 를 못 탄다. 대신 BitmapOr(visibility 3분기 각각 ix_feed_items_visibility_sort)
-- + BitmapAnd(private = visibility ∩ user_id) + SubPlan(mentions EXISTS). bitmap 은 순서를 안 주므로
-- Sort 노드가 재등장 = keyset 의 "순서 seek, Sort 없음" 이점 소멸 → L16(UNION 분해로 각 분기를 정렬 보장 인덱스로).
Limit (cost=100.32..100.34 rows=5 width=24) (actual time=0.189..0.193 rows=13 loops=1)
Buffers: shared hit=26
-> Sort (cost=100.32..100.34 rows=5 width=24) (actual time=0.188..0.190 rows=13 loops=1)
Sort Key: fi.first_highlighted_at DESC, fi.id DESC
-> Bitmap Heap Scan on feed_items fi (actual time=0.114..0.178 rows=13 loops=1)
Recheck Cond: (((visibility='PUBLIC') AND (ROW(first_highlighted_at, id) < ROW(cursor)))
OR ((visibility='MENTIONED') AND (ROW(first_highlighted_at, id) < ROW(cursor)))
OR ((visibility='PRIVATE') AND (ROW(first_highlighted_at, id) < ROW(cursor)) AND (user_id = :me)))
Filter: ((visibility='PUBLIC') OR ((visibility='MENTIONED') AND (SubPlan 1)) OR ((visibility='PRIVATE') AND (user_id = :me)))
Rows Removed by Filter: 3
-> BitmapOr (actual time=0.093..0.094 rows=0 loops=1)
-> Bitmap Index Scan on ix_feed_items_visibility_sort (Index Cond: visibility='PUBLIC' AND ROW(...) < ROW(cursor))
-> Bitmap Index Scan on ix_feed_items_visibility_sort (Index Cond: visibility='MENTIONED' AND ROW(...) < ROW(cursor))
-> BitmapAnd
-> Bitmap Index Scan on ix_feed_items_visibility_sort (Index Cond: visibility='PRIVATE' AND ROW(...) < ROW(cursor))
-> Bitmap Index Scan on uq_feed_items_user_page (Index Cond: user_id = :me)
SubPlan 1
-> Index Only Scan using uq_feed_item_mentions on feed_item_mentions m (loops=4)
Index Cond: ((feed_item_id = fi.id) AND (mentioned_user_id = :me))
Planning Time: 0.319 ms
Execution Time: 0.325 ms