Postgresql postgres分区号

Postgresql postgres分区号,postgresql,Postgresql,我有一张按时间场划分的桌子。我有25个分区。现在我考虑使用对象类型字段进一步划分它。我有十种对象类型,因此它将产生250个分区。根据我所读的,推荐的分区数是几十个,但在我的例子中,模式非常简单,不包含任何连接,所以我想知道定义这么多分区是否合适。我使用的是postgres 9.1.2版 CREATE TABLE metric_store.lc_aggregated_data_master_10_minutes ( from_time integer, object_id integer,

我有一张按时间场划分的桌子。我有25个分区。现在我考虑使用对象类型字段进一步划分它。我有十种对象类型,因此它将产生250个分区。根据我所读的,推荐的分区数是几十个,但在我的例子中,模式非常简单,不包含任何连接,所以我想知道定义这么多分区是否合适。我使用的是postgres 9.1.2版

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 );
CREATE TABLE metric\u store.lc\u aggregated\u data\u master\u 10\u分钟
(
从时间整数,
对象id为整数,
对象类型为整数,
延迟(客户端)(取数)(秒)(总和)(bigint),,
延迟(客户端)(rttsec)(总bigint),,
延迟_db _bci _res _sec _sumbigint,
延迟、网络、基础设施、秒和,
延迟(重传)(秒)(和),
延迟时间,
延迟时间,
延迟\u ttlbsec\u sumsqr bigint,
延迟\u ttlbsec\u直方图\u 0级整数,
延迟\u ttlbsec\u直方图\u level1整数,
延迟\u ttlbsec\u直方图\u level2整数,
延迟\u ttlbsec\u直方图\u级别3整数,
延迟\u ttlbsec\u直方图\u级别4整数,
延迟\u ttlbsec\u直方图\u级别5整数,
延迟\u ttlbsec\u直方图\u级别6整数,
延迟\u ttlbsec\u直方图\u级别7整数,
使用量\字节数\总bigint,
用法\u命中\u总整数,
延迟\u服务器\u网络\u ttlbsec\u和bigint,
延迟\u服务器\u rttsec\u和bigint,
可用性\u错误\u总整数
)
与(
OID=错误
);
ALTER TABLE metric_store.lc_聚合_数据_主数据_10_分钟
博士后的所有者;
从1353070800创建表metric\u store.lc\u聚合数据\u 10\u minutes\u
(
约束lc_聚合_数据_10_分钟_来自_1353070800_pkey主键(来自时间,对象id),
从时间检查检查(从时间>=1353070800和从时间<1353190800)开始的约束lc聚合数据10分钟
)
继承(公制存储。lc聚合数据主数据10分钟)
与(
OID=错误
);
ALTER TABLE metric_store.lc_聚合_数据_10_分钟_自_1353070800
博士后的所有者;
从1353070800对象类型idx创建索引lc聚合数据10分钟
在metric_store.lc_上,从_1353070800聚合_数据_10_分钟
使用btree
(从时间,对象类型);
当前版本(9.2)具有此功能。(该指导方针自8.3以来从未改变。)

检查主表所有分区上的所有约束 在约束排除期间,可能会出现大量分区 大大增加查询计划时间。使用这些 这些技术可以很好地处理多达100个分区; 不要试图使用成千上万的分区

通过阅读PostgreSQL邮件列表,我认为增加查询规划时间是您面临的主要问题

如果您的分区可以将热数据与冷数据分离,或者如果您的分区可以对您经常查询的集群数据集进行分组,那么您可能就可以了。但是测试是你最好的选择<代码>解释分析未分区表中的代表性查询,然后在分区后执行相同操作。在分析任何查询之前,请选择具有代表性的查询

当前版本(9.2)具有此功能。(该指导方针自8.3以来从未改变。)

检查主表所有分区上的所有约束 在约束排除期间,可能会出现大量分区 大大增加查询计划时间。使用这些 这些技术可以很好地处理多达100个分区; 不要试图使用成千上万的分区

通过阅读PostgreSQL邮件列表,我认为增加查询规划时间是您面临的主要问题


如果您的分区可以将热数据与冷数据分离,或者如果您的分区可以对您经常查询的集群数据集进行分组,那么您可能就可以了。但是测试是你最好的选择<代码>解释分析未分区表中的代表性查询,然后在分区后执行相同操作。在分析任何查询之前,请选择具有代表性的查询

有几排?您确定对未分区表的查询已经尽可能好了吗?(分区不能很好地替代索引)更快的硬件是更好的解决方案吗?(分区也不能很好地替代足够的服务器。)大约有1000万行。我有关于对象类型的索引,但是在超过100个时间点的许多对象ID上的查询非常慢,因为有许多随机访问磁盘。将数据拆分为更小的分区可以提高性能,因为我通常在查询中查询相同的对象类型。1000万行不是一个巨大的表。如果我是你,我会先寻求关于调整未分区表的建议。另外,9.2版只有索引扫描,但我认为这对您没有帮助。慢速查询已经使用了相关的索引(从时间+对象id),所以我不知道这里还能做哪些改进。我在postgres 9.2中检查了索引扫描,但这里的问题是,它只有在vacum分析之后才能工作,并且对表的每次更改都需要再次运行vacum。最新的分区将每隔10分钟插入一次,因此每10分钟运行一次VACUM是不可行的选择。您考虑或改变了成本估算或统计参数吗?我还没有安装9.2,但每次更改后都要对分区表进行真空分析,这似乎很奇怪。有多少行?您确定对未分区表的查询已经尽可能好了吗?(分区不能很好地替代索引)更快的硬件是更好的解决方案吗?(分区也不能很好地替代足够的服务器。)大约有1000万行。我有关于对象类型的索引,但是在超过100个时间点的许多对象ID上的查询非常慢,因为有许多随机访问磁盘。将数据拆分为更小的分区可以提高性能,因为我通常查询相同的分区