すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:fixnumeric

最終更新日:Mar 28, 2026

FIXNUMERIC は、AnalyticDB for PostgreSQL 向けの固定精度 10 進数データ型です。10 進数値を、あらかじめ設定されたスケールを持つネイティブ整数 (INT64 または INT128) として格納します。FIXNUMERIC は、10 進数値を整数にマッピングすることで、可変精度演算のオーバーヘッドや、浮動小数点計算における 2 進数表現エラーによる精度損失を回避します。大規模な集約や金融計算などのコンピューティング集約型ワークロードにおいて、FIXNUMERIC はネイティブの NUMERIC 型や DECIMAL 型よりも大幅に優れたパフォーマンスを発揮します。

FIXNUMERIC の利用シーン

ご利用のワークロードで以下のすべてが必要な場合は、FIXNUMERIC を使用してください。

  • 正確な 10 進数値:丸め誤差が許容されない金融計算、台帳、課金、コンプライアンスレポートなど

  • 高いクエリパフォーマンス:数値列に対する大規模な SUMAVG、またはその他の集約

  • 予測可能なデータ範囲:64 ビットまたは 128 ビット整数範囲に収まる値

以下が必要な場合は、NUMERIC を使用してください。

  • NaN のサポートFIXNUMERIC は NaN 値をサポートしていません

  • 無制限の範囲:64 ビットまたは 128 ビットの固定整数境界を超える値

  • 可変スケール:行によって小数点以下の桁数が異なる列

FIXNUMERIC の仕組み

FIXNUMERIC は、各 10 進数値を、あらかじめ設定されたスケールに等しい 10 のべき乗で乗算して整数にマッピングし、その結果をネイティブ整数レジスタに格納します。たとえば、スケール 6 の 3.141592 は、整数 3141592 として格納されます。算術演算は、ネイティブ CPU 命令セットを使用してこれらの整数上で直接実行されます。これが、FIXNUMERIC 列に対する集約クエリが NUMERIC 列に対する同等のクエリよりも大幅に高速である理由です。

FIXNUMERIC には 2 つのバリアントがあります。データに必要な精度と範囲に基づいて選択してください。

バリアントストレージ精度同等の型最適な用途
FIXNUMERIC64 ビット整数 (INT64)最大 19 桁、小数点以下 6 桁NUMERIC(19,6)小規模および中規模の計算
FIXNUMERIC128128 ビット整数 (INT128)最大 38 桁、小数点以下 10 桁NUMERIC(38,10)広範囲、高精度の分析
値が 19 桁を超える有効数字、または小数点以下 6 桁を超える桁数を必要としない限り、FIXNUMERIC128 よりも FIXNUMERIC を使用することを推奨します。

NUMERIC との比較

機能FIXNUMERIC / FIXNUMERIC128NUMERIC
精度固定 (デフォルトで小数点以下 6 桁または 10 桁)可変
範囲制限あり (64 ビットまたは 128 ビット整数に基づく)ほぼ無制限
パフォーマンス高 (ネイティブ CPU 命令セットに基づく操作による)
丸め方法ゼロ方向への丸め最近接への丸め
NaN のサポートサポートされていませんサポートされています

算術演算における型変換

一部の関数は、結果を計算する前に FIXNUMERIC 値を DOUBLE に変換します。これは、roundsqrtexplnpowpowerlog、および log10 に適用されます。これらの関数の出力は FIXNUMERIC ではなく、浮動小数点値です。正確な 10 進数の結果を返す必要がある操作には、代わりに truncabsceilfloor、または標準の算術演算子を使用してください。

制限事項

  • AnalyticDB for PostgreSQL V7.0 インスタンスのうち、V7.2.1.1 以降のマイナーバージョンを実行しているもののみが、fixnumeric 拡張をサポートします。マイナーバージョンを確認するには、「インスタンスのマイナーバージョンを表示する」をご参照ください。スペックアップするには、「UpgradeDBVersion」をご参照ください。

  • サーバーレスモードのインスタンスは fixnumeric 拡張機能をサポートしていません。

  • FIXNUMERICFIXNUMERIC128 には固定の値範囲があります。範囲を超える値を挿入すると、オーバーフローエラーが発生します。

  • スケールは列レベルではなく、型レベルで固定されます。列を作成するときにスケールを指定する必要はありません。スケールは、FIXNUMERIC では 6FIXNUMERIC128 では 10 にあらかじめ設定されています。

拡張機能のインストール

fixnumeric 拡張機能は、GUI ベースのインストールをサポートしていません。インストールするには、してください。インストール後、AnalyticDB for PostgreSQL インスタンスを再起動してください。拡張機能をアンインストールするには、チケットを送信してください。

クエリでの FIXNUMERIC の使用

FIXNUMERIC は他の数値データ型と同様に機能し、正確な値を必要とする FLOAT または DOUBLE PRECISION 列を置き換えることができます。

ステップ 1:テーブルの作成とデータの挿入

FIXNUMERIC 列と FIXNUMERIC128 列を FLOAT 列と NUMERIC 列とともに持つテーブルを作成して、動作を比較します。

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;

ステップ 2:インデックスの作成

FIXNUMERIC はインデックスをサポートしています。FIXNUMERIC 列にインデックスを作成します。

CREATE INDEX ON test_t (c);
CREATE INDEX ON test_t (d);

ステップ 3:集約クエリの実行

各列の SUM をクエリします。FLOAT 列は 2 進数表現エラーのために近似値を返しますが、NUMERICFIXNUMERIC、および FIXNUMERIC128 はすべて正確な値を返します。

SELECT SUM(a), SUM(b), SUM(c), SUM(d) FROM test_t;
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;
avg        |         avg          |    avg     |      avg
-------------------+----------------------+------------+----------------
 500.6000000000017 | 500.6000000000000000 | 500.600000 | 500.6000000000
(1 row)

サポートされる関数

FIXNUMERIC は、すべての集計関数を含め、NUMERIC または DECIMAL 型をサポートするほとんどの関数と互換性があります。浮動小数点の結果を返す関数には、アスタリスク (*) が付いています。

関数説明
sumavgminmax合計、平均、最小値、または最大値を計算します
in_range値が範囲内にあるかどうかを確認します
abs絶対値を返します
sign値の符号を返します:-10、または+1
trunc数値を指定した小数点以下の桁数に切り捨てます
ceil最も近い整数に切り上げます
ceilingceil
floor最も近い整数に切り捨てます
mod除算の剰余を返します
scale小数点以下の桁数を返します
addsubmuldiv加算、減算、乗算、除算
=><<=>=<>比較演算子
round*最も近い整数に丸めます。DOUBLE
sqrt*平方根を返します。DOUBLE
exp*自然指数を返します。DOUBLE
ln*自然対数を返します。DOUBLE
pow*べき乗を計算します。DOUBLE
power*pow のエイリアス。DOUBLE
log*対数演算。DOUBLE
log10*10 を底とする対数。DOUBLE
to_char文字列に変換します。FIXNUMERIC は最初に NUMERIC にキャストされます

*これらの関数は、計算前に FIXNUMERICDOUBLE に変換します。結果は浮動小数点値です。