4.1 Seq, Index, Bitmap Scan
Planner는 조건에 맞는 row 비율과 heap 접근 비용을 비교해 scan을 선택합니다.
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE id = 100;
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders WHERE status = 'paid';
- Seq Scan: table의 많은 page가 필요할 때 효율적입니다.
- Index Scan: 적은 row를 찾고 heap 접근 순서가 충분히 저렴할 때 유리합니다.
- Bitmap Scan: 여러 index hit를 모아 heap page 단위로 접근합니다.
Bitmap Heap Scan의 Recheck Cond와 lossy block을 확인합니다. Bitmap이 work_mem을 초과하면 exact tuple 위치 대신 page 단위가 돼 filter 재검사가 늘 수 있습니다.
Cost와 cache
random_page_cost, seq_page_cost, effective_cache_size는 hardware를 직접 benchmark한 값이 아니라 planner의 상대 cost와 cache 기대를 나타냅니다. 특정 query에 index를 강제하려고 값을 왜곡하지 않습니다.
Index 추가 전 읽기 이득과 write, vacuum, storage 비용을 함께 계산합니다. 조건 selectivity가 시간에 따라 변하면 plan도 달라질 수 있습니다.