AnalyticDB for 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為底的對數,轉為 |
| 將數字轉為格式化為字串,內部轉為 |