fixnumeric
云原生数据仓库 AnalyticDB PostgreSQL 版引入了FIXNUMERIC
类型,通过固定精度与底层整数存储结合,在计算密集场景中性能显著优于原生NUMERIC
或DECIMAL
类型,聚合和四则运算等操作性能提升数倍,同时在指定范围内保持无损精度。
fixnumeric简介
FIXNUMERIC
是AnalyticDB for PostgreSQL特有的一种固定精度的十进制类型,旨在提供比原生NUMERIC
或DECIMAL
类型更优的性能和更高效的存储。作为NUMERIC
或DECIMAL
类型的高性能子集,FIXNUMERIC
通过底层整数存储机制(INT 64
和INT 128
)和预设标度(即Scale,指小数位数)将小数映射为整数,从而避免了传统NUMERIC
或DECIMAL
类型模拟十进制计算开销以及浮点数运算中因二进制表示误差导致的精度损失。FIXNUMERIC
类型适用于需要高精度计算、数据范围可控,且对性能和磁盘空间要求较高的场景。
FIXNUMERIC
有以下两种类型。
FIXNUMERIC
:基于64位整数实现,固定精度为(19,6)
,即最多支持19位数字,其中包含6位小数,相当于NUMERIC(19,6)
。适用于中小规模数据计算场景,兼顾性能与存储效率。FIXNUMERIC128
:基于128位整数实现,固定精度为(38,10)
,即最多支持38位数字,其中包含10位小数,相当于NUMERIC(38,10)
。适合处理更大范围、更高精度的数据计算需求,尤其在大规模数据分析场景中表现出色。
与NUMERIC类型的比较
特性 | FIXNUMERIC或FIXNUMERIC128 | NUMERIC |
精度 | 固定 (默认6位小数或10位小数)。 | 可变。 |
范围 | 有限 (基于64位整数或128位整数)。 | 几乎无限。 |
性能 | 高 (使用原生CPU指令集运算)。 | 较低。 |
舍入方式 | 向零舍入。 | 四舍五入。 |
NaN支持 | 不支持。 | 支持。 |
使用限制
内核版本为V7.2.1.1及以上的AnalyticDB for PostgreSQL7.0版实例。
暂不支持AnalyticDB for PostgreSQL的Serverless模式。
溢出风险:
FIXNUMERIC
和FIXNUMERIC128
类型的数值范围固定,若数据超出其支持范围,将引发溢出错误。固定标度:与原生
DECIMAL
或NUMERIC
类型不同,FIXNUMERIC
的标度在创建列时即固定,无法动态调整。同时,由于标度在底层已预设,建表时无需显式定义。
安装与卸载
fixnumeric暂不支持白屏化安装,如有需要请提交工单联系工作人员协助安装(需要重启实例)。如有卸载插件需求,也请提交工单联系工作人员协助卸载。
使用示例
FIXNUMERIC
类型的使用方法与AnalyticDB for PostgreSQL的其他数据类型类似,能够无缝替代浮点数类型(如FLOAT
或DOUBLE PRECISION
)。
步骤一:创建表并写入数据
创建带有FIXNUMERIC
数据类型的表并写入测试数据。
CREATE TABLE test_t(a float, b numeric(14,6), c fixnumeric, d fixnumeric128);
INSERT INTO test_t SELECT v+0.1,v+0.1,v+0.1,v+0.1 FROM generate_series(1,1000) v;
步骤二:创建索引
FIXNUMERIC
类型支持创建索引。为test_t表创建索引。
CREATE INDEX ON test_t (c);
CREATE INDEX ON test_t (d);
步骤三:查询数据
查询对应列的
SUM
值。SELECT SUM(a), SUM(b), SUM(c), SUM(d) FROM test_t ;
结果如下。可以看到,
FLOAT
的结果是近似值(有精度损失),NUMERIC
、FIXNUMERIC
及FIXNUMERIC128
的结果是精确值。sum | sum | sum | sum --------------------+---------------+-------------------+------------------- 500600.00000000175 | 500600.000000 | 500600.0000000000 | 500600.0000000000 (1 row)
查询对应列的
AVG
值。SELECT AVG(a), AVG(b), AVG(c), AVG(d) FROM test_t;
结果如下。可以看到,
FLOAT
的结果是近似值,NUMERIC
、FIXNUMERIC
及FIXNUMERIC128
的结果是精确值。avg | avg | avg | avg -------------------+----------------------+------------+---------------- 500.6000000000017 | 500.6000000000000000 | 500.600000 | 500.6000000000 (1 row)
支持函数
FIXNUMERIC
类型在功能上具备高度的兼容性和扩展性,不仅支持全部的聚合函数(如SUM
、AVG
、MIN
、MAX
等),还兼容大部分原生DECIMAL
或NUMERIC
类型的函数。支持的函数如下表。
函数名称 | 描述 |
| 聚合函数:计算和、计算平均值、取最小值、取最大值。 |
| 检查某个值是否位于一个范围的上下界之间。 |
| 取绝对值。 |
| 返回参数数值的符号 (-1, 0, +1)。 |
| 对数值四舍五入,并返回结果, |
| 截断数值到指定小数位数。 |
| 向上取整到最接近的整数。 |
| 向上取整到最接近的整数( |
| 向下取整到最接近的整数。 |
| 基本算术运算:加减乘除。 |
| 比较操作符:等于、大于、小于、小于等于、大于等于、不等于。 |
| 取余数。 |
| 取平方根,转为 |
| 取自然指数,转为 |
| 取自然对数,转为 |
| 幂运算,转为 |
| 幂运算,转为 |
| 返回数字小数点后的位数。 |
| 对数运算,转为 |
| 以10为底的对数,转为 |
| 将数字转为格式化为字符串,内部转为 |