データ型
PG-Stromは以下のデータ型をGPUで利用する事ができます。
数値データ型
SQLデータ型 | 内部データ形式 | データ長 | 備考 |
---|---|---|---|
smallint |
short |
2 bytes | |
integer |
int |
4 bytes | |
bigint |
long |
8 bytes | |
float2 |
short |
2 bytes | 半精度浮動小数点型。PG-Stromによる独自拡張。 |
real |
float |
4 bytes | |
float |
double |
8 bytes | |
numeric |
int128 |
可変長 | 内部形式は128bit固定少数点型 |
Note
GPUがnumeric
型のデータを処理する際、実装上の理由からこれを128bit固定少数点の内部表現に変換して処理します。(これは Apache Arrow のDecimal
型と同一の形式です)
これら内部表現への/からの変換は透過的に行われますが、例えば、桁数の大きなnumeric
型のデータは表現する事ができないため、PG-StromはCPU側でのフォールバック処理を試みます。したがって、桁数の大きなnumeric
型のデータをGPUに与えると却って実行速度が低下してしまう事になります。
これを避けるには、GUCパラメータpg_strom.enable_numeric_type
を使用してnumeric
データ型を含む演算式をGPUで実行しないように設定します。
Note
GPUでは半精度浮動小数点型がハードウェアでサポートされていますが、CPU(x86_64プロセッサ)では未対応です。そのため、float2
データ型をCPUで処理する場合には、これを一度float
やdouble
型に変換した上で演算を行います。そのため、GPUのようにfloat2
の方が演算速度で有利という事はありません。機械学習や統計解析用途にデータ量を抑制するための機能です。
標準の日付時刻型
SQLデータ型 | 内部データ形式 | データ長 | 備考 |
---|---|---|---|
date |
DateADT |
4 bytes | |
time |
TimeADT |
8 bytes | |
timetz |
TimeTzADT |
12 bytes | |
timestamp |
Timestamp |
8 bytes | |
timestamptz |
TimestampTz |
8 bytes | |
interval |
Interval |
16 bytes | time interval |
標準の可変長データ型
SQLデータ型 | 内部データ形式 | データ長 | 備考 |
---|---|---|---|
bpchar |
varlena * |
可変長 | |
varchar |
varlena * |
可変長 | |
bytea |
varlena * |
可変長 | |
text |
varlena * |
可変長 |
標準の非構造データ型
SQLデータ型 | 内部データ形式 | データ長 | 備考 |
---|---|---|---|
jsonb |
varlena * |
可変長 |
Note
jsonb
データ型をGPUで処理させる場合には、次の2つの点に留意してください。
実際に参照されない属性もストレージから読み出し、GPUに転送する必要があるため、I/Oバスの利用効率は必ずしも良くないデータ型である事。データ長がTOAST化の閾値(通常は2kB弱)を越えてしまった場合、jsonb
データ全体がTOASTテーブルへ書き出されるため、GPU側では処理できず非効率なCPU-fallback処理を呼び出してしまう事。
後者の問題に対しては、テーブルのストレージオプションtoast_tuple_target
を拡大し、TOAST化の閾値を引き上げる事である程度は回避する事も可能です。
標準の雑多なデータ型
SQLデータ型 | 内部データ形式 | データ長 | 備考 |
---|---|---|---|
boolean |
cl_bool |
1 byte | |
money |
cl_long |
8 bytes | |
uuid |
pg_uuid |
16 bytes | |
macaddr |
macaddr |
6 bytes | |
inet |
inet_struct |
7 bytes or 19 bytes | |
cidr |
inet_struct |
7 bytes or 19 bytes |
標準の範囲型
SQLデータ型 | 内部データ形式 | データ長 | 備考 |
---|---|---|---|
int4range |
__int4range |
14 bytes | |
int8range |
__int8range |
22 bytes | |
tsrange |
__tsrange |
22 bytes | |
tstzrange |
__tstzrange |
22 bytes | |
daterange |
__daterange |
14 bytes |