MONOTONICALLY_INCREASING_ID

monotonically_increasing_id()

功能

生成单调递增的 ID。该函数为每一行生成一个唯一的、单调递增的 64 位整数 ID。在分布式环境中,每个分区生成的 ID 范围不重叠,确保全局唯一性。

参数

  • 无参数

返回结果

  • bigint 类型
  • 返回单调递增的唯一 ID
  • ID 从 0 开始递增
  • 在分布式环境中,不同分区的 ID 不重叠

举例

SELECT a, monotonically_increasing_id() as id FROM VALUES (1), (2), (3), (4), (5) AS t(a); -- 结果: -- 1 0 -- 2 1 -- 3 2 -- 4 3 -- 5 4

SELECT a, monotonically_increasing_id() as id FROM VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10) AS t(a) DISTRIBUTE BY a; -- 结果(分布式环境下 ID 不连续,示例仅供参考): -- 1 8589934592 -- 2 17179869184 -- 3 0 -- ...

SELECT monotonically_increasing_id() as row_id, * FROM large_table;

SELECT monotonically_increasing_id() as seq, name, age FROM users ORDER BY age;

说明

  • monotonically_increasing_id 生成的 ID 具有以下特性:
    • 唯一性:每个 ID 在结果集中唯一
    • 单调性:ID 值单调递增(但不一定连续)
    • 确定性:在相同的数据分布下,生成的 ID 相同
  • 在分布式环境中,ID 的生成方式:
    • 每个分区分配一个 ID 范围
    • 分区内的 ID 连续递增
    • 不同分区的 ID 范围不重叠
    • ID 的高位用于标识分区,低位用于标识分区内的行号
  • ID 的构成(64 位):
    • 高 33 位:分区 ID
    • 低 31 位:分区内的行号
    • 因此,每个分区最多可以有 231 - 1 行
  • 与 row_number() 的区别:
    • monotonically_increasing_id() 在分布式环境中更高效
    • row_number() 需要全局排序,开销较大
    • monotonically_increasing_id() 不保证连续性
  • 注意事项:
    • ID 不一定从 0 开始(在分布式环境中)
    • ID 之间可能有间隙
    • 不应依赖 ID 的具体值,只能依赖其唯一性和单调性
    • 相同的查询在不同的执行中可能生成不同的 ID(如果数据分布改变)
  • 该函数常用于:
    • 为表中的行生成唯一标识符
    • 数据导出时添加序列号
    • 临时表的主键生成
    • 数据分区和分桶
  • 如需生成连续的行号,请使用 row_number() 窗口函数
联系我们
预约咨询
微信咨询
电话咨询
邮件咨询