0

저는 PostgreSQL의 초보자입니다. 나는 순서로, 총 호출에 LIMIT 조항을 삽입하는 방법을 발견 havn't는PostgreSQL 제한 성능이있는 집계 그룹

SELECT s.id, s.name, s.url, 
     (SELECT array_agg(p.url) 
     FROM (
      SELECT url 
      FROM pages 
      WHERE site_id = s.id ORDER BY created DESC LIMIT 5 
     ) as p 
     ) as last_pages 
FROM sites s 

: 다음 쿼리의 실행 시간을 개선 할 수있는 방법이있다.

테이블 pagescreated (timestamp)와 site_id (integer)에 의해 인덱스가 있지만 pages.site_idsites.id에서 외래 키는 불행하게도, 존재하지 않는다. 이 쿼리는 가장 최근에 생성 된 5 개의 하위 목록이있는 사이트 목록을 반환하기위한 것입니다.

PostgreSQL 버전은 9.1.5입니다.

+1

쿼리가 수행해야 할 작업을 설명하고 테이블, 관계 등 데이터에 대한 일반 정보를 제공하면 도움이되는 경우가 많습니다. 사용 가능한 옵션에 영향을 줄 수있는 모든 질문에 PostgreSQL 버전을 지정하십시오. 'EXPLAIN ANALYZE' 결과를 보여줍니다. [tag : postgresql-performance]의 정보 페이지를보십시오. –

+0

질문을 편집하여 정보를 추가하는 것이 가장 좋습니다. http://stackoverflow.com/tags/postgresql-performance/info –

+0

Craig의 링크 외에도 http://wiki.postgresql.org/wiki/SlowQueryQuestions –

답변

2

데이터베이스 관리 시스템처럼 생각해야합니다. 또한 데이터베이스에서 무엇을 묻는 지 신중히 생각해야합니다.

여기에서 근본적인 문제는 순차적 스캔이 상당히 빠를 때 개별 색인 전화가 매우 많이 발생한다는 것입니다. 현재 질의는 상관 관계가 있어야하는 서브 쿼리가 있기 때문에 플래너에게는 거의 융통성이 없습니다.

뷰 (인라인 여부) 및 윈도우 기능을 것이 할 수있는 더 나은 방법 :

SELECT s.id, s.name, s.url, array_agg(p.url) 
    FROM sites s 
    JOIN (select site_id, url, 
        row_number() OVER (partition by site_id order by created desc) as num 
      from pages) p on s.id = p.site_id 
    WHERE num <= 5; 

이 가능성이 하나의 큰 순차 검색에 인덱스 스캔의 매우 큰 수를 변경합니다 .

+0

내 문제는 제한을 수행하는 방법이었습니다 (변수)를 복잡한 집계 함수에서 사용하면 멋지게 해결됩니다. 나는 이것이 정답으로 강요되어야한다고 생각한다. – gooddadmike