PostgreSQL 의 파 티 션 테이블(partitioning)

PostgreSQL 은 매우 유용 한 기능 이 있 습 니 다.파 티 션 시트 나 paritioning.어떤 TABLE 의 기록 이 매우 많 고 천만,심지어 더 많 을 때 우 리 는 사실 그 를 서브 시트 로 나 눌 필요 가 있다.과일 창고 에 수많은 사과 복숭아 와 귤 이 난잡 하 게 쌓 여 있 는 것 처럼 찾기 가 불편 하고 성능 이 떨 어 지 는 거대 한 TABLE 은 창 고 를 세 개의 구역 으로 나 누 어 사과 복숭아 와 귤 을 나 누 어 놓 는 것 이 합 리 적 이다.큰 시계 한 장 이 세 개의 작은 시계 집합 으로 변 했다.
합 리 적 인 디자인 을 통 해 일정한 규칙 을 선택 하고 큰 시 계 를 여러 개의 무 겁 지 않 고 빠 뜨리 지 않 는 서브 시트 로 나 눌 수 있 습 니 다.이것 이 바로 전설의 paritioning 입 니 다.예 를 들 어 우 리 는 시간 에 따라 나 눌 수 있 고 매일 서브 시트 한 장 을 나 눌 수 있다.예 를 들 어 우 리 는 특정한 필드 에 따라 나 눌 수 있다.한 마디 로 하면 0 으로 나 누 어 조회 의 효 과 를 향상 시 키 는 것 이다.
어떻게 이 분 구 표 의 기능 을 실현 합 니까?
   1.큰 표를 작성 한다.
   2 파 티 션 계승 만 들 기
   3 정의 Rule 또는 Trigger?
다음은 간단 한 예 에 근거 하여 이 과정 을 묘사한다.우 리 는 학생 들 을 60 점 이하 와 60 점 이하 에 따라 두 장의 자 표 로 나 누 었 다.
   1.큰 표 만 들 기   

CREATE TABLE student (student_id bigserial, name varchar(32), score smallint)
   2.파 티 션 계승 을 만 듭 니 다.

CREATE TABLE student_qualified (CHECK (score >= 60 )) INHERITS (student) ;
CREATE TABLE student_nqualified (CHECK (score < 60)) INHERITS (student) ;
두 개의 파 티 션 시트 를 만 들 었 습 니 다.studentqualified 와 studentnqualified 는 대 표 student 의 모든 필드 를 계승 하 는 동시에 제약,즉 CHECK 조건 을 설정 했다.
3.Rule 또는 Trigger 를 정의 합 니 다.
   비록 우리 가 CHECK 조건 을 정 의 했 지만,student 에 데 이 터 를 삽입 할 때,PostgreSQL 은 score 가 60 보다 적 게 삽 입 된 정확 한 하위 테이블 인지 에 따라 데이터 에 대해 알려 줄 수 없습니다.왜냐하면,당신 은 이러한 규칙 을 정의 하지 않 았 기 때 문 입 니 다.Rule 이나 Trigger 를 정의 하고 데 이 터 를 정확 한 파 티 션 시트 에 삽입 해 야 합 니 다.
   먼저 Rule 의 정 의 를 보십시오.

CREATE OR REPLACE RULE insert_student_qualified 
AS ON INSERT TO student 
    WHERE score >= 60
    DO INSTEAD
    INSERT INTO student_qualified VALUES(NEW.*);

CREATE OR REPLACE RULE insert_student_nqualified 
AS ON INSERT TO student 
    WHERE score < 60
    DO INSTEAD
    INSERT INTO student_nqualified VALUES(NEW.*);
이 두 개의 Rule 은 PostgreSQL 에 게 총 표 에 데 이 터 를 삽입 할 때 score<60 이면 student 를 삽입 하 라 고 알려 주 었 다.nqualified,score>=60 이면 student 삽입qualified.주의 하 세 요.이 분할 은 반드시 중복 되 지 않 고 빠 뜨리 지 않 을 것 입 니 다.만약 에 우리 가 조심 하지 않 으 면>=60 조건 의'='을 잃 어 버 리 면 60 점 과 같은 기록 은 큰 표 student 에 기록 되 고 그 어떠한 분 구 표 에 도 기록 되 지 않 습 니 다.
우 리 는 기록 을 삽입 했다.

