web-dev-qa-db-ja.com

Postgresは分割テーブルのインデックスを継承します

状態ごとに53のサブテーブルに分割した約6000万行のテーブルがあります。これらのテーブルは、次のように大きなテーブルを「継承」します。

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

そして、すべてがサブテーブルにすべてのインデックスを作成したことがわかります。

8
ABCD EFGHIJK

前に説明したように、INHERITSはインデックス定義をコピーしません。

したがって、継承とインデックスのコピーの両方を述べる必要があります。

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

@dezso、コメントありがとうございます。

11

the docs であっても、すべてのフィールドが親テーブルとその子(以前にコピーされた)の間で同期されていることを示しています。

オプションのINHERITS句は、新しいテーブルがすべての列を自動的に継承するテーブルのリストを指定します。

INHERITSを使用すると、新しい子テーブルとその親テーブルの間に永続的な関係が作成されます。親へのスキーマの変更は通常、子にも反映されます。デフォルトでは、子テーブルのデータは親のスキャンに含まれます。

それは含まれませんインデックスは含まれません

ドキュメントの例から(または自分でいくつかのテストを実行して)、これらのインデックスを子テーブルごとに作成する必要があることがわかります。

2
Fabricio Buzeto

INHERITS自体はインデックスを継承しません。列のみを継承します。

ドキュメントから: "LIKE .... INHERITSとは異なり、作成が完了すると、新しいテーブルと元のテーブルは完全に切り離されます。元のテーブルへの変更は新しいテーブルには適用されません"

1
jjanes

この関数を作成して、子テーブルにインデックスを作成しました。

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$;
0
Sean