メインコンテンツへスキップ
メインコンテンツへスキップ

Snowflake SQL 変換ガイド

データ型

数値型

ClickHouse と Snowflake 間でデータを移動するユーザーは、数値型の宣言に関して、ClickHouse の方がより細かい精度指定を提供していることにすぐに気づくでしょう。例えば、 Snowflake は数値型として Number 型を提供します。これはユーザーが 精度(桁数の合計)とスケール(小数点以下の桁数)を最大 38 まで指定することを要求します。 整数の宣言は Number と同義であり、範囲が同じとなるように固定の精度とスケールを 単に定義します。この利便性は、精度を変更しても(整数の場合、スケールは 0) Snowflake 上でのディスク上のデータサイズに影響しないために可能となっています。 書き込み時にはマイクロパーティション単位で、その数値範囲に必要な最小限のバイト数が 使用されます。ただしスケールはストレージ容量に影響し、その影響は圧縮によって軽減されます。 Float64 型は、精度を犠牲にする代わりに、より広い値の範囲を提供します。

これと対照的に、ClickHouse は符号付きおよび符号なしの複数のビット幅の 浮動小数点数および整数型を提供します。これにより、ClickHouse のユーザーは 整数に必要な精度を明示的に指定して、ストレージおよびメモリのオーバーヘッドを最適化できます。 Snowflake の Number 型と同等の Decimal 型は、最大 76 桁まで指定でき、Snowflake よりも 2 倍の精度とスケールを提供します。同様の Float64 値に加えて、 ClickHouse は精度がそれほど重要ではなく、圧縮が最優先となる場合のために Float32 も提供します。

文字列型

ClickHouse と Snowflake は、文字列データの保存方法について対照的なアプローチを取ります。 Snowflake の VARCHAR は UTF-8 の Unicode 文字を保持し、ユーザーが 最大長を指定できるようにします。この長さはストレージやパフォーマンスには影響せず、 文字列を格納するために常に最小限のバイト数が使用されます。そのため、長さ指定は 下流のツールで有用な制約を提供するだけです。TextNChar といった他の型は、 この型の単なるエイリアスです。対照的に ClickHouse は、すべての 文字列データを生のバイト列として String 型で保存します(長さの指定は不要)。エンコーディングはユーザーに委ねられ、 さまざまなエンコーディングに対しては クエリ時の関数 が利用できます。 その理由付けについては "Opaque data argument" を参照してください。このため ClickHouse の String は、その実装上、 Snowflake の Binary 型により近いと言えます。SnowflakeClickHouse の両方が 「照合順序(collation)」をサポートしており、ユーザーは文字列のソートおよび比較方法を カスタマイズできます。

準構造化データ型

Snowflake は、準構造化データ向けに VARIANTOBJECTARRAY 型を サポートしています。

ClickHouse は、同等の VariantObject(現在はネイティブな JSON 型に置き換えられ非推奨)および Array 型を提供します。さらに ClickHouse には JSON 型があり、これは現在非推奨の Object('json') 型を置き換え、特に 他のネイティブ JSON 型と比較して 高いパフォーマンスとストレージ効率を実現します。

ClickHouse は、名前付きの Tuple および Nested 型を通じた Tuple の配列もサポートしており、ユーザーが入れ子構造を明示的にマッピングできます。 これにより、Snowflake とは異なり、階層全体にわたってコーデックや型の 最適化を適用できます。Snowflake では外側のオブジェクトに対して OBJECTVARIANTARRAY 型を使用する必要があり、 内部型を明示的に指定することはできません。 ClickHouse におけるこの内部型指定は、入れ子になった数値に対するクエリを単純化し、 キャストが不要でインデックス定義にもそのまま使用できます。

ClickHouse では、サブ構造にもコーデックや最適化された型を適用できます。 これにより、入れ子構造を持つデータでも圧縮効率が高く、 フラット化されたデータと同等の優れた結果が得られるという 追加の利点があります。対照的に、サブ構造に対して特定の型を適用できない結果として、 Snowflake では最適な圧縮を実現するために 入れ子構造をフラット化することを推奨 しています。また、Snowflake はこれらのデータ型に対して サイズ制限を課しています

型リファレンス

SnowflakeClickHouse注記
NUMBERDecimalClickHouse は Snowflake よりも精度とスケールを 2 倍高い値までサポートしており、76 桁に対して Snowflake は 38 桁です。
FLOAT, FLOAT4, FLOAT8Float32, Float64Snowflake では、すべての浮動小数点数は 64 ビットです。
VARCHARString
BINARYString
BOOLEANBool
DATEDate, Date32Snowflake の DATE は ClickHouse よりも広い日付範囲を扱えます。たとえば、Date32 の最小値は 1900-01-01Date の最小値は 1970-01-01 です。ClickHouse の Date は、よりコスト効率の高い(2 バイトの)ストレージを提供します。
TIME(N)完全に対応する型はありませんが、DateTimeDateTime64(N) で表現できます。DateTime64 でも同じ精度の概念が使われます。
TIMESTAMP - TIMESTAMP_LTZ, TIMESTAMP_NTZ, TIMESTAMP_TZDateTimeDateTime64DateTimeDateTime64 では、列に対してオプションとして TZ パラメータを定義できます。指定されていない場合は、サーバーのタイムゾーンが使用されます。さらに、クライアントには --use_client_time_zone パラメータも用意されています。
VARIANTJSON, Tuple, NestedJSON 型は ClickHouse において実験的機能です。この型では挿入時に列の型が推論されます。代替として、TupleNestedArray を使用して、明示的に型付けされた構造を構築することもできます。
OBJECTTuple, Map, JSONOBJECTMap はどちらも、キーが String である ClickHouse の JSON 型に相当します。ClickHouse では値が一貫していて強い型付けであることが求められますが、Snowflake では VARIANT が使用されます。これは、異なるキーごとに異なる型の値を持てることを意味します。ClickHouse でこれが必要な場合は、Tuple を使って階層を明示的に定義するか、JSON 型を使用してください。
ARRAYArray, NestedSnowflake の ARRAY は、要素にスーパータイプである VARIANT を使用します。対照的に、ClickHouse ではこれらの要素は厳密に型付けされています。
GEOGRAPHYPoint, Ring, Polygon, MultiPolygonSnowflake では座標系 (WGS 84) が固定されますが、ClickHouse ではクエリ実行時に座標系を適用します。
GEOMETRYPoint, Ring, Polygon, MultiPolygon
ClickHouse TypeDescription
IPv4 and IPv6IP 固有の型であり、Snowflake と比較してより効率的に保存できる可能性があります。
FixedString固定長のバイト列を使用でき、ハッシュに有用です。
LowCardinality任意の型を辞書エンコードできるようにします。カーディナリティが 100k 未満と見込まれる場合に有用です。
Enum名前付き値を 8 または 16 ビットの範囲で効率的にエンコードできます。
UUIDUUID を効率的に保存するための型です。
Array(Float32)ベクトルは、距離関数をサポートする Float32 の配列として表現できます。

最後に、ClickHouse は中間的な 集約関数の状態 を保存できるという、独自の機能を提供します。この状態は実装依存ですが、集約結果を保存しておき、後で(対応するマージ関数を用いて)クエリできるようにします。通常、この機能はマテリアライズドビューを介して利用され、以下で示すように、挿入されたデータに対するクエリの増分結果を保存することで、最小限のストレージコストで特定のクエリのパフォーマンスを向上させることができます(詳細は後述します)。