3.2 Skew와 histogram
Most common values(MCV)는 빈도가 높은 값을 개별로 보존하고 histogram은 나머지 분포를 구간으로 요약합니다. 하나의 평균 selectivity로 skewed tenant를 설명할 수 없습니다.
SELECT status, count(*)
FROM orders
GROUP BY status
ORDER BY count(*) DESC;
EXPLAIN SELECT * FROM orders WHERE status = 'paid';
EXPLAIN SELECT * FROM orders WHERE status = 'refunded';
paid가 대부분이면 seq scan이 합리적인 반면 드문 refunded에는 index가 유리할 수 있습니다. 같은 column이라도 literal에 따라 plan이 달라집니다.
Prepared statement
Prepared statement는 custom plan과 generic plan 중 하나를 사용합니다. Parameter 분포가 매우 치우치면 하나의 generic plan이 일부 값에 나쁠 수 있습니다.
PREPARE by_status(text) AS
SELECT * FROM orders WHERE status = $1;
EXPLAIN (ANALYZE, BUFFERS) EXECUTE by_status('paid');
EXPLAIN (ANALYZE, BUFFERS) EXECUTE by_status('refunded');
plan_cache_mode는 원인 확인 실험에 사용할 수 있지만 global 해법으로 고정하기 전 planning overhead와 전체 workload를 비교합니다.
Histogram 경계는 exact row list가 아닙니다. Sample과 bucket 수에 따라 변하므로 distribution이 바뀌면 다시 ANALYZE합니다.