Intagg모듈 제공 정수 애그리 게이터 및 열거 자.Intagg는 이제 쓸모가 없습니다 기능의 슈퍼 세트를 제공하는 내장 기능. 그러나 모듈은 여전히 호환 래퍼로 제공됩니다. 내장 기능 주변.
애그리 게이터는 골재 기능입니다int_array_aggregate (Integer)
정수가 포함 된 정수 배열은 공급됩니다. 이것
래퍼array_agg
,
모든 배열 유형에 대해 동일한 작업을 수행합니다.
열거자는 함수입니다int_array_enum (integer [])
반환정수 세트. 그것은 본질적으로입니다
집계 자의 역 작동 : 배열이 주어집니다
정수, 행 세트로 확장하십시오. 이것은 포장지입니다
약Unnest
모든 배열 유형에 대해서도 동일합니다.
많은 데이터베이스 시스템에는 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 (오른쪽) 요약 왼쪽 =item;
위의 쿼리 사용int_array_enum
동일한 결과를 생성합니다
처럼
One_to_many에서 왼쪽을 선택하십시오.항목;
차이점은 요약 테이블에 대한 쿼리입니다. 테이블에서 한 줄만 가져와야하는 반면 직접 쿼리ONE_TO_MANY필수 인덱스 스캔 및 각 항목에 대한 행을 가져옵니다.
하나의 시스템에서설명8488의 비용을 가진 쿼리는 329의 비용으로 줄었습니다. 원래 쿼리는와 관련된 조인이었습니다.ONE_TO_MANY테이블, 다음으로 대체되었습니다.
오른쪽을 선택하고, 카운트 (오른쪽) (오른쪽으로 int_array_enum (오른쪽)을 선택하십시오 Summary Join (Left_table에서 Left_table에서 왼쪽을 선택하십시오 =항목) lefts로 on (summary.left = lefts.left) ) 목록으로 오른쪽으로 그룹 Count Desc의 주문;