Числовий чисел проти цілого числа для стовпця - розмір та продуктивність


11

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

Максимальна кількість integerцифр може бути до 6 цифр, тобто 0-999,999, ніяких негативів.

Я думав про те, щоб це змінити numeric(6,0).

Це було б гарною ідеєю? Зайняло numeric(6,0)б менше байтів? Як щодо продуктивності (ця таблиця запитується багато)?

Відповіді:


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. Однак це може бути вирішено окремим обмеженням у справі про інт
Леннарт

1
Чи є проблема зі зміною numericстовпця на int?
Racer SQL

@RacerSQL Так, якщо у вас є значення, які переповнюватимуть розмір int.
DylanYoung

5

Остаточна відповідь - ні на всі ваші запитання. Integer - це завжди шлях для будь-чого, для чого ви можете ним скористатися. (Гроші, наприклад)

Подумайте про це хвилину. Коли двигун бази даних стикається з цілим числом, він обробляє це дуже ефективно, тому що для нього не так багато трактування. Це ціле число. Числовий тип поводиться більше, як рядок. Двигун спочатку повинен розібратися, які деталі знаходяться до і після десяткової крапки, і відповідним чином помасажувати їх для виконання числових операцій.

Використання цілого числа завжди буде більш ефективним, ніж числове, хоча числові типи часто зручніші для людини.


Я не згоден, коли мова йде про гроші. Використовувати масштабоване ціле число, як-от зберігання децикентів (1000 за долар) - це нормально, але незручно. Це швидко стає більш практичним у використанні NUMERIC. Масштабне ціле число є набагато кращим, ніж використання значення плаваючої точки для грошей.
Крейг Рінгер

2
@CraigRinger Я не думаю, що ти насправді не згоден зі мною! Я погоджуюсь, що використання десятків для грошей завжди менш незручно для розробника, але питання полягає в ефективності запитів, правда? Обробка цілих чисел завжди швидша. Крім того, під час написання банківських заявок ви можете стикатися з якимись дивними проблемами округлення, які більшість людей не хвилювали б, але дуже важливі для банків. Отже, я також погоджуюся з вами щодо того, що ви також не використовуєте плаваючу крапку для грошей!
stubsthewizard

1
Гарний момент на округлення. Я хочу, щоб у PostgreSQL була підтримка політики округлення. Не бажайте цього достатньо для його втілення;)
Крейг Рінгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.