Автоинкремент в Google Cloud Spanner

Google Cloud Spanner рекомендует не использовать монотонно возрастающие целые числа для первичные ключи. Это идеально подходит для таблиц верхнего уровня, так как создает горячие точки. Но как насчет чередующихся таблиц? В любом случае они будут храниться на одном узле. Они также хранятся в отсортированном порядке, поэтому использование UUID или какого-либо другого случайного идентификатора кажется неоптимальным, особенно если они также будут извлекаться в отсортированном порядке.

Является ли чтение максимального идентификатора и сохранение maxId + 1 для новой строки правильным решением здесь?


person Jakub Vrána    schedule 16.02.2017    source источник


Ответы (1)


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

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

person Dan McGrath    schedule 16.02.2017
comment
Спасибо за ответ. Как лучше всего использовать возрастающие числа в таблицах с чередованием? Это просто: max = read(SELECT MAX(SubId) FROM SubTable WHERE ParentId = ...); write(INSERT INTO SubTable (SubId, ...) VALUES ( + (max + 1) + , ...)) ? - person Jakub Vrána; 16.02.2017
comment
Как правило, по-прежнему рекомендуется избегать и использовать UUID со столбцом для последовательных идентификаторов, если это необходимо. Там таится много опасностей, например, убедитесь, что вы делаете это в транзакции, что произойдет, если самое последнее (и максимальное) значение будет удалено - вы можете использовать его повторно или нет?. Вероятно, лучше использовать другую таблицу для хранения счетчика и убедиться, что у вас есть соответствующие транзакции. - person Dan McGrath; 16.02.2017