Postgres наследуют индексы для секционированных таблиц

9

У меня есть таблица с примерно 60 миллионами строк, которые я разделил по штатам на 53 подтаблицы. Эти таблицы «наследуют» большую таблицу следующим образом:

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

У меня такой вопрос: если я не строю индексы на b2b8 до тех пор, пока не завершится оператор копирования, наследуют ли вложенные таблицы индексы? Другими словами, я хочу сделать это:

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

И оказалось, что все это создало все индексы во вложенных таблицах.

ABCD EFGHIJK
источник

Ответы:

11

Как объяснено ранее, INHERITSне копирует определения индекса.

Следовательно, вам необходимо указать как наследование, так и копирование индекса.

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

Спасибо, @dezso, за ваше замечание.

Джонатан Якобсон
источник
2

Унаследовано само по себе никогда не будет наследовать индексы. он будет наследовать только столбцы.

Ханс-Юрген Шениг
источник
2

Несмотря на то, что в документах указано, что все поля синхронизированы между родительской таблицей и ее дочерним элементом (скопировано ранее).

Необязательное предложение INHERITS указывает список таблиц, из которых новая таблица автоматически наследует все столбцы.

Использование INHERITS создает постоянную связь между новой дочерней таблицей и ее родительскими таблицами. Модификации схемы к родителю (родителям) обычно распространяются и на потомков, и по умолчанию данные дочерней таблицы включаются в сканы родителя (ей).

Она не включает в себя индексы .

Вы можете увидеть из примеров в документации (или запустить несколько тестов самостоятельно), чтобы увидеть, что вам нужно будет построить эти индексы на основе дочерней таблицы.

Фабрицио Бузето
источник
Да, я попытался протестировать некоторые сборки, и «наследование» не приводит к тому, что дочерние таблицы индексируются после создания, если у родительского потомка их еще не было с самого начала. К сожалению, это приводит к замедлению импорта больших csv с помощью копирования.
ABCD EFGHIJK
1

Из документов: "LIKE .... В отличие от INHERITS, новая таблица и исходная таблица полностью отделены после завершения создания. Изменения исходной таблицы не будут применены к новой таблице"

jjanes
источник
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$;
Шон
источник