全部產品
Search
文件中心

AnalyticDB:fixnumeric

更新時間:Apr 24, 2025

AnalyticDB for 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類型的比較

特性

FIXNUMERIC或FIXNUMERIC128

NUMERIC

精度

固定 (預設6位小數或10位小數)。

可變。

範圍

有限 (基於64位整數或128位整數)。

幾乎無限。

效能

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

較低。

舍入方式

向零舍入。

四捨五入。

NaN支援

不支援。

支援。

使用限制

  • 核心版本為V7.2.1.1及以上的AnalyticDB for PostgreSQL7.0版執行個體。

    說明

    您可以在控制台執行個體的基本資料頁查看核心小版本。如不滿足上述版本要求,需要您升級核心小版本

  • 暫不支援AnalyticDB for PostgreSQL的Serverless模式。

  • 溢出風險: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類型處理。