Стартапы и венчурный капитал

Что произойдет, если 2000 раз добавить и удалить столбец в Postgres? Разбираемся в подробностях

Стартапы и венчурный капитал
What will happen if we add and remove a column 2000 times in Postgres?

Подробное объяснение внутреннего устройства PostgreSQL при многократном добавлении и удалении столбцов в таблице, влияние на производительность и ограничения, а также практические рекомендации по очистке таблиц и вопросы соответствия требованиям GDPR.

Работа с базами данных PostgreSQL считается надежным и эффективным решением для большинства современных проектов. У многих разработчиков вызывает интерес вопрос о поведении системы при частом изменении структуры таблиц, например, если добавить и удалить столбец 2000 раз подряд. Казалось бы, такая операция не должна вызвать сложностей и приведет к простой таблице с двумя изначальными столбцами. Однако при выполнении такого сценария возникает неожиданная ошибка, связанная с ограничением в количестве колонок, и разобраться в причинах этого крайне важно для эффективного управления базами данных и понимания внутренних механизмов PostgreSQL. В начале стоит привести простой пример: создается таблица с двумя столбцами, после чего столбец поочередно добавляется и удаляется многократно.

Несмотря на то, что таблица на конечном этапе должна содержать только два столбца, система выдает ошибку с указанием превышения максимального количества столбцов, равного 1600. Почему же так происходит? Важно понять, что при удалении столбца в PostgreSQL физический объем занимаемой этим столбцом информации в таблице не уменьшается. Вместо удаления столбца происходит его маркировка как «удаленного» на уровне метаданных, и он просто игнорируется при запросах. Такая стратегия выбрана для минимизации затрат на переработку файлов базы данных и предотвращения дорогостоящих операций полного переписывания таблицы после каждого удаления столбца. Данные таблиц в PostgreSQL хранятся в специальных файлах, разбитых на страницы размером 8 килобайт.

Каждая страница содержит служебную информацию и строки с данными. Попытка физически удалить столбец повлекла бы за собой необходимость проходить по всем страницам и пересобирать строки с изменением структуры, что крайне неэффективно. Вместо этого система оставляет данные столбца в файле, но помечает его как «удаленный» с помощью специального флага. В метаданных PostgreSQL такая колонка помечается специальным именем и индикатором, что она уже неактивна. При этом пространство, выделенное для этого столбца, продолжает занимать место в структуре таблицы, а ограничение на максимальное количество столбцов не учитывает, удален ли столбец логически или реально.

Поэтому при 2000 циклах добавления и удаления новая колонка появляется в метаданных и файловом представлении, а удаляется лишь визуально для пользователя. Следствием этого становится быстрое достижение лимита в 1600 столбцов, что становится препятствием для дальнейшего изменения структуры. Для наглядности, после удаления столбца с ним связана запись в системной таблице pg_attribute с флагом attisdropped = true, имя этого столбца меняется на шаблон с использованием заметного префикса, а данные при выполнении запросов игнорируются. Если провести глубокий анализ файлов таблицы специальными инструментами, можно обнаружить, что данные «удаленных» столбцов все еще присутствуют на своем месте. Для полной очистки таблицы и освобождения места, занимаемого такими колонками, требуется выполнение операции полного переписывания таблицы.

Оптимальным способом в PostgreSQL считается команда VACUUM FULL, которая не только удаляет мертвые строки, но и очищает данные, занимаемые логически удаленными столбцами. Запуск VACUUM FULL приводит к созданию новой физической версии таблицы с пересобранными страницами и пересохранением только актуальных данных. Несмотря на то, что после этой процедуры данные фактически освобождаются, в метаданных столбец по-прежнему остается помеченным как удаленный – PostgreSQL не восстанавливает индекс колонок автоматически. Для устранения этого эффекта требуется ручное создание новой таблицы по результатам выборки данных из старой и перенос всех необходимых ограничений, индексов, внешних ключей и триггеров. Такой подход может быть трудоемким, однако является единственным надежным способом избавиться от накопленных помеченных удаленными колонок и предотвратить достижение лимита на столбцы в будущем.

Важным аспектом является и влияние подобных операций на соответствие законодательству по защите данных. В частности, в обсуждении GDPR и права на удаление персональных данных нередко поднимается вопрос о том, остается ли удаленная информация в базе данных после удаления столбца или записей с личными данными. В этом контексте стоит понимать, что удаление столбца – это далеко не полноценное удаление данных пользователя. Обычно персональные данные хранятся в записях и связаны с основными идентификаторами. При выполнении запроса на удаление пользователя происходит удаление всех связанных строк, а не только структуры таблицы.

