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

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

推荐答案

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

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

Postgresql相关问答推荐

无法在kubernetes中设置postgres复制

Postgres 生成的列不是不可变的

使用 GDB 调试器调试 AGE 代码的过程

gorm 不生成字符串列

包含间隔在 jooq 和 postgres 中没有按预期工作

订阅标签保存在哪个表中?

PostgreSQL 函数按名称传递参数

查找最小值和最大值

全文搜索(Postgres)与Elastic search

带有双引号的 postgresql COPY 和 CSV 数据

Select 中的 PostgreSQL 正则表达式捕获组

如何使用 postgresql 中的存储过程将数据插入表中

Postgres 外键on update和on delete选项如何工作?

SQL:列为某个值时的唯一约束

使用 pg-promise 插入多条记录

判断materialized视图的上次刷新时间

具有 DEFAULT NULL 的 MySQL 列 ?

全文的 Postgresql 前缀通配符

python postgres 我可以 fetchall() 100 万行吗?

postgresql NOT ILIKE 子句不包含空字符串值