UUID
Universally Unique Identifier (UUID、汎用一意識別子) は、レコードを識別するために使用される 16 バイトの値です。UUID の詳細については、Wikipedia を参照してください。
UUIDv4 や UUIDv7 など、異なる UUID バリアントが存在しますが(こちら を参照)、ClickHouse は挿入された UUID が特定のバリアントに準拠しているかどうかを検証しません。 UUID は内部的には 16 バイトのランダムなバイト列として扱われ、SQL レベルでは 8-4-4-4-12 表記 で表現されます。
UUID 値の例:
デフォルトの UUID はすべて 0 です。これは、たとえば新しいレコードを挿入する際に、UUID 列の値が指定されていない場合などに使用されます。
歴史的経緯により、UUID は後半部分によってソートされます。
これは UUIDv4 の値については問題ありませんが、主キー索引の定義に UUIDv7 カラムを使用する場合にはパフォーマンスが低下する可能性があります(ソートキーやパーティションキーでの使用は問題ありません)。 より具体的には、UUIDv7 の値は前半がタイムスタンプ、後半がカウンタで構成されます。 したがって、スパースな主キー索引(すなわち、各インデックスグラニュールの先頭の値)における UUIDv7 のソートはカウンタフィールドに基づくものになります。 UUID が前半(タイムスタンプ)でソートされていると仮定した場合、クエリの先頭に行われる主キー索引の解析ステップでは、1 つのパーツを除くすべてのパーツで全マークを刈り込むことが期待されます。 しかし、後半(カウンタ)によるソートでは、すべてのパーツから少なくとも 1 つのマークが返されることになり、不要なディスクアクセスにつながります。
例:
結果:
回避策として、UUID を後半部分から抽出したタイムスタンプに変換できます。
ORDER BY (UUIDv7ToDateTime(uuid), uuid)
UUID の生成
ClickHouse は、ランダムな UUID バージョン 4 の値を生成するための関数 generateUUIDv4 を提供します。
使用例
例 1
この例では、UUID カラムを持つテーブルを作成し、そのテーブルに値を挿入する方法を示します。
結果:
例 2
この例では、レコード挿入時に UUID 列の値を指定しないため、つまりデフォルトの UUID 値が挿入されます。
制限事項
UUID データ型は、String データ型がサポートする関数のみをサポートします(たとえば min、max、count など)。