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


9

状態ごとに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

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

回答:


11

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

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

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

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



2

docsでも、すべてのフィールドは親テーブルとその子(以前にコピーされた)の間で同期されていると述べています。

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

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

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

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


はい、私はテストのためにいくつかのビルドを試してしまい、親の子が最初からそれらを適切に配置していなかった場合、作成後に子テーブルが「継承」されてもインデックスが作成されません。残念ながら、これはコピーによる大規模なcsvインポートの速度を低下させます。
ABCD EFGHIJK 2014年

1

ドキュメントから:「LIKE...。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$;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.