【问题标题】:How to know which partition will be used in Postgres hash partitioning?如何知道 Postgres 哈希分区中将使用哪个分区?
【发布时间】:2021-07-14 19:44:23
【问题描述】:

有没有办法知道哪个分区将用于由具有文本值的列分区的表中的新行?

用例是: 根据文本列,我有一个带有许多分区的大表。我需要在该表中插入更新数百万个新行。如果我知道每一行将使用哪些分区,我可以重新安排我的批量插入更新,使其一次仅适用于 1 个分区。

-> hashtext 函数经过测试,它没有给出正确的分区值。

【问题讨论】:

  • 哈希分区的唯一原因是为了分配 I/O,所以我不明白你为什么要避免这种情况。
  • 链接的帖子并没有真正回答这个问题。 'b' 使用模数 8 余数 6 进行分区,但hashtext('b')=-68,821,088 如何解释呢?
  • @LaurenzAlbe 当然,您有时可能希望分配 IO(如正常操作),但不是其他(如批量加载,将分区索引缓存在 RAM 中可能非常重要)。如果您只想无条件且不受控制地分配 IO,那为什么还要分区呢?只需使用 RAID/JBOD。
  • @jjanes 真; hashtext 不是答案。除了传播 I/O 之外,是否有充分的理由进行哈希分区?
  • INSERTSELECT 占用的锁不冲突,所以我认为这里没有问题。

标签: postgresql hash partition


【解决方案1】:

对代码进行逆向工程,可以通过以下语句得到分区号:

SELECT (hashtextextended('value', 8816678312871386365)::numeric + 5305509591434766563) % 8;

将 8 替换为分区数,将 'value' 替换为相关字符串。

您可以使用satisfies_hash_partition 测试分区号。要测试'value' 是否会出现在表tab 的第8 个分区中,您可以运行

SELECT satisfies_hash_partition('tab'::regclass, 8, 6, 'value'::text);

【讨论】:

  • 哇,逆向工程部件太棒了,两种解决方案都有效。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
相关资源
最近更新 更多