Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: update, postgresql, transaction

Как на самом деле выполняется оператор UPDATE в PostgreSQL?

Этот вопрос проверяет глубокое понимание внутренних механизмов выполнения операций изменения данных в PostgreSQL.

Короткий ответ

Оператор UPDATE в PostgreSQL на самом деле не изменяет существующие строки, а создает новые версии строк (tuple) и помечает старые как удаленные. Это реализация механизма Multi-Version Concurrency Control (MVCC). Старая версия строки сохраняется до тех пор, пока не будет удалена процессом vacuum. Каждая новая версия получает новый xmin (идентификатор транзакции создания). Такой подход позволяет обеспечить изоляцию транзакций и возможность чтения неподтвержденных данных.

Длинный ответ

PostgreSQL использует механизм MVCC для управления конкурентным доступом, что определяет способ выполнения операций UPDATE.

1. Процесс выполнения UPDATE

  • Создание новой версии: Создается копия строки с новыми значениями

  • Обновление системных полей:

    • xmin — ID транзакции, создавшей версию

    • xmax — ID транзакции, удалившей версию (0 для активных)

    • ctid — физическое расположение версии в таблице

  • Пометка старой версии: Старая версия помечается как удаленная текущей транзакцией

2. Внутреннее представление данных

-- Создаем тестовую таблицу
CREATE TABLE test_update (id SERIAL PRIMARY KEY, value TEXT);
INSERT INTO test_update (value) VALUES ('initial');

-- Смотрим системные поля до UPDATE
SELECT xmin, xmax, ctid, * FROM test_update;

-- Выполняем UPDATE
UPDATE test_update SET value = 'updated' WHERE id = 1;

-- Смотрим системные поля после UPDATE
SELECT xmin, xmax, ctid, * FROM test_update;

3. Влияние на производительность и обслуживание

  • Раздувание таблицы (bloat): Накопление старых версий строк

  • Vacuum процесс: Автоматическое удаление устаревших версий

  • Autovacuum: Фоновый процесс, который управляет очисткой

  • HOT (Heap-Only Tuples) updates: Оптимизация для UPDATE без изменения индексируемых полей

4. Пример наблюдения за процессом

-- Мониторинг активности autovacuum
SELECT schemaname, tablename, 
       n_tup_upd, n_tup_hot_upd,
       (n_tup_hot_upd::float / NULLIF(n_tup_upd, 0)) * 100 as hot_update_ratio
FROM pg_stat_user_tables 
WHERE n_tup_upd > 0;

-- Проверка раздувания таблицы
SELECT schemaname, tablename,
       n_dead_tup, n_live_tup,
       (n_dead_tup::float / NULLIF(n_live_tup, 0)) * 100 as dead_tup_ratio
FROM pg_stat_user_tables;

Вывод: Понимание механизма UPDATE в PostgreSQL помогает писать более эффективные приложения и правильно настраивать обслуживание базы данных. Используйте HOT-оптимизации где возможно, следите за раздуванием таблиц и настраивайте autovacuum для поддержания производительности.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    3

  • Сложность:

    8

Навыки

  • Python

    Python

  • Postgres

    Postgres

Ключевые слова

#update

#postgresql

#transaction

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.