2012-11-12 4 views
1

시간 필드에 partitoned 테이블이 있습니다. 25 개의 파티션이 있습니다. 이제는 객체 유형 필드를 사용하여 더 많이 분할하는 것을 고려합니다. 나는 10 개의 객체 유형을 가지므로 250 개의 파티션이 생성됩니다. 내가 읽은 바에 따르면 추천 된 파티션 번호는 수십 가지이지만, 제 경우에는 스키마가 매우 간단하고 조인을 포함하지 않으므로 o.k인지 궁금합니다. 그 많은 파티션을 정의합니다. 나는 포스트 그레스 버전 최신 버전 (9.2) 9.1.2postgres 파티션 번호

CREATE TABLE metric_store.lc_aggregated_data_master_10_minutes 
(
    from_time integer, 
object_id integer, 
object_type integer, 
latencies_client_fetch_sec_sum bigint, 
latencies_client_rttsec_sum bigint, 
latencies_db_bci_res_sec_sum bigint, 
latencies_net_infrastructure_ttlb_sec_sum bigint, 
latencies_retransmissions_sec_sum bigint, 
latencies_ttfbsec_sum bigint, 
latencies_ttlbsec_sum bigint, 
latencies_ttlbsec_sumsqr bigint, 
latencies_ttlbsec_histogram_level0 integer, 
latencies_ttlbsec_histogram_level1 integer, 
latencies_ttlbsec_histogram_level2 integer, 
latencies_ttlbsec_histogram_level3 integer, 
latencies_ttlbsec_histogram_level4 integer, 
latencies_ttlbsec_histogram_level5 integer, 
latencies_ttlbsec_histogram_level6 integer, 
latencies_ttlbsec_histogram_level7 integer, 
usage_bytes_total bigint, 
usage_hits_total integer, 
latencies_server_net_ttlbsec_sum bigint, 
latencies_server_rttsec_sum bigint, 
avaiability_errors_total integer 
) 
    WITH (
    OIDS=FALSE 
); 
    ALTER TABLE metric_store.lc_aggregated_data_master_10_minutes 
    OWNER TO postgres; 


CREATE TABLE metric_store.lc_aggregated_data_10_minutes_from_1353070800 
(
    CONSTRAINT lc_aggregated_data_10_minutes_from_1353070800_pkey PRIMARY KEY (from_time , object_id), 
    CONSTRAINT lc_aggregated_data_10_minutes_from_1353070800_from_time_check CHECK (from_time >=  1353070800 AND from_time < 1353190800) 
    ) 
    INHERITS (metric_store.lc_aggregated_data_master_10_minutes) 
    WITH (
    OIDS=FALSE 
); 
ALTER TABLE metric_store.lc_aggregated_data_10_minutes_from_1353070800 
OWNER TO postgres; 


CREATE INDEX lc_aggregated_data_10_minutes_from_1353070800_obj_typ_idx 
ON metric_store.lc_aggregated_data_10_minutes_from_1353070800 
USING btree 
(from_time , object_type); 
+0

몇 개의 행이 필요합니까? 당신은 파티션되지 않은 테이블에 대한 쿼리가 가능한 한 좋은 것으로 확신합니까? (파티션은 올바른 인덱싱을 대체 할 수있는 좋은 대안이 아닙니다.) 빠른 하드웨어가 더 나은 솔루션입니까? (파티션은 적절한 서버를 대체 할 수있는 빈약 한 것입니다.) –

+0

약 1 천만 행입니다. 객체 유형에 대한 색인이 있지만 많은 무작위 액세스가 디스크를 탐색하기 때문에 100 개 이상의 시간 지점에 대한 많은 객체 ID에 대한 쿼리가 매우 느립니다. 작은 분할 영역으로 데이터를 분할하면 일반적으로 쿼리에서 동일한 객체 유형을 쿼리하기 때문에 성능이 향상됩니다. – user1817686

+0

천만 행이 큰 테이블이 아닙니다. 내가 너라면, 먼저 분할되지 않은 테이블을 조정하는 것에 대한 조언을 구할거야. 또한 버전 9.2에는 색인 전용 검사가 있지만 여기서는 도움이 될 것이라고 생각하지 않습니다. –

답변

1

guidance about the number of partitions을 가지고 사용하고 있습니다. (그 지침 8.3 이후 변경되지 않았습니다.) 마스터 테이블의 모든 파티션에

모든 제약은 제약 배제 동안 을 조사하는 파티션 너무 많은 수는 상당히 쿼리 계획 시간을 증가 가능성이있다. 이 기술을 사용하여 파티션을 나누면 최대 100 개의 파티션까지 잘 작동합니다. 수천 개의 파티션을 사용하지 마십시오.

PostgreSQL 메일 링리스트를 읽으면서 쿼리 계획의 시간을 늘리는 것이 가장 큰 문제라고 생각합니다.

파티션이 차가운 데이터의 핫 데이터를 분리 할 수 ​​있거나 자주 쿼리하는 클러스터 된 데이터 세트를 그룹화 할 수있는 파티션이라면 아마도 괜찮을 것입니다. 그러나 테스트가 최선의 방법입니다. EXPLAIN ANALYZE 대표 쿼리는 분할되지 않은 테이블에서 처리 한 다음 분할 후에도 동일하게 수행합니다. 대표적인 검색어를 분석하기 전에 선택하십시오.

+0

콜드 데이터에서 핫 데이터를 분리하면 무엇을 의미합니까? 스키마 복잡성이 쿼리 플래너 계산 복잡성에 영향을 미칩니 까? 내 경우에 scheam은 조인이 필요한 쿼리없이 매우 간단하기 때문입니다. – user1817686

+0

타임 스탬프는 "현재"또는 "최근"데이터에 대해 자주 질의되며, 1 개월 이상 또는 1 년 넘게 데이터에 대해 자주 검색되는 경우는 드뭅니다. "현재"또는 "최근"데이터는 자주 조회되는 데이터입니다. 월 또는 연도가 넘은 데이터는 차가운 (드물게 쿼리되는) 데이터입니다. 이드는 뜨겁거나 차가운 데이터 하위 세트를 가질 수도 있습니다.많은 조인이 필요한 스키마는 쿼리 계획자가 수행해야하는 작업을 증가 시키지만 일반적으로 조인을 계획하는 시간은 수천 개의 파티션에 대한 액세스를 최적화하는 시간으로는 왜소 해 보입니다. (플래너는 모든 파티션의 모든 제약 조건을 검사하기 때문입니다.) –