Следует ли мне использовать bigserial Postgres для записей в новом приложении?

Я работаю над новым приложением, которое хранит данные в базе данных PostgreSQL. Тип данных среди прочего - это записи счетчиков от некоторых измерительных устройств. На одного клиента могут быть сотни и тысячи таких устройств, и все они обычно предоставляют несколько записей в день. Новые записи заменяют старые, просто удаляя старые, и вставляются как новые записи с новыми идентификаторами. Моя компания не знает, сколько клиентов с каким количеством измерительных приборов и записей в день нам действительно нужно хранить.

Поскольку это новое приложение, я хотел бы попросить вашего совета относительно использования serial vs. bigserial в качестве идентификатора для записей счетчика. Есть ли заметное снижение производительности на текущих процессорах x64 или подобных? Объем памяти для поля ID должен увеличиться в 2 раза, не так ли? Есть ли очевидные причины, почему бы не использовать bigserial?

Спасибо!


person Thorsten Schöning    schedule 27.08.2014    source источник


Ответы (2)


Что касается производительности, разницы нет - при условии, что PostgreSQL был правильно скомпилирован для использования преимуществ платформы x86_64. Например, добавление двух 32-битных целых чисел занимает то же время, что и добавление 64-битных целых чисел. Однако, если он был скомпилирован для простого x86 (32-разрядного), будет некоторое (незначительное?) Падение производительности, потому что ему каким-то образом нужно имитировать 64-разрядную арифметику, используя только 32-разрядные регистры.

Вкратце: убедитесь, что вы используете 64-битную версию PostgreSQL, и все готово!

person Piotr Miś    schedule 27.08.2014
comment
Еще одно интересное утверждение, которое я раньше не видел в документации для CREATE SEQUENCE: Последовательности основаны на арифметике bigint [...] На некоторых старых платформах [...] последовательности используют обычную целочисленную арифметику [...] Итак, 32 Bit целые числа в любом случае кажутся своего рода наследием. - person Thorsten Schöning; 28.08.2014

При использовании типа данных bigserial в качестве последовательности и первичного ключа таблицы существенных проблем с производительностью не наблюдается. Подробнее см. документацию и старый вопрос по теме.

Кстати: если у вас 10000 устройств, и каждое устройство производит 10 записей в день, целого числа хватит на 60 лет, поэтому я думаю, что целого достаточно ;-)

person 1ac0    schedule 27.08.2014
comment
Почему бы просто не использовать 64-битное целое число и быть в безопасности на долгие годы? :) Единственная цена, которую вы платите, - это немного памяти, да и вообще она дешевая. - person Piotr Miś; 27.08.2014
comment
@uraf, ты прав, память дешевая, а вот ssd-диски пока нет ;-) - person 1ac0; 27.08.2014
comment
Это не просто те 10 записей в день, я особенно подумал о пропусках из-за отката транзакций во время ошибок и тому подобного. Конечно, это не должно происходить часто ... Это просто внутреннее ощущение. :-) - person Thorsten Schöning; 28.08.2014