수백만 (또는 수십억) 개의 행을 포함하는 새로운 PostgreSQL 9 데이터베이스를 설정 중입니다. 그래서 PostgreSQL 상속을 사용하여 데이터를 분할하기로 결정했습니다.올바른 분할 규칙 선택
CREATE TABLE mytable
(
user_id integer,
year integer,
CONSTRAINT pk_mytable PRIMARY KEY (user_id, year)
);
그리고 10 파티션 테이블 :
나는 (예를 들어 간체)과 같은 마스터 테이블을 생성CREATE TABLE mytable_0() INHERITS (mytable);
CREATE TABLE mytable_1() INHERITS (mytable);
...
CREATE TABLE mytable_9() INHERITS (mytable);
I 행은 항상 고유를 사용하여 응용 프로그램에서 액세스 할 것이라는 점을 알고있다 user_id 조건. 그래서 나는 user_id에 기반한 규칙을 사용하여 10 개의 테이블에 데이터를 "똑같이"퍼뜨리고 싶습니다.
마스터 테이블에 조정 쿼리에, 내 첫번째 생각은 계수 점검 제한 조건을 사용하는 것이었다 :
ALTER TABLE mytable_0 ADD CONSTRAINT mytable_user_id_check CHECK (user_id % 10 = 0);
ALTER TABLE mytable_1 ADD CONSTRAINT mytable_user_id_check CHECK (user_id % 10 = 1);
...
문제이고, 나는 USER_ID, PostgreSQL을에 조건 마스터 테이블 "MYTABLE"를 쿼리 할 때 분석기는 모든 테이블을 확인하고 점검 제한 조건에서 혜택을받지 않습니다
EXPLAIN SELECT * FROM mytable WHERE user_id = 12345;
"Result (cost=0.00..152.69 rows=64 width=36)"
" -> Append (cost=0.00..152.69 rows=64 width=36)"
" -> Seq Scan on mytable (cost=0.00..25.38 rows=6 width=36)"
" Filter: (user_id = 12345)"
" -> Seq Scan on mytable_0 mytable (cost=0.00..1.29 rows=1 width=36)"
" Filter: (user_id = 12345)"
" -> Seq Scan on mytable_1 mytable (cost=0.00..1.52 rows=1 width=36)"
" Filter: (user_id = 12345)"
...
" -> Seq Scan on mytable_9 mytable (cost=0.00..1.52 rows=1 width=36)"
" Filter: (user_id = 12345)"
반면 나는 (그 규칙과 일치하는 재분할와) 같은 고전적인 점검 제한 조건을 사용하는 경우 :
를ALTER TABLE mytable_0 ADD CONSTRAINT mytable_user_id_check CHECK (user_id BETWEEN 1 AND 10000);
ALTER TABLE mytable_1 ADD CONSTRAINT mytable_user_id_check CHECK (user_id BETWEEN 10001 AND 20000);
...
가 (이 예에서 MYTABLE 및 mytable_1) 조건에 일치하는 테이블 만 스캔 :
"Result (cost=0.00..152.69 rows=64 width=36)"
" -> Append (cost=0.00..152.69 rows=64 width=36)"
" -> Seq Scan on mytable (cost=0.00..25.38 rows=6 width=36)"
" Filter: (user_id = 12345)"
" -> Seq Scan on mytable_1 mytable (cost=0.00..1.52 rows=1 width=36)"
" Filter: (user_id = 12345)"
그러나 그러한 점검 제한 조건을 사용하여 유지하기 어려운 때문으로 채워집니다 사용자의 범위 테이블은 수년에 걸쳐 변화 할 것입니다. 수천 먼저, 어쩌면 수백만 또는 가까운 미래에 ...
체크 제약 조건의 혜택을 누릴 수있는 10 개의 테이블에 똑같은 방식으로 데이터를 분할 할 때 어떤 규칙을 사용하면 마스터 테이블의 SELECT 만 스캔 할 수 있습니까? 오른쪽 테이블 ...?
감사 니코