2013-06-03 3 views
1

거의 1 백만 개의 행을 가진 상당히 큰 테이블을 가지고 있으며 쿼리 중 일부는 길이가 (1 분 이상)입니다. 여기이 SQL 쿼리를 Postgres에서 어떻게 최적화 할 수 있습니까?

그래서

EXPLAIN ANALYZE SELECT "apps".* FROM "apps" WHERE "apps"."kind" = 'software' ORDER BY itunes_release_date DESC, rating_count DESC LIMIT 12; 
                  QUERY PLAN                
--------------------------------------------------------------------------------------------------------------------------------- 
Limit (cost=153823.03..153823.03 rows=12 width=2091) (actual time=162681.166..162681.194 rows=12 loops=1) 
    -> Sort (cost=153823.03..154234.66 rows=823260 width=2091) (actual time=162681.159..162681.169 rows=12 loops=1) 
     Sort Key: itunes_release_date, rating_count 
     Sort Method: top-N heapsort Memory: 48kB 
     -> Seq Scan on apps (cost=0.00..150048.41 rows=823260 width=2091) (actual time=0.718..161561.149 rows=808554 loops=1) 
       Filter: (kind = 'software'::text) 
Total runtime: 162682.143 ms 
(7 rows) 

, 내가 그걸 어떻게 최적화 것 ... 나에게 특히 힘든 시간을주고 하나? PG 버전은 9.2.4, FWIW입니다.

이미 kindkind, itunes_release_date에 대한 색인이 있습니다.

+0

귀하의 질문에 대답하지 않지만 1 백만 개의 레코드가 있다면'software''와 같은'varchars'를 반복하지 말고'app'의 숫자 참조를 사용하여'app_kind' 테이블을 만드는 것이 좋습니다. –

+1

@ LukasEder : 또는 기존 쿼리를 변경하지 않고 열거 형을 사용할 수 있습니다. –

답변

3

색인이 누락 된 것처럼 보입니다. (kind, itunes_release_date desc, rating_count desc)에 있습니다.

+1

'kind'에 대한 색인으로 충분합니까? 추가 열이 정렬 속도를 어느 정도인지 확신 할 수 없습니다. – AngerClown

+0

@AngerClown 이미 kind에 인덱스가 있습니다. – Shpigford

+0

kind에 대한 인덱스가 유용 할 수 있지만 여전히 top-n 정렬을 생성합니다. 최상위 12를 직접 얻기 위해 색인을 사용하려면 OP는 색인의 정렬 열을 (모두) 추가해야합니다. –

0

apps 테이블의 크기는 어느 정도입니까? 적어도이 포스트잇에 할당 된 메모리가 많습니까? 매번 디스크에서 읽어야 할 경우 쿼리 속도가 훨씬 느려집니다.

또 다른 도움이되는 것은 'apps'열에 표를 클러스터하는 것입니다. 모든 software 행이 디스크에 순차적으로 저장되므로 디스크 액세스 속도가 빨라질 수 있습니다.

+0

쿼리가 전체 검색 및 정렬을 요구하므로 클러스터링이 도움이되지 않습니다. Postgres의 메모리 할당은 도움이 될 수 있지만 그다지 도움이되지 못합니다. –

0

이 쿼리의 속도를 향상시키는 유일한 방법은 (itunes_release_date, rating_count)에 복합 인덱스를 만드는 것입니다. Postgres는 인덱스에서 처음 N 행을 직접 선택할 수 있습니다.

관련 문제