我正在努力了解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重新索引