Postgres : count (*) vs count (id)


11

나는 문서 에서 count(*)와 의 차이점을 보았습니다 count(pk). 나는 존재에 대해 모르고 count(pk)(어디서나 pk) 사용하고 있었다 .SERIAL PRIMARY KEYcount(*)

내 질문은 Postgres의 내부 최적화에 관한 것입니다. a SERIAL PRIMARY KEY가 모든 행에 존재하고 거짓이 아니며 행을 계산하거나 각 행에 대해 중복 술어 검사를 수행 한다는 것을 선택하는 것이 똑똑 합니까? 나는 이것이 무의미한 최적화 일 것임에 동의하지만 나는 단지 궁금합니다.

나는의 출력에서보고했다 EXPLAINEXPLAIN VERBOSE를 들어 count(*), count(id)하고 count(id > 50)있는지 확인하기 위해 EXPLAIN출력의 조건을 확인 언급했다. 그렇지 않습니다.

답변:


15

나는 지난 수년 동안 다양한 버전의 내 반복 시험에서 일관된 결과를 얻었다 :
count(*)있습니다 약간 보다 더 빨리 count(pk). 또한 짧고 대부분의 경우 테스트 대상에 더 적합합니다. 행의 존재.

에 관하여:

Postgres는 a SERIAL PRIMARY KEY가 모든 행에 존재하고 결코 거짓이 될 수 없다는 것을 알기에 충분히 똑똑합니까?

유일하게 관련된 것은 NOT NULL제약입니다. 는 PRIMARY KEY것입니다 NOT NULL자동, serial또는 never false질문에 직교한다.

count(col), 경우 PostgreSQL의 스마트하고 열이인지 시스템 카탈로그를 확인하려고했다 NOT NULL과 동등한으로 폴백을 count(*), 당신은 여전히 하나 더 룩업 시스템 테이블에보다이있을 것이다 count(*).

에 관해서는 EXPLAIN출력이 있습니다 힌트 :

EXPLAIN SELECT count(*) FROM ...

Aggregate  (cost=4963.38..4963.43 rows=1 width=0) ...


EXPLAIN SELECT count(pk) FROM ...

Aggregate  (cost=4963.38..4963.43 rows=1 width=4) ...

의미 count(col)는 로 정의되어 있어도 로 변환 되지 않습니다 .count(*)NOT NULL


여전히 새 버전의 경우입니까? 모든 쿼리에 대한 조회가 실제로 필요하지는 않을 것이라고 생각합니다 . 캐시 될 수 있습니다.
Ondra Žižka

1
Btw, NOT NULL열이 많으면 행이 많으면 차이가 큽니다 . 수백만 행의 경우 COUNT(*)3 배 더 빠릅니다. (Postgres 9.4)
Ondra Žižka
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.