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

F.18. 젠 토토 - 정수 애그리 게이터 및 열거 자#

the젠 토토모듈은 정수 애그리 게이터와 열거자를 제공합니다.젠 토토는 기능의 대체 세트를 제공하는 내장 기능이 있기 때문에 이제는 더 이상 사용되지 않습니다. 그러나 모듈은 여전히 ​​내장 기능 주변의 호환 래퍼로 제공됩니다.

F.18.1. 기능#

애그리 게이터는 골재 기능입니다int_array_aggregate (Integer)공급 된 정수를 포함하는 정수 배열을 생성합니다. 이것은 주위의 포장지입니다array_agg, 모든 배열 유형에 대해 동일한 작업을 수행합니다.

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

F.18.2. 샘플 용도#

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

left_table 테이블 작성 (ID int 기본 키, ...);
테이블 작성 right_table (id int 기본 키, ...);
테이블 만들기 many_to_many (id_left int 참조 left_table,
                          id_right int 참조 right_table);

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

right_table을 선택하십시오.*
right_table join many_to_many on (right_table.id = many_to_many.id_right)
where many_to_many.id_left =항목;

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

이제,이 방법론은 매우 많은 수의 항목으로 번거 롭을 수 있습니다mang_to_many테이블. 종종, 이와 같은 조인은 특정 왼손 입력에 대한 테이블의 각 오른손 항목에 대한 인덱스 스캔과 페치를 초래할 수 있습니다. 매우 역동적 인 시스템이 있다면 할 수있는 일은 많지 않습니다. 그러나 정적으로 정적 인 데이터가있는 경우 Aggregator와 함께 요약 테이블을 만들 수 있습니다.

테이블 요약을 작성하십시오
  id_left, int_array_aggregate (id_right)를 권한으로 선택하십시오
  many_to_many에서
  id_left에 의해 그룹;

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

id_left, int_array_enum (권한)을 선택 선택 id_left =항목;

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

id_to_many에서 id_left, id_right를 선택하십시오. id_left =항목;

차이점은 요약 테이블에 대한 쿼리가 테이블에서 한 행만 가져와야하는 반면, 직접 쿼리는입니다.many_to_many각 항목에 대해 스캔하고 행을 가져와야합니다.

하나의 시스템에서설명8488의 비용으로 쿼리가 329의 비용으로 줄어드는 것을 보여주었습니다. 원래 쿼리는과 관련된 조인이었습니다.mange_to_many테이블, 대체 된 테이블 :

id_right, count (id_right)를 선택하십시오
  (ID_LIFT, int_array_enum (권한)을 id_right로 선택하십시오
    요약에서
    가입 (Left_table에서 ID를 선택하십시오
          여기서 id =항목) 리프트로
    on (summary.id_left = lefts.id)
  ) 목록으로
  id_right에 의해 그룹
  Count Desc의 주문;