그intagg모듈은 배트맨 토토 수집기와 열거자를 제공합니다.intagg은 해당 기능의 상위 집합을 제공하는 내장 함수가 있기 때문에 이제 더 이상 사용되지 않습니다. 그러나 모듈은 여전히 내장 함수에 대한 호환성 래퍼로 제공됩니다.
집계자는 집계 함수입니다.int_array_aggregate(배트맨 토토)이는 공급된 배트맨 토토를 정확히 포함하는 배트맨 토토 배열을 생성합니다. 이것은 래퍼입니다.array_agg, 모든 배열 유형에 대해 동일한 작업을 수행합니다.
열거자는 함수입니다.int_array_enum(배트맨 토토[])반환배트맨 토토 집합. 이는 기본적으로 집계자의 반대 작업입니다. 주어진 배트맨 토토 배열을 행 집합으로 확장합니다. 이것은 래퍼입니다.unnest, 모든 배열 유형에 대해 동일한 작업을 수행합니다.
많은 데이터베이스 시스템에는 다대다 테이블 개념이 있습니다. 이러한 테이블은 일반적으로 두 개의 인덱스 테이블 사이에 위치합니다. 예를 들면 다음과 같습니다.
CREATE TABLE left_table (ID INT PRIMARY KEY, ...);
CREATE TABLE right_table (id INT PRIMARY KEY, ...);
CREATE TABLE Many_to_many(id_left INT REFERENCES left_table,
id_right INT 참조 right_table);
일반적으로 다음과 같이 사용됩니다:
right_table을 선택하세요.*
FROM right_table JOIN Many_to_many ON (right_table.id = Many_to_many.id_right)
여기서 Many_to_many.id_left =항목;
이것은 왼쪽 테이블의 항목에 대해 오른쪽 테이블의 모든 항목을 반환합니다. 이는 SQL에서 매우 일반적인 구성입니다.
이제 이 방법은 항목 수가 너무 많아서 번거로울 수 있습니다.many_to_many테이블. 종종 이와 같은 조인으로 인해 특정 왼쪽 항목에 대한 테이블의 각 오른쪽 항목에 대한 인덱스 스캔 및 가져오기가 발생합니다. 매우 역동적인 시스템을 갖고 있다면 할 수 있는 일이 많지 않습니다. 그러나 상당히 정적인 일부 데이터가 있는 경우 애그리게이터를 사용하여 요약 테이블을 만들 수 있습니다.
다음으로 테이블 요약 작성 SELECT id_left, int_array_aggregate(id_right) AS 권한 Many_to_many에서 그룹별 id_left;
이것은 왼쪽 항목당 하나의 행과 오른쪽 항목의 배열로 구성된 테이블을 생성합니다. 이제 이것은 배열을 사용하는 방법이 없으면 꽤 쓸모가 없습니다. 이것이 바로 배열 열거자가 있는 이유입니다. 당신은 할 수 있습니다
SELECT id_left, int_array_enum(rights) 요약 WHERE id_left =항목;
위 쿼리는 다음을 사용하여int_array_enum다음과 동일한 결과를 생성합니다
many_to_many에서 id_left, id_right를 선택하세요. WHERE id_left =항목;
차이점은 요약 테이블에 대한 쿼리는 테이블에서 단 하나의 행만 가져와야 하는 반면, 직접 쿼리는 테이블에서 하나의 행만 가져와야 한다는 것입니다.many_to_many인덱스 스캔을 수행하고 각 항목에 대한 행을 가져와야 합니다.
한 시스템에서는,설명비용이 8488인 쿼리가 비용이 329로 감소한 것으로 나타났습니다. 원래 쿼리는 다음과 관련된 조인이었습니다.many_to_many다음으로 대체된 테이블:
SELECT id_right, count(id_right) FROM
( SELECT id_left, int_array_enum(rights) AS id_right
요약에서
JOIN(left_table에서 ID 선택
ID =는 어디입니까?항목) AS 왼쪽
ON (summary.id_left = lefts.id)
) AS 목록
id_right로 그룹화
DESC 개수로 주문;
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.