COUNT(*)기본 키가있는 150,000 개의 행이있는 테이블을 시도했습니다 . 그것은 약 5 분 도구이므로 이것이 색인 문제라는 것을 알았습니다.
PostgreSQL 매뉴얼 인용 :
REINDEX는 인덱스 내용이 처음부터 다시 작성된다는 점에서 인덱스 삭제 및 재 작성과 유사합니다. 그러나 잠금 고려 사항은 다소 다릅니다. REINDEX는 인덱스의 상위 테이블에 대한 쓰기를 잠그지 만 읽기는 잠급니다. 또한 처리중인 특정 인덱스에 대해 독점 잠금을 수행하여 해당 인덱스를 사용하려는 읽기를 차단합니다 (...) 후속 CREATE INDEX는 쓰기를 잠급니다. 그러나 읽기는하지 않습니다. 인덱스가 없으므로 읽기가 인덱스를 사용하려고 시도하지 않습니다. 즉, 블로킹은 없지만 읽기는 비싼 순차적 스캔으로 강제 될 수 있습니다.
자신의 경험을 통해 다음과 같이 말할 수 있습니다.
- 인
REINDEXING위험? 데이터 일관성에 해를 끼칠 수 있습니까? - 시간이 많이 걸리나요?
- 내 시나리오에 대한 가능한 솔루션입니까?
최신 정보:
우리에게 도움이 된 해결책은 다른 이름으로 동일한 색인을 다시 만든 다음 이전 색인을 삭제하는 것이 었습니다.
인덱스 생성이 매우 빠르며 인덱스 크기를 650MB에서 8MB로 줄였습니다. COUNT(*)with를 사용하는 between데 3 초 밖에 걸리지 않습니다.
COUNT(*), 최선의 선택은 다음과 같습니다.If you are using count(*), the database is free to use any column to count, which means it can pick the smallest covering index to scan (note that this is why count(*) is much better than count(some_field), as long as you don't care if null values of some_field are counted). Since indexes often fit entirely in memory, this means count(*) is often very fast.