Postgres继承分区表的索引


9

我有一个大约有6000万行的表,该表按状态划分为53个子表。这些表“继承”大表,如下所示:

CREATE TABLE b2b_ak (LIKE b2b including indexes, CHECK ( state = 'AK') ) INHERITS (b2b8) TABLESPACE B2B;

我的问题是:如果在copy语句完成后才在b2b8上建立索引,那么子表会继承索引吗?换句话说,我想这样做:

Create b2b8
Create b2b8_ak inherits b2b8
COPY b2b8 FROM bigcsvfile.csv
CREATE INDEX CONCURRENTLY

事实证明,已经在子表上创建了所有索引。

Answers:


11

如前所述,INHERITS不复制索引定义。

因此,您需要同时声明继承和索引复制。

    CREATE TABLE sub_tab (LIKE tab INCLUDING ALL) INHERITS (tab);

谢谢@dezso的发言。



2

即使docs声明所有字段在父表及其子表(之前复制)之间都是同步的。

可选的INHERITS子句指定一个表列表,新表将从中自动继承所有列。

使用INHERITS将在新的子表及其父表之间创建持久关系。对父级的架构修改通常也会传播到子级,默认情况下,子级表的数据包含在父级扫描中。

包含索引

您可以从文档中的示例中看到(或自行运行一些测试),以发现需要在子表的基础上构建这些索引。


是的,我最终尝试了一些构建以进行测试,并且如果父子代从一开始就没有将它们放在适当的位置,则“继承”不会导致子表在创建后被索引。不幸的是,这最终会减慢通过复制导入大型csv的速度。
ABCD EFGHIJK,2014年

1

从文档中: “喜欢。...与INHERITS不同,新表和原始表在创建完成后完全解耦。对原始表的更改将不会应用于新表”


0

我做了这个功能来在子表上建立索引。

CREATE OR REPLACE FUNCTION index_children (col_name text, parent_name text, index_type text) RETURNS void LANGUAGE plpython3u AS
$_function$
    children = plpy.execute("SELECT c.relname AS child FROM pg_inherits JOIN pg_class AS c ON (inhrelid=c.oid) JOIN pg_class as p ON (inhparent=p.oid) where p.relname = '" + parent_name + "'")
    prog = len(children)
    count = 0
    for child in children:
        if count % 10 == 0:
            plpy.notice('%s : %s / %s' % (child['child'], str(count), str(prog)))
        plpy.execute("Create index on %s using %s (%s)" % (child['child'], index_type, col_name))
        count += 1
    plpy.notice('DONE')
$_function$;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.