标识列增量值差距巨大
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?
你做错的是担心标识栏中的空白。这些是使用数据库的自然组成部分。最典型的原因是 delete
或 insert
失败。唯一的保证(我认为)是数字在增加而不是重复。
对于您的情况,我的猜测是 Teradata 出于某些充分的原因保留了一堆数字——为了并行性或其他一些效率(我知道 SQL 服务器会这样做)。间隙不会造成伤害,插入的顺序应该很好地保留。
维护无间隙标识列对数据库来说是一个巨大 的开销,尤其是像 Teradata 这样功能强大的并行数据库。本质上就是每次插入都要完成对[=22=的所有查询,锁定table,找到最大值,加一,然后使用。写数据库的人都知道这是什么性能杀手,对这样的列要求比较宽松。
如前所述,差距是由于每个 AMP(Teradata 的逻辑处理单元拥有 MPP)都有自己的 ID 范围。所以有这些差距并没有错,但这是设计使然。
如果您完全依赖 ID(出于任何原因),则必须自己做。在您的 ETL 过程中加载之前或 after/during 加载并定义 "ID = ROW_NUMBER() + MAX(ID)"(伪代码)。
我创建了一个带有标识列的 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?
你做错的是担心标识栏中的空白。这些是使用数据库的自然组成部分。最典型的原因是 delete
或 insert
失败。唯一的保证(我认为)是数字在增加而不是重复。
对于您的情况,我的猜测是 Teradata 出于某些充分的原因保留了一堆数字——为了并行性或其他一些效率(我知道 SQL 服务器会这样做)。间隙不会造成伤害,插入的顺序应该很好地保留。
维护无间隙标识列对数据库来说是一个巨大 的开销,尤其是像 Teradata 这样功能强大的并行数据库。本质上就是每次插入都要完成对[=22=的所有查询,锁定table,找到最大值,加一,然后使用。写数据库的人都知道这是什么性能杀手,对这样的列要求比较宽松。
如前所述,差距是由于每个 AMP(Teradata 的逻辑处理单元拥有 MPP)都有自己的 ID 范围。所以有这些差距并没有错,但这是设计使然。
如果您完全依赖 ID(出于任何原因),则必须自己做。在您的 ETL 过程中加载之前或 after/during 加载并定义 "ID = ROW_NUMBER() + MAX(ID)"(伪代码)。