列的数字与整数-大小和性能


11

我有一个使用PostgreSQL表的应用程序。该表非常大(数十亿行),并且有一列是整数。

integer可高达6个位数,即0-999,999,没有底片。

我考虑过将其更改为numeric(6,0)

这是个好主意吗?会numeric(6,0)占用更少的字节吗?性能如何(该表被查询很多)?

Answers:


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案例中可以用单独的约束条件解决
Lennart

1
numeric列更改为有问题 int吗?
Racer SQL

@RacerSQL是的,如果您的值将溢出int大小。
DylanYoung

5

对于您所有的问题,绝对的答案是否定的。整数始终是您可以使用它的任何方法。(例如,金钱)

考虑一分钟。当数据库引擎遇到一个整数时,它会非常有效地处理它,因为对其没有太多解释。这是一个整数。数值类型的行为更像是字符串。引擎首先必须找出小数点之前和之后的部分,并对它们进行适当的按摩以执行数字运算。

尽管数字类型通常对人类来说更方便,但使用整数总是比数字更有效。


关于金钱,我不同意。使用标度整数,就像存储分位数(每美元1000个)一样可以,但很尴尬。它很快变得更实用NUMERIC。但是,缩放整数比使用浮点数货币更好。
Craig Ringer 2015年

2
@CraigRinger我不认为您实际上不同意我!我同意以十进制表示金钱对于开发人员而言总是比较麻烦,但是问题是查询效率,对吗?处理整数总是更快。此外,在编写银行应用程序时,您会遇到一些奇怪的四舍五入问题,这是大多数人不会关心的,但对银行来说非常重要。因此,我也同意您不要使用浮点数赚钱!
stubsthewizard,2015年

1
四舍五入的好点。我希望PostgreSQL有四舍五入的政策支持。不想实现它;)
Craig Ringer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.