Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Postgres中有多少表分区过多?_Performance_Postgresql_Partitioning - Fatal编程技术网

Performance Postgres中有多少表分区过多?

Performance Postgres中有多少表分区过多?,performance,postgresql,partitioning,Performance,Postgresql,Partitioning,我正在对一个包含时态数据的非常大的表进行分区,并考虑分区的粒度。Postgres声称“大量的分区可能会大大增加查询规划时间”,并建议将分区与“多达100个”分区一起使用 假设我的表保存了10年的数据,如果我按周分区,最终会有500多个分区。在排除这种可能性之前,我想更好地了解分区数量对查询计划时间的影响。是否有人对此进行了基准测试,或者是否有人了解其内部工作原理?如果您不想信任编写代码的PostgreSQL开发人员,那么我建议您自己尝试一下,并使用不同的分区方案运行几个示例查询,并对其进行解释、

我正在对一个包含时态数据的非常大的表进行分区,并考虑分区的粒度。Postgres声称“大量的分区可能会大大增加查询规划时间”,并建议将分区与“多达100个”分区一起使用


假设我的表保存了10年的数据,如果我按周分区,最终会有500多个分区。在排除这种可能性之前,我想更好地了解分区数量对查询计划时间的影响。是否有人对此进行了基准测试,或者是否有人了解其内部工作原理?

如果您不想信任编写代码的PostgreSQL开发人员,那么我建议您自己尝试一下,并使用不同的分区方案运行几个示例查询,并对其进行解释、分析和计时。在任何情况下,您特定的硬件和软件配置都可能主导任何答案


我假设查询优化器用于确定要使用的连接和限制的行优化缓存存储在每个分区中,因此它可能需要加载和读取每个分区的部分来规划查询。

每个表分区占用文件系统上的一个索引节点。“非常大”是一个相对术语,它取决于所选文件系统的性能特征。如果您想要明确的性能基准,您可能需要查看所选操作系统和FS中邮件系统的各种性能基准。一般来说,我不会担心这个问题,直到您进入数万到数十万个表空间(在FreeBSD的UFS2上使用将是成功的)。还要注意,同样的限制也适用于PostgreSQL中的数据库、表或任何其他文件系统支持的数据库对象

“大量的分区可能会大大增加查询规划时间”,并建议将分区与“最多一百个”分区一起使用

因为每一个额外的分区通常都与检查约束相关联,这将导致规划者想知道需要查询哪个分区。在最好的情况下,规划器会发现您只访问了一个分区,并完全取消了
append
步骤


就行而言,正如DNS和Seth所指出的,您的差异将随着硬件的不同而不同。不过,一般来说,查询1M行表和10M行表之间并没有显著区别——特别是如果硬盘允许快速随机访问,并且是集群式的(请参阅
集群
语句)使用您最常使用的索引。

查询计划器必须对查询中使用的每个表分区的约束信息进行线性搜索,以确定实际涉及的是哪些分区—哪些分区可能包含请求数据所需的行。当您加入更多的表时,planner所考虑的查询计划的数量将呈指数增长。因此,线性搜索加起来足够麻烦的确切位置实际上取决于查询的复杂性。连接越多,受此影响越严重。“最多100个”数字来自于注意到查询计划时间的总和相当于一个不小的时间量,即使是在这一点上进行更简单的查询。特别是在web应用程序上,响应时间的延迟很重要,这是一个问题;这就是警告


你能支持500吗?当然但是,对于优化器考虑的涉及该表的每个查询计划,您将搜索500个检查约束中的每一个。如果查询计划时间不是您关心的问题,那么您可能不在乎。但是大多数站点最终都不喜欢使用这么多分区进行查询规划所花费的时间比例,这也是为什么每月分区是大多数数据集的标准的原因之一。您可以轻松地存储10年的数据,按月分区,然后再开始过渡到计划开销开始明显的地方

他们几乎肯定会;我只是选择了周刊,以便更现实地得到一个更大的数字。我们可以考虑20年内的每月划分。我主要感兴趣的是约束,以及它们之间的区别,即50个v.s.100个分区。我信任开发人员,但他们的警告非常模糊,所以我想更好地理解它。和大多数关于堆栈溢出的问题一样,我的问题是这样问的:如果有人已经知道答案,我就不必花费数小时构建一个代表性的测试设置来重现他们的工作。@DNS它是模糊的,因为它取决于您的硬件和软件配置、数据和查询。对一个人正确的答案对另一个人来说是不正确的。SQL就是这样微妙的。