メインコンテンツまでスキップ
メインコンテンツまでスキップ

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 で保持し、ユーザーが最大長を指定できるようにします。この長さはストレージやパフォーマンスに影響を与えず、常に文字列を保存するために必要最小限のバイト数が使用され、実際には下流のツールに役立つ制約だけを提供します。他のタイプ、例えば TextNChar は、このタイプの単なる別名です。一方、ClickHouse はすべての 文字列データを生のバイト として String 型(長さ指定不要)で保存し、エンコーディングはユーザーに委ねられています。さまざまなエンコーディング用の クエリ時関数 が利用可能です。詳細については "Opaque data argument" を参照してください。したがって、ClickHouse の String は、実装において Snowflake の Binary 型により類似しています。両方の SnowflakeClickHouse は、「照合」をサポートしており、ユーザーは文字列のソートと比較の方法をオーバーライドできます。

半構造化データ型

Snowflake は、半構造化データ用に VARIANTOBJECT、および ARRAY 型をサポートしています。

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

ClickHouse は、名前付き Tuple および Tuple の配列を Nested 型を通じてサポートしており、ユーザーはネストされた構造を明示的にマッピングできます。これにより、Snowflake が外部オブジェクト用に OBJECTVARIANT、および ARRAY 型を使用させるのに対し、コーデックや型の最適化を階層全体に適用されることが可能になります。また、クリックハウスのネストされた数値クエリは、キャストする必要がなく、インデックス定義で使用できるため、クエリが簡素化されます。

ClickHouse では、コーデックや最適化された型をサブ構造に適用することもできます。これにより、ネストされた構造との圧縮性能を維持し、平坦化データと同様に優れた性能を持ちます。対照的に、Snowflake はサブ構造に特定の型を適用できないため、最適な圧縮を達成するためにデータを 平坦化する ことを推奨しています。また、Snowflake はこれらのデータ型に対して サイズ制限を課します

型参照

SnowflakeClickHouse注意
NUMBERDecimalClickHouse は Snowflake の 2 倍の精度とスケールをサポート - 76 桁対 38 桁。
FLOAT, FLOAT4, FLOAT8Float32, Float64Snowflake のすべての浮動小数点数は 64 ビットです。
VARCHARString
BINARYString
BOOLEANBool
DATEDate, Date32Snowflake の DATE は ClickHouse より広い日付範囲を提供します。たとえば、Date32 の最小は 1900-01-01 で、Date の最小は 1970-01-01 です。ClickHouse の Date はよりコスト効率の良い(2 バイト)ストレージを提供します。
TIME(N)直接の同等物はありませんが、DateTime および DateTime64(N) で表現できます。DateTime64 は精度の同様の概念を使用します。
TIMESTAMP - TIMESTAMP_LTZTIMESTAMP_NTZTIMESTAMP_TZDateTime および DateTime64DateTime および DateTime64 は、オプションで TZ パラメータを列に定義できます。存在しない場合は、サーバのタイムゾーンが使用されます。また、クライアント用の --use_client_time_zone パラメータも利用可能です。
VARIANTJSON, Tuple, NestedJSON 型は ClickHouse では実験的です。この型は挿入時に列の型を推論します。TupleNested および Array も明示的型構造を構築するための代替手段として使用できます。
OBJECTTuple, Map, JSONOBJECT および Map は、ClickHouse の JSON 型に類似しており、キーは String です。ClickHouse では値が一貫しており強く型付けされる必要がありますが、Snowflake は VARIANT を使用します。これは異なるキーの値が異なる型であることを意味し、これが必要な場合は Tuple を使用して階層を明示的に定義するか、JSON 型に依存します。
ARRAYArrayNestedSnowflake の ARRAY は要素に VARIANT を使用します - スーパ 型です。対照的に、ClickHouse ではこれらは強く型付けされています。
GEOGRAPHYPoint, Ring, Polygon, MultiPolygonSnowflake は座標系(WGS 84)を課しますが、ClickHouse はクエリ時に適用します。
GEOMETRYPoint, Ring, Polygon, MultiPolygon
ClickHouse 型説明
IPv4IPv6IP 特有の型で、Snowflake よりも効率的なストレージを可能にします。
FixedStringハッシュ用途に便利な固定長のバイトを許可します。
LowCardinalityカーディナリティが < 100k になることが予想される場合に便利な辞書エンコードを許可します。
Enum8 または 16 ビット範囲内の名前付き値の圧縮効率の良いエンコーディングを許可します。
UUIDUUID の効率的なストレージのために。
Array(Float32)ベクトルをサポートされた距離関数のある Float32 の配列として表現できます。

最後に、ClickHouse は集約関数の中間 状態 を保存する独自の能力を提供します。この状態は実装固有ですが、集約の結果を保存し、後でクエリできることを可能にします(対応するマージ関数と共に)。通常、この機能はマテリアライズドビューを介して使用され、以下に示すように、挿入データに対するクエリの増分結果を保存することでストレージコストを最小限に抑えつつ特定のクエリの性能を向上させることができます(詳細はこちら)。