본문으로 건너뛰기

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 조건을 검토합니다.