fixnumeric

更新时间:

云原生数据仓库 AnalyticDB PostgreSQL 版引入了FIXNUMERIC类型,通过固定精度与底层整数存储结合,在计算密集场景中性能显著优于原生NUMERICDECIMAL类型,聚合和四则运算等操作性能提升数倍,同时在指定范围内保持无损精度。

fixnumeric简介

FIXNUMERICAnalyticDB for PostgreSQL特有的一种固定精度的十进制类型,旨在提供比原生NUMERICDECIMAL类型更优的性能和更高效的存储。作为NUMERICDECIMAL类型的高性能子集,FIXNUMERIC通过底层整数存储机制(INT 64INT 128)和预设标度(即Scale,指小数位数)将小数映射为整数,从而避免了传统NUMERICDECIMAL类型模拟十进制计算开销以及浮点数运算中因二进制表示误差导致的精度损失。FIXNUMERIC类型适用于需要高精度计算、数据范围可控,且对性能和磁盘空间要求较高的场景。

FIXNUMERIC有以下两种类型。

  • FIXNUMERIC:基于64位整数实现,固定精度为(19,6),即最多支持19位数字,其中包含6位小数,相当于NUMERIC(19,6)。适用于中小规模数据计算场景,兼顾性能与存储效率。

  • FIXNUMERIC128:基于128位整数实现,固定精度为(38,10),即最多支持38位数字,其中包含10位小数,相当于NUMERIC(38,10)。适合处理更大范围、更高精度的数据计算需求,尤其在大规模数据分析场景中表现出色。

NUMERIC类型的比较

特性

FIXNUMERICFIXNUMERIC128

NUMERIC

精度

固定 (默认6位小数或10位小数)。

可变。

范围

有限 (基于64位整数或128位整数)。

几乎无限。

性能

高 (使用原生CPU指令集运算)。

较低。

舍入方式

向零舍入。

四舍五入。

NaN支持

不支持。

支持。

使用限制

  • 内核版本为V7.2.1.1及以上的AnalyticDB for PostgreSQL7.0版实例。

    说明

    您可以在控制台实例的基本信息页查看内核小版本。如不满足上述版本要求,需要您升级内核小版本

  • 暂不支持AnalyticDB for PostgreSQLServerless模式。

  • 溢出风险:FIXNUMERICFIXNUMERIC128类型的数值范围固定,若数据超出其支持范围,将引发溢出错误。

  • 固定标度:与原生DECIMALNUMERIC类型不同,FIXNUMERIC的标度在创建列时即固定,无法动态调整。同时,由于标度在底层已预设,建表时无需显式定义。

安装与卸载

fixnumeric暂不支持白屏化安装,如有需要请提交工单联系工作人员协助安装(需要重启实例)。如有卸载插件需求,也请提交工单联系工作人员协助卸载。

使用示例

FIXNUMERIC类型的使用方法与AnalyticDB for PostgreSQL的其他数据类型类似,能够无缝替代浮点数类型(如FLOATDOUBLE 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的结果是近似值(有精度损失),NUMERICFIXNUMERICFIXNUMERIC128的结果是精确值。

            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的结果是近似值,NUMERICFIXNUMERICFIXNUMERIC128的结果是精确值。

            avg        |         avg          |    avg     |      avg
    -------------------+----------------------+------------+----------------
     500.6000000000017 | 500.6000000000000000 | 500.600000 | 500.6000000000
    (1 row)

支持函数

FIXNUMERIC类型在功能上具备高度的兼容性和扩展性,不仅支持全部的聚合函数(如SUMAVGMINMAX等),还兼容大部分原生DECIMALNUMERIC类型的函数。支持的函数如下表。

函数名称

描述

sumavgminmax

聚合函数:计算和、计算平均值、取最小值、取最大值。

in_range

检查某个值是否位于一个范围的上下界之间。

abs

取绝对值。

sign

返回参数数值的符号 (-1, 0, +1)。

round

对数值四舍五入,并返回结果,FIXNUMERIC类型将转为DOUBLE类型处理。

trunc

截断数值到指定小数位数。

ceil

向上取整到最接近的整数。

ceiling

向上取整到最接近的整数(ceil的别名)。

floor

向下取整到最接近的整数。

addsubmuldiv

基本算术运算:加减乘除。

=><<=>=<>

比较操作符:等于、大于、小于、小于等于、大于等于、不等于。

mod

取余数。

sqrt

取平方根,转为DOUBLE类型计算。

exp

取自然指数,转为DOUBLE类型计算。

ln

取自然对数,转为DOUBLE类型计算。

pow

幂运算,转为DOUBLE类型计算。

power

幂运算,转为DOUBLE类型计算(pow的别名)。

scale

返回数字小数点后的位数。

log

对数运算,转为DOUBLE类型计算。

log10

10为底的对数,转为DOUBLE类型计算。

to_char

将数字转为格式化为字符串,内部转为NUMERIC类型处理。