4.4 Partial, expression index
Partial index는 predicate를 만족하는 row만 저장하고 expression index는 계산 결과를 key로 저장합니다.
CREATE INDEX orders_open_created_idx
ON orders (created_at DESC)
WHERE status IN ('pending', 'processing');
CREATE INDEX customers_lower_email_idx
ON customers (lower(email));
Query predicate가 partial index predicate를 planner가 증명할 수 있어야 합니다.
SELECT * FROM orders
WHERE status = 'pending'
ORDER BY created_at DESC
LIMIT 100;
Parameterized predicate는 planning 시점에 implication을 증명하지 못할 수 있습니다. 실제 prepared statement plan을 시험합니다.
Expression index는 read 시 계산을 줄일 수 있지만 INSERT와 UPDATE 때 expression을 계산하고 저장합니다. Function volatility와 collation도 검토합니다.
운영 확인
SELECT indexrelname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes
WHERE relname IN ('orders', 'customers');
idx_scan=0만으로 즉시 삭제하지 않습니다. 통계 reset 시각, 월말 job, constraint와 replica workload를 확인하고 DROP INDEX CONCURRENTLY의 lock과 failure 조건을 검토합니다.