Операции над таблицей в PostgreSQL
В этой статье рассмотрим такие операции, как создание, удаление и переименование таблицы.
Создание таблицы
В общем случае операция добавления таблицы является одной из немногих операций, о которых не стоит особо переживать. Дело в том, что изменяемый нами объект чисто технически не способен в этот самый момент использоваться.
Большая часть параметров по созданию таблицы не влияют на другие объекты вашей БД. А добавление внешнего ключа в случае определения таблицы заставит СУБД получить на упомянутой таблице блокировку уровня SHARE ROW EXCLUSIVE. Таким образом будут остановлены DDL-запросы, как и модификации строк. Но несмотря на тот факт, что данная блокировка не должна быть чересчур долгой, то о ней надо помнить, впрочем, как и о любой другой операции, которая вызывает блокировку. Следовательно, хорошей практикой является разделение этих 2-х операций: сначала создайте таблицу и лишь потом добавляйте внешний ключ.
Удаление таблицы
Эта операция, как известно, требует блокировки уровня ACCESS EXCLUSIVE. Конечно, если таблица не используется, удалить ее можно вполне спокойно. Однако до того, как вы выполните команду DROP TABLE..., проверьте код и документацию, чтобы убедиться, что все упоминания о таблице стерты на самом деле. Для перепроверки запросите у СУБД статистику использования таблицы, применяя представление pg_stat_user_tables2.
Переименование таблицы
Переименование таблицы требует уровня ACCESS EXCLUSIVE. Вряд ли ваш код сможет безопасно обработать эту операцию непосредственно на лету — все это станет возможным лишь в том случае, если в таблицу никто не пишет, как и не запрашивает из нее каких-либо данных.
На практике желательно избегать переименований везде, где возможно. Однако когда переименование таблицы действительно необходимо, то вот советы для обеспечения безопасности:
- Создайте новую таблицу с той же схемой, как и предыдущая.
- Скопируйте данные в новую таблицу из старой.
- Создайте триггеры к старой таблице на INSERT и UPDATE, чтобы в случае ее применения поддерживалось актуальное состояние новой таблицы.
- Начните применять новую таблицу.
Возможны и другие подходы, которые основаны на использовании представлений (views) либо правил (RULE). Они тоже могут пригодиться -- все будет зависеть от нужной вам производительности.
По материалам статьи «PostgreSQL at Scale: Database Schema Changes Without Downtime».