2025년 9월 25일:토토 커뮤니티 : 토토
이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.배트맨 토토 : 문서 : 17 : F.18. Intagg - 배트맨 토토 애그리 게이터 및 열거 자버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

F.17. 인태그

intagg모듈은 다음을 제공합니다. 정수 집계자와 열거자.intagg이제 더 이상 사용되지 않습니다. 해당 기능의 상위 집합을 제공하는 내장 기능입니다. 그러나 모듈은 여전히 ​​호환성 래퍼로 제공됩니다. 내장 함수에 대해 설명합니다.

F.17.1. 기능

집계자는 집계 함수입니다.int_array_aggregate(정수)그것은 공급되는 정수를 정확히 포함하는 정수 배열입니다. 이것 래퍼입니다array_agg, 이는 모든 배열 유형에 대해 동일한 작업을 수행합니다.

열거자는 함수입니다.int_array_enum(정수[])반환정수 집합. 그것은 본질적으로 수집기의 반대 작업: 주어진 배열 정수인 경우 행 집합으로 확장합니다. 이건 포장지야 약unnest, 이는 다음을 수행합니다. 모든 배열 유형에 대해 동일합니다.

F.17.2. 샘플 사용

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

CREATE TABLE 롤 토토(ID INT PRIMARY KEY, ...);
CREATE TABLE right (id INT PRIMARY KEY, ...);
CREATE TABLE one_to_many(롤 토토 INT REFERENCES 롤 토토, 오른쪽 INT REFERENCES 오른쪽);

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

오른쪽에서 선택.* 오른쪽에서 JOIN one_to_many ON (right.id = one_to_many.right)
  one_to_many.left = 어디에서?항목;

이것은 오른쪽 테이블의 모든 항목을 반환합니다: 왼쪽 테이블의 항목입니다. 이것은 매우 흔한 일이다 SQL로 구성합니다.

이제 이 방법론은 규모가 매우 커서 번거로울 수 있습니다. 의 항목 수one_to_many테이블. 종종 이와 같은 조인이 인덱스 스캔이 발생하고 각 오른손에 대한 가져오기가 수행됩니다. 특정 왼손 항목에 대한 테이블 항목입니다. 당신이 매우 역동적인 시스템을 갖고 있기 때문에 할 수 있는 일이 많지 않습니다. 그러나 상당히 정적인 데이터가 있는 경우 다음을 수행할 수 있습니다. 애그리게이터를 사용하여 요약 테이블을 생성합니다.

다음으로 테이블 요약 생성
  SELECT 왼쪽, int_array_aggregate(오른쪽) AS 오른쪽
  일대다에서
  GROUP BY 왼쪽;

이것은 왼쪽 항목당 하나의 행이 있는 테이블을 생성하며 올바른 항목의 배열. 이제 이것은 일부가 없으면 꽤 쓸모가 없습니다. 배열을 사용하는 방법; 그래서 배열이 있는 거야 열거자. 당신은 할 수 있습니다

롤 토토 선택, int_array_enum(오른쪽) 요약 WHERE 롤 토토 =항목;

위 쿼리는int_array_enum동일한 결과를 생성합니다 처럼

일대다 WHERE 롤 토토에서 롤 토토, 오른쪽 선택 =항목;

차이점은 요약 테이블에 대한 쿼리가 테이블에서 단 하나의 행만 가져와야 하는 반면 직접 쿼리one_to_many반드시 색인을 스캔하고 각 항목에 대한 행을 가져옵니다.

한 시스템에서,설명표시됨 비용이 8488이었던 쿼리는 비용이 329로 줄었습니다. 원래 쿼리는 다음과 관련된 조인이었습니다.one_to_many다음으로 대체된 테이블:

SELECT 오른쪽, 개수(오른쪽) FROM
  ( SELECT 왼쪽, int_array_enum(오른쪽) AS 오른쪽
    FROM 요약 JOIN(왼쪽 선택 FROM left_table WHERE 왼쪽 =항목) AS 롤 토토
         ON (요약.롤 토토 = 롤 토토.롤 토토)
  ) AS 목록
  GROUP BY 오른쪽
  DESC 개수로 주문;