답변:
공식 위키 페이지는 그에 대한 답변을 제공합니다 :
[...] 이것이 느린 이유는 PostgreSQL의 MVCC 구현과 관련이 있습니다. 여러 트랜잭션이 서로 다른 상태의 데이터를 볼 수 있다는 사실은 "COUNT (*)"가 전체 테이블에서 데이터를 요약 할 수있는 직접적인 방법이 없다는 것을 의미합니다. PostgreSQL은 어떤 의미에서든 모든 행을 통과해야합니다. 이는 일반적으로 테이블의 모든 행에 대한 정보를 순차적으로 읽는 결과를 낳습니다. [...]
또한 ANALYZE 를 사용하여 쿼리 플래너에 대한 정보를 다시 작성할 수 있습니다.
사용하면 더 나은 성능을 얻을 수 COUNT(an uniquly indexed field)
있지만 이것이 매우 큰 경우 seq 스캔이 유일한 방법입니다.
매우 빠른 숫자가 필요하고 스키마 쿼리를 두려워하지 않는 경우 다음을 수행 할 수 있습니다.
SELECT reltuples FROM pg_class WHERE oid = 'your_table'::regclass
그러나이 값은 테이블에서 "추정 된"(정확한 경우도 있지만) 튜플 수이므로이 값에 의존하지 마십시오.
EXPLAIN SELECT * from your_table;
입니다. 쿼리가 실행되지 않습니다. 출력에는 rows=…
예상 행 수가 포함 됩니다.
COUNT(pk)
성능을 향상시킬 수 있는 곳 은 읽지 않았습니다 . 나는 그것이 항상 seq-scan을 할 것이라고 생각한다