メインコンテンツまでスキップ
バージョン: Candidate-4.0

DECIMAL

DECIMAL(P[,S]) は高精度の固定小数点値です。P は有効桁数(精度)を表します。S は小数点以下の最大桁数(スケール)を表します。

P が省略された場合、デフォルト値は10です。S が省略された場合、デフォルト値は0です。

  • バージョン v4.0 より前のバージョンでは、StarRocks は Fast DECIMAL に基づく DECIMAL128 をサポートしています。
  • バージョン v4.0 以降では、StarRocks は DECIMAL256 をサポートしています。

機能

Fast DECIMAL

FE の動的パラメータ enable_decimal_v3 によって制御され、Fast DECIMAL はデフォルトで有効になっています。

Fast DECIMAL の場合、P の範囲は [1,38] で、S の範囲は [0, P] です。S のデフォルト値は0です。

Fast DECIMAL は可変幅の整数を使用して小数を表現します。

  • Decimal(P ≤ 18, S)

    • LogicalType: Decimal64
    • 保存形式: int64
    • Delegate LogicalType: BIGINT
  • Decimal(P > 18 & P ≤ 38, S)

    • LogicalType: Decimal128
    • 保存形式: int128
    • Delegate LogicalType: LARGEINT

バージョン v3.1 以降、StarRocks は ARRAYMAP、および STRUCT における Fast Decimal エントリをサポートしています。

DECIMAL256

StarRocks はバージョン v4.0 以降で DECIMAL256 を導入しています。

DECIMAL256 の場合、P の範囲は (38,76] で、S の範囲は [0, P] です。S のデフォルト値は0です。

DECIMAL256 は精度の上限を76ビットに拡張します。その数値容量は DECIMAL128 の 10³⁸ 倍であり、オーバーフローの可能性を無視できるレベルにまで低減します。

DECIMAL256 は Fast DECIMAL と同じ戦略を使用して小数を表現します。上記の2つの小数タイプに加えて、次のものをサポートします:

  • Decimal(P > 38 & P ≤ 76, S)
    • LogicalType: Decimal256
    • 保存形式: int256
    • Delegate LogicalType: INT_256

DECIMAL256 の実際の表現可能な範囲は -57896044618658097711785492504343953926634992332820282019728792003956564819968 から 57896044618658097711785492504343953926634992332820282019728792003956564819967 です。

型変換操作

DECIMAL256 は以下にリストされたすべての型との双方向の型変換をサポートします:

ソースタイプターゲットタイプ
TYPE_DECIMAL256BOOL
TYPE_DECIMAL256TYPE_TINYINT, TYPE_SMALLINT, TYPE_INT, TYPE_BIGINT, TYPE_LARGEINT
TYPE_DECIMAL256TYPE_FLOAT, TYPE_DOUBLE
TYPE_DECIMAL256TYPE_VARCHAR

集計関数

現在、DECIMAL256 は次の集計関数をサポートしています:COUNTCOUNT DISTINCTSUMSUM DISTINCTAVGAVG DISTINCTMAXMIN、および ABS

制限事項

DECIMAL256 には以下の制限があります:

  • 現在、DECIMAL256 は小数演算における自動精度スケールアップをサポートしていません。

    例えば、DECIMAL128 * DECIMAL128 は自動的に DECIMAL256 にスケールアップされません。DECIMAL256 の機能は、DECIMAL256 が CREATE TABLE ステートメントで明示的にオペランドとして指定されるか、CAST を使用する場合(SELECT CAST(p38s10 as DECIMAL(70, 30)))にのみ適用されます。

  • DECIMAL256 はウィンドウ関数をサポートしていません。

  • 集計テーブルは DECIMAL256 タイプをサポートしていません。

Fast DECIMAL の例

テーブルを作成する際に DECIMAL カラムを定義します。

CREATE TABLE decimalDemo (
pk BIGINT(20) NOT NULL COMMENT "",
account DECIMAL(20,10) COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(pk)
COMMENT "OLAP"
DISTRIBUTED BY HASH(pk);

INSERT INTO decimalDemo VALUES
(1,3.141592656),
(2,21.638378),
(3,4873.6293048479);

SELECT * FROM decimalDemo;
+------+-----------------+
| pk | account |
+------+-----------------+
| 1 | 3.1415926560 |
| 3 | 4873.6293048479 |
| 2 | 21.6383780000 |
+------+-----------------+

DECIMAL256 の例

DECIMAL256 タイプのカラムを持つテーブルを作成します。

CREATE TABLE test_decimal256(
p50s48 DECIMAL(50, 48) COMMENT ""
);

異なる値を挿入します:

INSERT INTO test_decimal256(p50s48) SELECT 1.222222;

このステートメントは、値が正しく書き込まれて成功します。

INSERT INTO test_decimal256(p50s48) SELECT 11111111111111111111111111111111111111111111.222222;

このステートメントは、値が NULL として書き込まれて成功します。整数部分と小数部分(44桁)が指定されたスケール(48)と共に、256ビットで表現可能な最大整数を超えているため、FE は直接値を NULL にキャストします。

INSERT INTO test_decimal256(p50s48) SELECT 333;

このステートメントはエラー ERROR 1064 (HY000): Insert has filtered data と共に返されます。整数部分と小数部分が指定されたスケール(48)と共に、50桁の整数で表現される最大値を超えているため、BE はエラーを返します。

使用上の注意

システム変数 sql_modeERROR_IF_OVERFLOW に設定することで、算術オーバーフローの場合にシステムが NULL の代わりにエラーを返すようにすることができます。

キーワード

decimal, decimalv3, fast decimal, decimal128, decimal256