INSERT INTO student (name,score) VALUES('Jim',77);
INSERT INTO student (name,score) VALUES('Frank',56);
INSERT INTO student (name,score) VALUES('Bean',88);
INSERT INTO student (name,score) VALUES('John',47);
INSERT INTO student (name,score) VALUES('Albert','87');
INSERT INTO student (name,score) VALUES('Joey','60');
우 리 는 데이터 분포 상황 이 정확 한 구역 표 에 분포 되 었 는 지 살 펴 보 았 다.

SELECT p.relname,c.tableoid,c.* 
FROM student c, pg_class p
WHERE c.tableoid = p.oid
출력 은 다음 과 같 습 니 다:

우 리 는 비록 우리 가 큰 시 계 를 삽 입 했 지만 데 이 터 는 대응 하 는 파 티 션 서브 시트 가 존재 하 는 것 을 보 았 다.우리 의 기대 에 부합 하 다.조회 에 도 영향 을 주지 않 는 다.
Rule 은 분류 하 는 방법 이 고 TRIGGER 도 정확 한 데 이 터 를 정확 한 파 티 션 서브 시트 로 흐 르 게 할 수 있다.
우선 우 리 는 function 을 정의 합 니 다.

CREATE OR REPLACE FUNCTION student_insert_trigger()
RETURNS TRIGGER AS 
$$
BEGIN
   IF(NEW.score >= 60) THEN
     INSERT INTO student_qualified VALUES (NEW.*);
   ELSE 
     INSERT INTO student_nqualified VALUES (NEW.*);
   END IF;
   RETURN NULL;
END;
$$
LANGUAGE plpgsql ;
그리고 TRIGGER 를 정의 합 니 다.student 에 삽입 하기 전에 trigger 를 실행 합 니 다.

CREATE TRIGGER insert_student 
  BEFORE INSERT ON student
  FOR EACH row
  EXECUTE PROCEDURE student_insert_trigger() ;
우 리 는 먼저 TABLE student 을 삭제 하고 trigger 방식 을 테스트 합 니 다.

DROP TABLE STUDENT CASCADE

CREATE TABLE student (student_id bigserial, name varchar(32), score smallint) ;
CREATE TABLE student_qualified (CHECK (score >= 60 )) INHERITS (student) ;
CREATE TABLE student_nqualified (CHECK (score < 60)) INHERITS (student) ;
그리고 FUNCTION 을 정의 하고 TRIGGER 를 정의 하 는 문 구 를 실행 합 니 다.확인 할 수 있 습 니 다.
우리 의 트리거 가 확실히 작 동 했 는 지 확인 하기 위해 서 우 리 는 저장 과정의 통계 스위치 를 엽 니 다.
post gresql.conf 에서 track 찾기functions
track_functions = all
삽입 하기 전에 function studentinsert_trigger 의 통계 정보:

삽입 실행:

INSERT INTO student (name,score) VALUES('Jim',77);
INSERT INTO student (name,score) VALUES('Frank',56);
INSERT INTO student (name,score) VALUES('Bean',88);
INSERT INTO student (name,score) VALUES('John',47);
INSERT INTO student (name,score) VALUES('Albert','87');
INSERT INTO student (name,score) VALUES('Joey','60');
삽입 후 function studentinsert_trigger 의 통계 정보

우 리 는 trigger 가 6 번 촉발 하 는 것 을 보 았 다.
다음 검색 실행:

SELECT p.relname,c.tableoid,c.* 
FROM student c, pg_class p
WHERE c.tableoid = p.oid
출력 은 다음 과 같 습 니 다:

참고 문헌
1 PostgreSQL document

좋은 웹페이지 즐겨찾기