Более того, благодаря MVCC (многоверсионной системе контроля конкуренции) в PostgreSQL удаленные строки сначала остаются в таблице до завершения всех транзакций, а физическое удаление происходит при запуске вакуума. Таким образом, если необходима строгая гарантия удаления, нужно контролировать процесс вакуума и уход за таблицами. Кроме того, важно помнить, что даже после логического удаления данные могут оставаться на уровне файловой системы в виде физических секторов, что требует отдельного аппаратного или программного подхода для полного стирания, если это действительно необходимо по нормативам. В заключение можно сказать, что понимание внутреннего устройства PostgreSQL и особенностей работы с добавлением и удалением столбцов помогает избежать неожиданных ограничений и оптимизировать хранение данных. При интенсивных изменениях структуры таблиц желательно планировать периодическую очистку удаленных колонок через VACUUM FULL или пересоздание таблиц.

Также важно учитывать, что ограничения на количество столбцов имеют реальный смысл и в некоторых случаях могут сигнализировать о необходимости пересмотра модели данных. Понимание, что удаленные столбцы остаются в таблице и учитываются при подсчете объектов, помогает специалистам управлять базой более эффективно и предотвращать неожиданное падение производительности или появление ошибок. Такая осознанность гарантирует устойчивую работу приложений и безопасность хранения данных в долгосрочной перспективе.

Автоматическая торговля на криптовалютных биржах Покупайте и продавайте криптовалюты по лучшим курсам Privatejetfinder.com (RU)

Далее
Fitch watching 'quite closely' how South Korea manages geopolitical challenges
Четверг, 01 Май 2025 Fitch внимательно следит за тем, как Южная Корея справляется с геополитическими вызовами

Глобальное кредитное рейтинговое агентство Fitch уделяет серьезное внимание тому, как Южная Корея балансирует между растущими геополитическими напряжениями между США и Китаем, отражая вызовы для ее экономики и внутренней политики.

Revolut profits soars on crypto boom as CEO lifts stake
Четверг, 01 Май 2025 Революция в финансах: как рост криптовалют вывел прибыль Revolut на новый уровень

Рост интереса к криптовалютам оказал значительное влияние на финансовые показатели Revolut, одного из ведущих финтех-стартапов, что позволило компании увеличить прибыль и укрепить позиции на рынке. Инвестиции и решение CEO увеличить свою долю в компании свидетельствуют о высоких ожиданиях относительно дальнейшего развития.

Releases: spectre-project/rusty-spectre
Четверг, 01 Май 2025 Rusty Spectre: Эволюция узлового ПО для сети Spectre

Обзор последних релизов Rusty Spectre — высокопроизводительного узлового программного обеспечения для сети Spectre, созданного на языке Rust. Подробности про новые функции, улучшения, исправления и особенности, которые делают Rusty Spectre перспективным выбором для участников сети.

Son of CIA Deputy Director Joined Russian Army and Was Killed in Ukraine
Четверг, 01 Май 2025 Сын заместителя директора ЦРУ погиб, служа в российской армии в войне на Украине

История Майкла Александера Глосса, американца и сына высокопоставленного сотрудника ЦРУ, который заключил контракт с российским Министерством обороны и был убит во время военных действий на Украине, раскрывает неожиданные и драматичные аспекты международного конфликта и затрагивает вопросы верности, идеологии и личных выборов.

The Making of the First English Jubensha
Четверг, 01 Май 2025 Истоки первого английского джубэньша: от создания до современного успеха

Погружение в историю и особенности создания первого английского джубэньша, который положил начало новому феномену интерактивных ролевых игр, объединяющих storytelling, актерское мастерство и коллективное творчество.

Trump updates Biden’s robo-car crash reporting rule to benefit Tesla
Четверг, 01 Май 2025 Обновление правил отчётности о ДТП с автономными транспортными средствами: как решения Трампа изменили подход к Tesla

Последние изменения в американских правилах отчётности о ДТП с участием автономных систем в автомобилях значительно повлияли на Tesla, ставя под вопрос прозрачность и безопасность на дорогах. Рассмотрим, как новые меры правительства Трампа трансформируют индустрию самоуправляемых автомобилей и что это значит для потребителей.

Price Wars and Brain Drain
Четверг, 01 Май 2025 Ценовые войны и утечка умов: как Китай и США меняют ландшафт мировой науки и технологий

Разбор масштабных изменений на мировом рынке искусственного интеллекта, вызванных ценовыми войнами в Китае и массовым оттоком научных кадров из США в Германию, а также влияние этих процессов на будущее глобальных исследований и инноваций.