【问题标题】:Postgres table partition by list limitPostgres 表分区列表限制
【发布时间】:2021-03-15 18:05:19
【问题描述】:

我想知道按列表分区表是否有限制,每个子分区表只包含一个元素。

比如我有这个分区表:

CREATE TABLE whatever (
    city_id         int not null,
    country_id      int not null,
) PARTITION BY LIST (country_id);

我创建了数百万个子分区表:

CREATE TABLE whatever_1 PARTITION OF whatever
    FOR VALUES IN (1);

CREATE TABLE whatever_2 PARTITION OF whatever
    FOR VALUES IN (2);

# until millions...

CREATE TABLE whatever_10000000 PARTITION OF whatever
    FOR VALUES IN (10000000);

假设在country_id 上有一个索引,这仍然有效吗? 或者我会达到here 所述的 65000 限制吗?

【问题讨论】:

  • "Millions of partitions" 从一开始就不太明智。您想通过该分区方案实现什么目标?你在哪个宇宙建模,你有 数百万 个国家?地球目前有大约 200 个国家。
  • 这只是一个例子。不用管这个
  • 阅读您的描述,您似乎正在使用 country_id 的序列,然后认为您需要一个用于序列值的分区。除了基本上是一个坏主意之外,它也是不正确的。使用ISO 3166 标准代替任意分配的值。在这种情况下,只需加载整个国家列表。列出了几个候选键,也许最适合这里是 ISO 1366-1 数字代码。然后根据给你 249 个分区而不是 百万 创建你的分区。
  • Country 就是一个例子……我在现实生活中没有使用 country。假设它可以只是一个 ID
  • 为什么要分区? country_id 上的索引似乎是这里更好的选择。

标签: postgresql ddl database-partitioning


【解决方案1】:

即使使用 PostgreSQL v13,超过几千个分区的任何东西都无法正常工作,最好保持较低。

原因是当您在 SQL 语句中使用分区表时,优化器必须单独考虑所有分区。它必须弄清楚它必须使用哪些分区,哪些不使用,并且对于它使用的所有分区,它必须提出一个执行计划。因此,规划时间将随着分区数量的增加而增加。这对于执行时间占主导地位的大型分析查询可能无关紧要,但会大大减慢小语句的执行速度。

使用更长的列表或使用范围分区。

【讨论】:

  • 是的;我已经扩展了答案来解释这一点。
猜你喜欢
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
相关资源
最近更新 更多