我创建了一个带有标识列的表。当我在该表中插入值时,“身份”列将显示两个值之间的巨大增量差距。标识值从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;
我在做什么错?
答案 0 :(得分:3)
这个评论太长了。
我在做什么错了?
您做错了什么,就是担心“身份”列中的空白。这些是使用数据库的自然部分。最典型的原因是由于delete
或失败的insert
。 (我认为)唯一的保证是数字正在增加,并且不会重复。
在您的情况下,我的猜测是Teradata出于一些良好的原因而保留了一堆数字-出于并行性或其他效率的考虑(我知道SQL Server会这样做)。间隙不会造成任何伤害,插入的顺序应保留得很好。
维护无缝隙身份列对于数据库,尤其是功能强大的并行数据库(例如Teradata)而言,是一笔巨大的开销。从本质上讲,这意味着每个插入都必须完成对表的所有查询,锁定表,找到最大值,加一,然后使用该值。编写数据库的人知道这是什么性能杀手,并且对此类列的要求更宽松。
答案 1 :(得分:0)
如果您依靠ID保持无间隙(出于任何原因),则必须自己做。在您的ETL流程中加载之前或加载之后/之中,并定义“ ID = ROW_NUMBER()+ MAX(ID)”(伪代码)。