Копирование таблицы со всеми данными и индексами в PostgreSQL
Быстрый ответ
Для эффективного клонирования таблицы в PostgreSQL включая её индексы, выполните следующие шаги:
Создайте новую таблицу, содержащую данные оригинальной:
CREATE TABLE новая_таблица AS TABLE существующая_таблица;
Сгенерируйте SQL-команды для создания индексов на основе оригинальной таблицы:
SELECT 'CREATE INDEX ' || replace(indexname, 'существующая_таблица', 'новая_таблица') || ' ON новая_таблица USING ' || regexp_replace(indexdef, 'ON .+ USING', 'USING') FROM pg_indexes WHERE tablename = 'существующая_таблица';
Выполните сгенерированные команды, чтобы воссоздать каждый индекс.
Таким образом, клонируются как данные, так и индексы, что идеально для создания резервной копии или тестового окружения.
Клонирование таблицы с использованием 'pg_dump'
Использование pg_dump
с параметром -t
позволяет клонировать конкретную таблицу. Название таблицы в дамп-файле необходимо изменить, после чего его можно загрузить обратно:
pg_dump -t существующая_таблица -f dump.sql dbname
sed -i '' 's/существующая_таблица/новая_таблица/g' dump.sql
psql dbname -f dump.sql
Инструмент sed
является универсальным, но его следует использовать осознанно.
Клонирование таблицы в PostgreSQL версии 8.3 и выше
С версии PostgreSQL 8.3 вы можете использовать ключевое слово LIKE
для копирования таблицы включая её индексы:
CREATE TABLE новая_таблица (LIKE существующая_таблица INCLUDING INDEXES);
Убедитесь в поддержке данной функции вашей версией PostgreSQL:
SELECT version(); -- Вдруг мы есть во временной машине?
После клонирования таблицы необходимо проверить структуру таблицы и соответствие индексов.
Подтверждение точности при создании таблиц и индексов
После клонирования таблицы:
Проконтролируйте её структуру следующим образом:
\d новая_таблица
Проверьте индексы, чтобы удостовериться в их правильности:
\di+ новая_таблица
Визуализация
Процесс клонирования таблицы можно сравнить с дублированием здания со всеми элементами его архитектуры и оформления.
🏫 Оригинальное здание: ТАБЛИЦА со всеми записями (СТРОКАМИ) и индексами (ИНДЕКСАМИ).
CREATE TABLE новое_здание AS TABLE старое_здание;
🏢 Клон: Точная копия со всеми структурными элементами и индексами.
Копирование подмножества данных и вопросы последовательности
Для копирования только определённых строк можно использовать условие WHERE
:
CREATE TABLE новая_таблица AS SELECT * FROM существующая_таблица WHERE условие;
Могут возникнуть проблемы с последовательностями, связанными с полями типа SERIAL
, но их можно решить таким образом:
Проверьте текущую последовательность:
SELECT pg_get_serial_sequence('новая_таблица', 'имя_столбца_serial');
Переназначьте последовательность:
ALTER SEQUENCE имя_последовательности OWNED BY новая_таблица.имя_столбца_serial;
Оптимизация процесса
Для улучшения производительности и удобства использования рекомендуется:
- Обернуть процесс в транзакцию, чтобы обеспечить атомарность операций.
- Создавать индексы без блокировки таблиц с использованием
CREATE INDEX CONCURRENTLY
. - Применять
UNLOGGED
для таблиц, чтобы уменьшить нагрузку на систему в окружениях, не являющихся продакшен.
Полезные материалы
- PostgreSQL Documentation: CREATE TABLE AS – Информация о создании таблицы на основе запроса в PostgreSQL.
- PostgreSQL Documentation: CREATE INDEX – Подробности создания и роли индексов для ускорения работы с базами данных.
- PostgreSQL Wiki: Clone a Database – Дискуссия различных подходов к клонированию баз данных, включая таблицы и индексы.
- PostgreSQL Documentation: pg_dump – Руководство по использованию
pg_dump
для создания резервных копий баз данных PostgreSQL. - db<>fiddle – Интерактивная платформа для работы с SQL-запросами и обмена ими.