标识列增量值差距巨大

Huge gap in increment value of identity column

我创建了一个带有标识列的 table。当我在 table 中插入值时,标识列在值之间显示巨大的增量差距。标识值从 6 跳到 10001。这是按部门 id 排序的输出:

Output Screenshot Here

这是table我创建的:

Create Table STG2.Department
(
    DepartmentID int GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1  Cycle),
    Name varchar(100),
    GroupName varchar(100)
)
PRIMARY INDEX (DepartmentID);

这就是我将值插入 Department table:

的方式
insert into STG2.Department (Name, GroupName)
    Select Distinct
        Department, GroupName 
    from DP_STG.HR;

我做错了什么?

What am I doing wrong?

你做错的是担心标识栏中的空白。这些是使用数据库的自然组成部分。最典型的原因是 deleteinsert 失败。唯一的保证(我认为)是数字在增加而不是重复。

对于您的情况,我的猜测是 Teradata 出于某些充分的原因保留了一堆数字——为了并行性或其他一些效率(我知道 SQL 服务器会这样做)。间隙不会造成伤害,插入的顺序应该很好地保留。

维护无间隙标识列对数据库来说是一个巨大 的开销,尤其是像 Teradata 这样功能强大的并行数据库。本质上就是每次插入都要完成对[=22=的所有查询,锁定table,找到最大值,加一,然后使用。写数据库的人都知道这是什么性能杀手,对这样的列要求比较宽松。

如前所述,差距是由于每个 AMP(Teradata 的逻辑处理单元拥有 MPP)都有自己的 ID 范围。所以有这些差距并没有错,但这是设计使然。

如果您完全依赖 ID(出于任何原因),则必须自己做。在您的 ETL 过程中加载之前或 after/during 加载并定义 "ID = ROW_NUMBER() + MAX(ID)"(伪代码)。