在PostgreSQL中具有高精度和标度的NUMERIC类型的性能

时间:2016-11-18 21:57:26

标签: postgresql

我在NUMERIC列中存储加密货币交易余额。由于加密货币值在某种极端范围内与传统货币相比有所不同,因此我使用NUMERIC(60,20)类型来捕获所有用例。因为这感觉有点极端,我很好奇

  • 增加NUMERIC列精度和比例的性能(CPU)惩罚是什么

  • 增加NUMERIC列精度和比例的存储成本惩罚是什么

1 个答案:

答案 0 :(得分:9)

NUMERIC列的声明比例和精度用作插入值的约束,但它们不会直接影响存储要求; 1::NUMERIC(1,0)1::NUMERIC(99,98)1::NUMERIC都具有相同的基础表示。考虑到这一点,您最好的选择可能是使用不受约束的NUMERIC列,并逐个货币地将您的值转换为合适的比例/精度。

NUMERIC值存储为基数为10,000的可变长度数组,每个数字由16位整数表示,因此存储成本为每4个十进制数字2个字节,加上6个字节的标头每个值。小数部分和整数部分分开存储,因此11消耗8个字节,而1.1需要10个。您可以使用例如,检查给定值的存储要求。 SELECT pg_column_size(1.1::NUMERIC)

至于CPU开销,我预计大多数操作的成本会与数字位数成线性关系。然而,这通常与首先获取值的I / O成本相形见绌,因此它可能不是问题。您必须在自己的硬件上尝试查询才能确定。