Действительно ли возможно сохранить 1-байтовое число в Пост-ГРЭС?

У меня есть 7 8-разрядных целочисленных значений на запись, которую я хочу сохранить в Пост-ГРЭС. Pg не предлагает единственный целый тип байта, SMALLINT, или 2 байта, будучи самым маленьким целочисленным типом данных. Есть ли так или иначе, я могу сохранить свои 7 8-разрядных чисел и экономить на пространстве?

Был бы тип массива с 7 массивами элемента быть более компактным? Или, я должен сделать двоичное представление своих 7 чисел (например, с помощью пакета в Perl) и хранилище это в единственном bytea поле?

Какие-либо другие предложения?

21
задан punkish 22 June 2010 в 03:49
поделиться

3 ответа

Учитывая, что накладные расходы для любой строки в PostgreSQL составляют 23 байта (HeapTupleHeaderData), если вы действительно так заботитесь о небольших объемах пространства, вы, вероятно, выбрали неправильный способ хранения ваших данных.

Несмотря на это, поскольку все более сложные типы имеют свои собственные накладные расходы (bytea добавляет четыре байта накладных расходов, например, битовые строки с 5 по 8), единственный способ выполнить то, что вы ищете, - использовать bigint (8 байтов), численно сдвигая каждое значение и объединяя результат с помощью операции ИЛИ. Вы можете сделать это, используя операции с битовой строкой , чтобы упростить код - вычислить как битовую строку, затем преобразовать в bigint перед сохранением - или просто вручную умножить / добавить, если вы хотите, чтобы скорость была лучше. Например, вот как вы сохраняете два байта вместе в двухбайтовой структуре, а затем получаете их обратно:

int2 = 256 * byte1 + byte2
byte1 = int2 / 256
byte2 = int2 % 256

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

17
ответ дан 29 November 2019 в 21:38
поделиться

Будете ли вы когда-нибудь искать записи, используя эти значения?

Если да, используйте обычные типы данных, такие как int4 (или даже int8, если вы на 64-битной архитектуре).

Если нет - сначала спросите себя - какой смысл хранить эти значения в Pg? Вы можете использовать байты (сложный ввод-вывод) или битовые строки (даже более сложный ввод-вывод), но в чем смысл? Сколько миллиардов записей у вас будет? Вы действительно проверили, что меньший тип данных использует меньше места (подсказка: нет, проверьте - есть проблемы с выравниванием данных)? Вы работаете под впечатлением, что меньший тип данных быстрее (это не так. На самом деле сравнить два значения int2 сложнее, чем два значения int4 на 32-битной архитектуре).

1
ответ дан 29 November 2019 в 21:38
поделиться

Вам нужно будет изучить тип данных bytea , указанный здесь: http://www.postgresql.org/docs/8.4/interactive/datatype- binary.html

Также существуют типы данных битовой строки: http://www.postgresql.org/docs/8.4/interactive/datatype-bit.html

1
ответ дан 29 November 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: