Содержание

Предыдущий раздел

Разное

Следующий раздел

MVCC и VACUUM

Cнапшоты

В документации PostgreSQL часто упоминается некий snapshot, который очень важен для выполнения запросов. Так что же он и себя представляет?

В упрощенном виде снапшот можно представить как набор номеров транзакций. Снапшот делается на момент времени, и можно сказать, что он привязан к этому моменту времени. Но можно сказать и наоборот - что на основе снапшота из БД можно получить срез данных на момент времени, когда снапшот был сделан. Таким образом с помощью снапшотов можно получать срезы данных на произвольный момент времени (есть ограничения).

Технически снапшот состоит из трех полей.

  • xmin - номер самой ранней транзакции, которая не зафиксирована. Все более ранние транзакции должны быть зафиксированы или отменены.
  • xmax - номер, который будет присвоен следующей транзакции. Все транзакции с номерами равными или больше этому номеру ещё не начались.
  • xip_list - список активных на данный момент транзакции.

Транзакции, номера (txid) который попадают в интервал xmin <= txid < xmax и которых нет в списке xip_list, считаются завершенными. Так же считаются завершенными транзакции, номера которых меньше xmin.

С помощью такой структуры данных в PostgreSQL есть возможность хранить и обрабатывать срезы данных в любом моменте времени.

Совет

Есть ограничения, которые в реальности не позволяют PostgreSQL хранить данные на любой момент времени. Но обзор этих ограничений выходит за рамки этой статьи.

Дополнительные материалы

PostgreSQL Documentation: Transaction IDs and Snapshots

comments powered by Disqus