状態ごとに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
そして、すべてがサブテーブルにすべてのインデックスを作成したことがわかります。
前に説明したように、INHERITS
はインデックス定義をコピーしません。
したがって、継承とインデックスのコピーの両方を述べる必要があります。
CREATE TABLE sub_tab (LIKE tab INCLUDING ALL) INHERITS (tab);
@dezso、コメントありがとうございます。
the docs であっても、すべてのフィールドが親テーブルとその子(以前にコピーされた)の間で同期されていることを示しています。
オプションのINHERITS句は、新しいテーブルがすべての列を自動的に継承するテーブルのリストを指定します。
INHERITSを使用すると、新しい子テーブルとその親テーブルの間に永続的な関係が作成されます。親へのスキーマの変更は通常、子にも反映されます。デフォルトでは、子テーブルのデータは親のスキャンに含まれます。
それは含まれませんインデックスは含まれません。
ドキュメントの例から(または自分でいくつかのテストを実行して)、これらのインデックスを子テーブルごとに作成する必要があることがわかります。
INHERITS自体はインデックスを継承しません。列のみを継承します。
ドキュメントから: "LIKE .... INHERITSとは異なり、作成が完了すると、新しいテーブルと元のテーブルは完全に切り離されます。元のテーブルへの変更は新しいテーブルには適用されません"
この関数を作成して、子テーブルにインデックスを作成しました。
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$;