1

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

在此处输出屏幕截图

这是我创建的表:

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表中插入值的方式:

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

我究竟做错了什么?

4

2 回答 2

4

我究竟做错了什么?

您做错了什么是担心身份列中的空白。这些是使用数据库的自然部分。最典型的原因是由于delete或失败insert。唯一的保证(我认为)是数字在增加而不是重复。

在您的情况下,我的猜测是 Teradata 出于一些充分的理由保留了一堆数字——为了并行性或其他一些效率(我知道 SQL Server 会这样做)。间隙不会造成任何伤害,并且插入的顺序应该得到很好的保留。

维护无缝标识列对于数据库来说是一个巨大的开销,尤其是像 Teradata 这样强大的并行数据库。本质上,这意味着每次插入都必须完成对表的所有查询,锁定表,找到最大值,加一个,然后使用它。编写数据库的人知道这是什么性能杀手,并且对此类列有更宽松的要求。

于 2018-07-19T15:15:14.227 回答
2

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

如果你依赖没有间隙的 ID(出于任何原因),你必须自己做。在加载 ETL 过程之前或加载之后/期间并定义“ID = ROW_NUMBER() + MAX(ID)”(伪代码)。

于 2018-07-19T21:31:42.263 回答