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

encode_sort_key

複数の異種入力列から順序を保持する複合バイナリキーを作成します。この関数は、辞書順で比較した際に元のソート順序を維持する効率的なソートキーを作成するために不可欠です。

構文

encode_sort_key(column1, column2, ..., columnN)

パラメータ

  • column1, column2, ..., columnN: サポートされている任意のデータ型の1つ以上の列。この関数は可変数の引数を受け入れます。

戻り値

複合ソートキーを表すVARBINARY型の値を返します。

サポートされるデータ型

以下のデータ型がサポートされています:

データ型説明
TINYINT8ビット符号付き整数
SMALLINT16ビット符号付き整数
INT32ビット符号付き整数
BIGINT64ビット符号付き整数
LARGEINT128ビット符号付き整数
FLOAT32ビット浮動小数点数
DOUBLE64ビット浮動小数点数
VARCHAR可変長文字列
CHAR固定長文字列
DATE日付値
DATETIME日時値
TIMESTAMPタイムスタンプ値

以下の複雑な型はサポートされておらず、エラーが返されます:

  • JSON
  • ARRAY
  • MAP
  • STRUCT
  • HLL
  • BITMAP
  • PERCENTILE

エンコーディング戦略

この関数は、結果のバイナリキーの辞書順比較が元のソート順序を保持するように、異なるデータ型に対して異なるエンコーディング戦略を使用します:

  • 整数型: ビッグエンディアンバイト順序、符号付き型の符号ビットを反転
  • 浮動小数点型: 正しいソート順序を保証するカスタムエンコーディング
  • 文字列型: 非最後フィールドで0x00バイトエスケープと0x00 0x00終端子を使用する特殊エンコーディング
  • 日時型: 内部整数表現を整数値としてエンコード

NULL処理

  • 各列の各行にNULLマーカー(NULLは0x00、非NULLは0x01)が付与される
  • 一貫したエンコーディングを保証するために、非NULL列でもNULLマーカーが追加される
  • 列を区切るために区切りバイト(0x00)が使用される(最後の列の後を除く)

生成ソートキー列

CREATE TABLE user_analytics (
user_id INT,
region VARCHAR(50),
score DOUBLE,
created_date DATE,
sort_key VARBINARY(1024) AS (
encode_sort_key(region, score, created_date)
)
) ORDER BY (sort_key);

JSONフィールド抽出

CREATE TABLE json_data (
id INT,
json_content JSON,
sort_key VARBINARY(1024) AS (
encode_sort_key(
get_json_int(json_content, '$.priority'),
get_json_string(json_content, '$.category'),
get_json_double(json_content, '$.score')
)
)
) ORDER BY (sort_key);

制限

データ型制限

JSON、ARRAY、MAP、STRUCTなどの複雑な型は直接エンコードできません。プリミティブ値を取得するにはJSON抽出関数を使用してください:

-- 代わりに: encode_sort_key(json_col)
-- 使用: encode_sort_key(get_json_int(json_col, '$.field1'), get_json_string(json_col, '$.field2'))

パフォーマンス考慮事項

  • encode_sort_keyの各呼び出しで、すべての入力列のエンコーディングが必要
  • バイナリキーは元のデータよりも大幅に大きくなる可能性がある
  • エンコーディングの繰り返しを避けるために生成列を使用

キーサイズ制限

  • 列数を合理的に保つ(通常< 10)
  • 可能な限り短い文字列列を優先する
  • 非常に長い文字列にはハッシュ関数の使用を検討する