70.4. Глобальные последовательности #
Глобальные последовательности в Postgres Pro Shardman реализованы поверх обычных последовательностей PostgreSQL с некоторыми дополнительными метаданными на уровне кластера, которые среди прочего содержат интервал глобально неиспользуемых элементов последовательности.
При выполнении команды >CREATE SEQUENCE .. WITH (global)
на каждом узле кластера создаётся обычная последовательность PostgreSQL с тем же именем. Диапазон этой локальной последовательности представляет собой ограниченный подынтервал глобальной последовательности (как определено параметрами MINVALUE
и MAXVALUE
) и содержит количество элементов, не превышающее значение block_size
. Функция nextval
возвращает значения из локальной последовательности до тех пор, пока она не закончится, затем из глобальной последовательности выделяется новый подынтервал с элементами block_size
с использованием трансляции запроса, включающей все узлы кластера. Таким образом, меньшие значения размера блока делают генерируемые числа более однородными по всему кластеру, но влекут за собой снижение производительности, поскольку трансляция запроса может быть довольно дорогой. Другой способ описать параметр размера блока — сказать, что он управляет размером второго уровня кеша, аналогично тому, как работает параметр CACHE
, но на уровне всего кластера Postgres Pro Shardman.
Также обратите внимание, что каждый раз, когда выделяется новый подынтервал, нижележащая локальная последовательность изменяется (как в ALTER SEQUENCE
), что блокирует её на время транзакции и не даёт получать любым другим локальным параллельным транзакциям следующие значения последовательности.