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