2014-06-06 5 views
1

Я хотел бы скопировать таблицу PostgreSQL на основе информации в других таблицах.Как скопировать таблицу PostgreSQL с использованием столбцов/полей из других таблиц

Представьте себе две таблицы - foos (id, baz_id, name) и bars (foo_id, name). bars.foo_id является ссылкой на внешний ключ для foos.id.

Я хотел бы сгруппировать таблицу баров, чтобы она была заказана foos.baz_id.

Возможно ли это?

+0

Ваша схема образца фактически не показывает отношения между двумя таблицами (я предполагаю, что на foos должен быть foo_id). Что еще более важно, не могли бы вы объяснить, почему вы хотите скопировать данные таким образом/что вы надеетесь достичь? – IMSoP

+0

@IMSoP Мои данные таковы, что в одном запросе будет возвращено 'bar', связанное с' foos', которые имеют один и тот же 'baz_id'. Ни один из других столбцов на «барах» не может имитировать этот порядок (хотя 'foo_id' не является ужасным). Я ожидаю, что это значительно сократит время чтения IO на несколько сот миллионов записей. –

ответ

1

Это может быть выполнено с использованием денормализации.

Добавить столбец bars.baz_id и добавить триггеры или логику прикладного уровня, которая поддерживает соответствующие значения в этой таблице.

Затем добавьте индекс, который использует денормализованный столбеци этот кластер.

CREATE INDEX index_bars_on_baz_id ON bars (baz_id); 
CLUSTER bars USING index_bars_on_baz_id; 
+1

Обратите внимание, что 'CLUSTER' в Postgres не создает постоянно кластерный индекс, как в других СУБД, он просто упорядочивает данные, которые существуют в это время на основе индекса. Новые данные по-прежнему будут добавляться везде, где он подходит, до тех пор, пока вы снова не запустите «CLUSTER», чтобы изменить его. – IMSoP

+0

Также важно повторить 'ANALYZE' после каждого повторного 'CLUSTER'. –

 Смежные вопросы

  • Нет связанных вопросов^_^