Числовое и целое число для столбца - размер и производительность

11

У меня есть приложение, которое использует таблицу PostgreSQL. Таблица очень большая (миллиарды строк) и имеет столбец, который является целым числом.

integerМожет быть до 6 цифр, т.е. 0-999,999, не негативов.

Я думал об изменении его, чтобы быть numeric(6,0).

Это было бы хорошей идеей? Займет numeric(6,0)меньше байтов? Как насчет производительности (к этой таблице часто обращаются)?

Ofiris
источник

Ответы:

11

Это было бы хорошей идеей?

Нет.

будет numeric(6,0)принимать меньше байт?

Нет.

test=> SELECT pg_column_size(INT4 '999999'), pg_column_size(NUMERIC(6,0) '999999');
 pg_column_size | pg_column_size 
----------------+----------------
              4 |             10
(1 row)

как насчет производительности (эта таблица часто запрашивается)?

Помедленнее. Он хранится в двоичном десятичном формате, потому что это значение произвольной точности.

Крейг Рингер
источник
Все согласовано, поскольку числовое примечание имеет одно преимущество, так как оно автоматически применяет домен 0-999999. Однако это можно решить с помощью отдельного ограничения в случае int
Леннарт
1
Есть проблема с изменением numericстолбца на int?
Racer SQL
@RacerSQL Да, если у вас есть значения, которые будут превышать размер int.
DylanYoung
5

Окончательный ответ - нет на все ваши вопросы. Целое число - это всегда путь для всего, для чего вы можете его использовать. (Деньги, например)

Подумай об этом на минуту. Когда ядро ​​базы данных встречает целое число, оно обрабатывает его очень эффективно, потому что нет особой интерпретации для него. Это целое число. Числовой тип ведет себя больше как строка. Сначала двигатель должен выяснить, какие части находятся до и после десятичной точки, и массировать их соответствующим образом для выполнения числовых операций.

Использование целого числа всегда будет более эффективным, чем числовое, хотя числовые типы часто более удобны для человека.

stubsthewizard
источник
Я не согласен, когда дело доходит до денег. Использование масштабированного целого числа, такого как хранение дециентов (1000 за доллар) - это нормально, но неудобно. Это быстро становится более практичным в использовании NUMERIC. Однако, масштабированное целое число лучше, чем использование значения с плавающей запятой для денег.
Крейг Рингер
2
@CraigRinger Я не думаю, что вы на самом деле не согласны со мной! Я согласен, что использование десятичной дроби для денег всегда менее неудобно для разработчика, но вопрос в эффективности запросов, верно? Обработка целых всегда быстрее. Кроме того, при написании банковских приложений вы можете столкнуться с некоторыми странными проблемами округления, которые большинству людей не нужны, но они очень важны для банков. Итак, я также согласен с вами, что вы не используете деньги с плавающей точкой!
stubsthewizard
1
Хороший момент при округлении. Я бы хотел, чтобы у PostgreSQL была поддержка политики округления. Не желайте этого достаточно, чтобы реализовать это все же;)
Крейг Рингер