在postgres中删除分区表



我正在努力了解Postgres分区的行为
我有一个分区表,我想知道如果我会有什么行为

  • 下拉表
  • 重命名表
  • 重命名索引

如果我做

DROP TABLE table_name;

它也会删除所有分区吗?还是我需要先删除所有分区,然后再删除表?

同样,如果我做

ALTER INDEX RENAME temp_table_name_idx TO table_name_idx;

重命名分区表的索引就足够了吗?因为我知道每个分区都有自己的索引。

同样,如果我做

ALTER TABLE table_name RENAME new_table_name;

new_table_name是否已经连接了所有连接到table_name的分区?

我们可以用一个非常简单的例子来测试它:

-- create parent partition table and child partition tables
create table foo(a int, b int) partition by range(a);
create table bar_01 partition of foo for values from (1) to (2);
create table bar_02 partition of foo for values from (2) to (3);
create table bar_03 partition of foo for values from (3) to (4);
insert into foo values (1), (2), (3);

PostgreSQL中的分区表是通过表继承实现的,我们可以在pg_inherits:中找到继承关系

postgres=# select inhrelid::regclass::text, inhparent::regclass::text from pg_inherits ;
inhrelid | inhparent 
----------+-----------
bar_01   | foo
bar_02   | foo
bar_03   | foo

因此,如果我们删除该表,父表及其所有子表都将被删除。但是,如果我们只是重命名父表,那么子表中就不会发生任何事情,因为PostgreSQL使用OID来保存它们的关系,而不是表名。

但REINDEX声明在不同版本之间会有不同的结果。

PostgreSQL版本12和13不支持重新索引分区表,只有版本14支持。我们可以从它的官方网站找到文档:

REINDEX INDEX或REINDEX TABLE分别支持对分区索引或分区表重新索引。指定分区关系的每个分区都在一个单独的事务中重新索引。在处理分区表或索引时,不能在事务块内部使用这些命令。

sql重新索引

最新更新