Snowflake SQL 翻訳ガイド
データ型
数値
ClickHouse と Snowflake の間でデータを移動するユーザーは、ClickHouse が数値を宣言する際により細かな精度を提供することにすぐに気付くでしょう。たとえば、Snowflake では数値用の型 Number を提供しています。これにより、ユーザーは精度(桁数の合計)とスケール(小数点以下の桁数)を最大 38 まで指定する必要があります。整数の宣言は Number と同義であり、固定の精度とスケールを定義しますが、範囲は同じです。この便利さは、精度を変更すること(整数の場合、スケールは 0)の影響を Snowflake のディスク上のデータサイズに与えないことが可能です - 書き込み時にはマイクロパーティションレベルで数値範囲に対して必要最小限のバイトが使用されます。ただし、スケールは、ストレージ容量に影響を与え、圧縮で相殺されます。Float64
型は、精度が失われる代わりにより広範な値の範囲を提供します。
これに対して、ClickHouse は浮動小数点数および整数用に複数の符号付きおよび符号なし精度を提供しています。これにより、ClickHouse ユーザーは整数のストレージとメモリオーバーヘッドを最適化するために必要な精度を明示的に指定できます。また、Snowflake の Number 型に相当する Decimal 型は、76 桁で 2 倍の精度とスケールを提供します。さらに、同様の Float64
値に加え、ClickHouse は精度がそれほど重要でなく圧縮が最優先される場合のために Float32
も提供しています。
文字列
ClickHouse と Snowflake は、文字列データのストレージに対して対照的なアプローチを取っています。Snowflake の VARCHAR
は、Unicode 文字を UTF-8 で保持し、ユーザーが最大長を指定できるようにします。この長さはストレージやパフォーマンスに影響を与えず、常に文字列を保存するために必要最小限のバイト数が使用され、実際には下流のツールに役立つ制約だけを提供します。他のタイプ、例えば Text
や NChar
は、このタイプの単なる別名です。一方、ClickHouse はすべての 文字列データを生のバイト として String
型(長さ指定不要)で保存し、エンコーディングはユーザーに委ねられています。さまざまなエンコーディング用の クエリ時関数 が利用可能です。詳細については "Opaque data argument" を参照してください。したがって、ClickHouse の String
は、実装において Snowflake の Binary 型により類似しています。両方の Snowflake と ClickHouse は、「照合」をサポートしており、ユーザーは文字列のソートと比較の方法をオーバーライドできます。
半構造化データ型
Snowflake は、半構造化データ用に VARIANT
、OBJECT
、および ARRAY
型をサポートしています。
ClickHouse は、同等の Variant
、Object
(現在はネイティブ JSON
型に取って代わられています)および Array
型を提供しています。さらに、ClickHouse には、現在非推奨の Object('json')
型を置き換える JSON
型があり、特に 他のネイティブ JSON 型と比較して パフォーマンスが高く、ストレージ効率に優れています。
ClickHouse は、名前付き Tuple
および Tuple
の配列を Nested
型を通じてサポートしており、ユーザーはネストされた構造を明示的にマッピングできます。これにより、Snowflake が外部オブジェクト用に OBJECT
、VARIANT
、および ARRAY
型を使用させるのに対し、コーデックや型の最適化を階層全体に適用されることが可能になります。また、クリックハウスのネストされた数値クエリは、キャストする必要がなく、インデックス定義で使用できるため、クエリが簡素化されます。
ClickHouse では、コーデックや最適化された型をサブ構造に適用することもできます。これにより、ネストされた構造との圧縮性能を維持し、平坦化データと同様に優れた性能を持ちます。対照的に、Snowflake はサブ構造に特定の型を適用できないため、最適な圧縮を達成するためにデータを 平坦化する ことを推奨しています。また、Snowflake はこれらのデータ型に対して サイズ制限を課します。
型参照
Snowflake | ClickHouse | 注意 |
---|---|---|
NUMBER | Decimal | ClickHouse は Snowflake の 2 倍の精度とスケールをサポート - 76 桁対 38 桁。 |
FLOAT , FLOAT4 , FLOAT8 | Float32 , Float64 | Snowflake のすべての浮動小数点数は 64 ビットです。 |
VARCHAR | String | |
BINARY | String | |
BOOLEAN | Bool | |
DATE | Date , Date32 | Snowflake の DATE は ClickHouse より広い日付範囲を提供します。たとえば、Date32 の最小は 1900-01-01 で、Date の最小は 1970-01-01 です。ClickHouse の Date はよりコスト効率の良い(2 バイト)ストレージを提供します。 |
TIME(N) | 直接の同等物はありませんが、DateTime および DateTime64(N) で表現できます。 | DateTime64 は精度の同様の概念を使用します。 |
TIMESTAMP - TIMESTAMP_LTZ 、TIMESTAMP_NTZ 、TIMESTAMP_TZ | DateTime および DateTime64 | DateTime および DateTime64 は、オプションで TZ パラメータを列に定義できます。存在しない場合は、サーバのタイムゾーンが使用されます。また、クライアント用の --use_client_time_zone パラメータも利用可能です。 |
VARIANT | JSON , Tuple , Nested | JSON 型は ClickHouse では実験的です。この型は挿入時に列の型を推論します。Tuple 、Nested および Array も明示的型構造を構築するための代替手段として使用できます。 |
OBJECT | Tuple , Map , JSON | OBJECT および Map は、ClickHouse の JSON 型に類似しており、キーは String です。ClickHouse では値が一貫しており強く型付けされる必要がありますが、Snowflake は VARIANT を使用します。これは異なるキーの値が異なる型であることを意味し、これが必要な場合は Tuple を使用して階層を明示的に定義するか、JSON 型に依存します。 |
ARRAY | Array 、Nested | Snowflake の ARRAY は要素に VARIANT を使用します - スーパ 型です。対照的に、ClickHouse ではこれらは強く型付けされています。 |
GEOGRAPHY | Point , Ring , Polygon , MultiPolygon | Snowflake は座標系(WGS 84)を課しますが、ClickHouse はクエリ時に適用します。 |
GEOMETRY | Point , Ring , Polygon , MultiPolygon |
ClickHouse 型 | 説明 |
---|---|
IPv4 と IPv6 | IP 特有の型で、Snowflake よりも効率的なストレージを可能にします。 |
FixedString | ハッシュ用途に便利な固定長のバイトを許可します。 |
LowCardinality | カーディナリティが < 100k になることが予想される場合に便利な辞書エンコードを許可します。 |
Enum | 8 または 16 ビット範囲内の名前付き値の圧縮効率の良いエンコーディングを許可します。 |
UUID | UUID の効率的なストレージのために。 |
Array(Float32) | ベクトルをサポートされた距離関数のある Float32 の配列として表現できます。 |
最後に、ClickHouse は集約関数の中間 状態 を保存する独自の能力を提供します。この状態は実装固有ですが、集約の結果を保存し、後でクエリできることを可能にします(対応するマージ関数と共に)。通常、この機能はマテリアライズドビューを介して使用され、以下に示すように、挿入データに対するクエリの増分結果を保存することでストレージコストを最小限に抑えつつ特定のクエリの性能を向上させることができます(詳細はこちら)。