2012-12-13 1 views
4

슬로우 카운트 (*) 이전 버전 9.2에 관한 몇 가지 토론이 있습니다 (postgres 웹의 공식 게시물 포함). 어떻게 든 나는 만족스러운 대답을 찾지 못했습니다.postgresql 9.2의 슬로우 카운트 (*)

기본적으로 나는 9.1가 설치 포스트 그레스가 있고, 나는 100,000 +의 기록이있는 테이블에서

select count(*) from restaurants; 

만큼 간단 느린 COUNT (*)를 관찰했다. 평균 요청은 850ms입니다. Postgres 9.2가 인덱스 전용 스캔과 같은 몇 가지 새로운 기능을 가지고 있기 때문에 사람들이 포스트 그레스 9.1 이하의 느린 카운트에 대해 말한 증상이라고 생각했습니다. 9.1의 동일한 데이터 세트를 사용하여이를 실험하고 9.2에 배치하려고합니다. 나는 count 문을 호출하고 여전히 9.1과 같은 나쁜 결과를 준다.

explain analyze select count(*) from restaurants; 
------------------------------------------------------------------ 
Aggregate (cost=23510.35..23510.36 rows=1 width=0) (actual time=979.960..979.961 rows=1 loops=1) 
    -> Seq Scan on restaurants (cost=0.00..23214.88 rows=118188 width=0) (actual time=0.050..845.097 rows=118188 loops=1) 
Total runtime: 980.037 ms 

누구든지이 문제에 대한 가능한 해결책을 제안 할 수 있습니까? 이 기능을 사용하려면 포스트 그레스에 대한 설정이 필요합니까?

P. where 내 경우에도 도움이되지 않습니다.

+3

https://wiki.postgresql.org/wiki/Index-only_scans를 읽었습니까? 거기에'카운트'와 한계에 대한 논의가 있습니다. 해당 테이블에 기본 키가 있습니까? 데이터를로드 한 후 테이블을 VACUUM 및 ANALYZE 했습니까? –

+0

또한'random_page_cost'와'seq_page_cost'는 무엇으로 설정되어 있습니까? 'effective_cache_size'는 어떻습니까? –

+0

크레이그에게 감사드립니다. 나는 당신이 제안한대로 그것을 읽고 VACUUM을했고, 여하튼 그것은 850ms에서 400ms로 속도를 향상시킵니다. 아직도 400ms는 값 비싼 시간입니다. 거기에 어떤 추가 튜닝이 방법을 수정하는 방법 있나요? – Ream

답변

2

인덱스를 참조하십시오는 위키 항목 검사 : 특히

를, 내가 인용 :

그것은 정말이에요 중요하다 플래너는 쿼리의 총 비용을 최소화하기 위해 을 고려해야합니다. 데이터베이스의 경우 일반적으로 I/O의 비용이 우선적입니다. 따라서 인덱스가 술어가없는 "count (*)"쿼리는 인덱스가 테이블보다 훨씬 작은 경우에만 인덱스 전용 검색을 사용합니다. 이것은 일반적으로 테이블의 행 너비가 일부 인덱스보다 훨씬 넓은 경우에만 발생합니다. '

가시성 맵을 유지하려면 VACUUMANALYZE의 토론을 참조하십시오. 본질적으로는 VACUUM을보다 적극적으로 만들고 싶을 때 먼저 테이블을로드 한 후 수동으로 VACUUM ANALYZE 테이블을 원할 것입니다.