이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다배트맨 토토 : 문서 : 17 : F.18. Intagg - 배트맨 토토 애그리 게이터 및 열거 자버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

F.17. intagg

theIntagg모듈은 정수를 제공합니다 골재 및 열거 자.IntaggIS 이제는 쓸모없고 그 기능의 슈퍼 세트. 그러나 모듈은 여전히 ​​제공됩니다 내장 기능 주변의 호환 래퍼로.

F.17.1. 기능

애그리 게이터는 골재 기능입니다int_array_aggregate (Integer)정수가 포함 된 정수 배열은 공급됩니다. 이것은 a입니다 래퍼array_agg배열 유형에 대해서도 같은 것입니다.

열거자는 함수입니다int_array_enum (integer [])반환정수 세트. 본질적으로 역 작동입니다 집계 자 : 정수 배열이 주어지면 세트로 확장하십시오. 줄의. 이것은 주위의 포장지입니다Unnest, 모든 배열에 대해 동일한 작업을 수행합니다 유형.

F.17.2. 견본 사용

많은 데이터베이스 시스템에는 1 ~ 많은 테이블이라는 개념이 있습니다. 이러한 테이블은 일반적으로 두 개의 인덱스 테이블 사이에 있습니다. 예:

테이블 생성 왼쪽 (id int 기본 키, ...);
오른쪽 테이블 작성 (ID int 기본 키, ...);
테이블 생성 one_to_many (왼쪽 int 참조 왼쪽, 오른쪽 참조 오른쪽);

일반적으로 다음과 같이 사용됩니다 :

오른쪽에서 선택하십시오.
  여기서 one_to_many.left =항목;

이것은 오른쪽 테이블의 모든 항목을 왼손 테이블에 입력. 이것은 매우 일반적인 구조입니다 SQL.

이제이 방법론은 매우 많은 수로 번거 롭을 수 있습니다. 의 항목ONE_TO_MANY테이블. 종종 이와 같은 조인은 인덱스 스캔과 페치를 초래할 수 있습니다. 특정 왼손에 대한 테이블의 각 오른손 항목에 대해 기입. 매우 역동적 인 시스템이 있다면 할 수있는 일은 많지 않습니다. 하다. 그러나 상당히 정적 인 데이터가 있으면 애그리 게이터로 요약 테이블을 만듭니다.

테이블 요약을 작성하십시오
  오른쪽으로 왼쪽, int_array_aggregate (오른쪽)를 선택하십시오
  ONE_TO_MANY에서
  왼쪽 그룹;

이것은 왼쪽 항목 당 하나의 행이있는 테이블과 올바른 항목 배열. 이제 이것은 어떤 방법 없이는 꽤 쓸모가 없습니다 배열 사용 그렇기 때문에 배열 열거자가 있습니다. 너 할 수 있습니다

왼쪽 선택, int_array_enum (오른쪽) 요약 왼쪽 =항목;

위의 쿼리 사용int_array_enum와 동일한 결과를 생성합니다

SELECT left, right FROM one_to_many WHERE left =항목;

차이점은 요약 테이블에 대한 쿼리에 테이블에서 한 줄만 얻으려면 직접 쿼리 에 맞서ONE_TO_MANY인덱스 스캔을해야합니다 각 항목에 대한 행을 가져 오십시오.

하나의 시스템에서설명8488의 비용을 가진 쿼리는 329의 비용으로 줄었습니다. 원래 쿼리는와 관련된 조인이었습니다.ONE_TO_MANY테이블, 대체 된 테이블 :

오른쪽을 선택하고, 카운트 (오른쪽)
  (오른쪽으로 int_array_enum (오른쪽)을 선택하십시오
    Summary Join (Left_table에서 Left_table에서 왼쪽을 선택하십시오 =항목) 리프트로
         on (summary.left = lefts.left)
  ) 목록으로
  오른쪽으로 그룹
  Count Desc의 주문;