필드 ( uploaded_at
) 중 하나를로 설정하여 삽입이 많은 테이블이 있습니다 NULL
. 그런 다음 주기적 작업은 모든 튜플을 선택하고 WHERE uploaded_at IS NULL
처리하고 업데이트 uploaded_at
하여 현재 날짜로 설정 합니다.
테이블을 어떻게 인덱싱해야합니까?
나는 다음과 같은 부분 인덱스를 사용해야한다는 것을 이해합니다.
CREATE INDEX foo ON table (uploaded_at) WHERE uploaded_at IS NULL
또는 그런 것. 항상 인 필드에서 색인을 작성하는 것이 맞다면 혼란 스럽습니다 NULL
. 또는 b- 트리 인덱스를 사용하는 것이 올바른 경우. 해시는 더 좋은 아이디어처럼 보이지만 더 이상 사용되지 않으며 스트리밍 핫 스탠바이 복제를 통해 복제되지 않습니다. 모든 조언을 주시면 감사하겠습니다.
나는 다음 지수로 조금 실험했다.
"foo_part" btree (uploaded_at) WHERE uploaded_at IS NULL
"foo_part_id" btree (id) WHERE uploaded_at IS NULL
쿼리 플래너는 항상 foo_part
인덱스를 선택하는 것 같습니다 . explain analyse
또한 foo_part
색인에 대해 약간 더 나은 결과를 얻습니다.
Index Scan using foo_part on t1 (cost=0.28..297.25 rows=4433 width=16) (actual time=0.025..3.649 rows=4351 loops=1)
Index Cond: (uploaded_at IS NULL)
Total runtime: 4.060 ms
vs
Bitmap Heap Scan on t1 (cost=79.15..6722.83 rows=4433 width=16) (actual time=1.032..4.717 rows=4351 loops=1)
Recheck Cond: (uploaded_at IS NULL)
-> Bitmap Index Scan on foo_part_id (cost=0.00..78.04 rows=4433 width=0) (actual time=0.649..0.649 rows=4351 loops=1)
Total runtime: 5.131 ms
id
예를 들어 직렬 필드 일 수 있습니까?