我在NUMERIC
列中存储加密货币交易余额。由于加密货币值在某种极端范围内与传统货币相比有所不同,因此我使用NUMERIC(60,20)
类型来捕获所有用例。因为这感觉有点极端,我很好奇
增加NUMERIC列精度和比例的性能(CPU)惩罚是什么
增加NUMERIC列精度和比例的存储成本惩罚是什么
答案 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成本相形见绌,因此它可能不是问题。您必须在自己的硬件上尝试查询才能确定。