| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| 이전 | PostgreSQL : 문서 : 9.3 : 추가 제공 배트맨 토토 | 부록 F. 추가 제공 모듈 | PostgreSQL : 문서 : 9.3 : 토토array | |
그intagg모듈은 정수를 제공합니다 집계자 및 열거자입니다.intagg이다 이제 더 이상 사용되지 않습니다. 왜냐하면 다음을 제공하는 내장 함수가 있기 때문입니다. 해당 기능의 상위 집합입니다. 그러나 모듈은 여전히 제공됩니다. 내장 함수에 대한 호환성 래퍼로 사용됩니다.
집계자는 집계 함수입니다.int_array_aggregate(정수)그것은
공급되는 정수를 정확히 포함하는 정수 배열입니다. 이것은
래퍼array_agg, 이는
모든 배열 유형에 대해 동일합니다.
열거자는 함수입니다.int_array_enum(정수[])반환정수 집합. 본질적으로 역동작이다
수집자: 정수 배열이 주어지면 이를 집합으로 확장합니다.
행. 이것은 래퍼입니다.unnest, 모든 배열에 대해 동일한 작업을 수행합니다.
유형.
많은 데이터베이스 시스템에는 일대다 테이블 개념이 있습니다. 이러한 테이블은 일반적으로 두 개의 인덱스 테이블 사이에 위치합니다. 예:
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 왼쪽;
이것은 왼쪽 항목당 하나의 행이 있는 테이블을 생성하며 올바른 항목의 배열. 이제 이것은 어떤 방법 없이는 꽤 쓸모가 없습니다 배열을 사용하는 것; 이것이 바로 배열 열거자가 있는 이유입니다. 너 할 수 있다
SELECT left, int_array_enum(right) FROM 요약 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 개수로 주문;