标识列增量值中的巨大差距

时间:2018-07-19 15:09:57

标签: sql database teradata teradata-sql-assistant

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

Output Screenshot Here

这是我创建的表:

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;

我在做什么错?

2 个答案:

答案 0 :(得分:3)

这个评论太长了。

  

我在做什么错了?

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

在您的情况下,我的猜测是Teradata出于一些良好的原因而保留了一堆数字-出于并行性或其他效率的考虑(我知道SQL Server会这样做)。间隙不会造成任何伤害,插入的顺序应保留得很好。

维护无缝隙身份列对于数据库,尤其是功能强大的并行数据库(例如Teradata)而言,是一笔巨大的开销。从本质上讲,这意味着每个插入都必须完成对表的所有查询,锁定表,找到最大值,加一,然后使用该值。编写数据库的人知道这是什么性能杀手,并且对此类列的要求更宽松。

答案 1 :(得分:0)

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

如果您依靠ID保持无间隙(出于任何原因),则必须自己做。在您的ETL流程中加载之前或加载之后/之中,并定义“ ID = ROW_NUMBER()+ MAX(ID)”(伪代码)。