【问题标题】:Huge gap in increment value of identity column标识列增量值差距巨大
【发布时间】:2018-12-27 19:10:09
【问题描述】:

我创建了一个带有标识列的表。当我在该表中插入值时,标识列显示值之间存在巨大的增量差距。标识值从 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;

我做错了什么?

【问题讨论】:

  • 可能有一个进程定期刷新该部门表中的数据。但是不是使用 MERGE 或 UPDATE existing & INSERT new,而是通过 DELETE 和 INSERT 来简单吗?如果您有该部门表的外键,那么这将不是一个好方法。但它会解释这些差距。身份随着每次插入而增加。它不会在删除时自动减少。
  • 我想知道在不设置 MAXVALUE 的情况下使用 CYCLE 时 MAXVALUE 会是多少。
  • @LukStorms:MaxValue 将基于数据类型的最大值,如果是 INT 2.147.483.647(与 MinValue 类似)
  • @dnoeth 感谢该信息。呵呵,看来那些被删除的DepartmentId要被回收了还需要一段时间。

标签: sql database teradata teradata-sql-assistant


【解决方案1】:

我做错了什么?

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

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

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

【讨论】:

  • 非常非常真实。对于 Teradata,每个放大器基本上都有一个标识值的范围。简单地说,放大器 1 可能会得到 1-1000,放大器 2 可能会得到 1001-2000,放大器 3 可能会得到 2001-3000。 (我认为它实际上是每安培 100k,但我懒得输入所有这些 0。)还有比这更多的东西,但希望你能明白。
  • @Andrew 您的评论实际上是最好的答案。真正的原因是 teradata 不是按顺序处理记录,而是并行处理。所以没有理由期望它们按顺序编号
  • 如果我只想将结果存储在一个放大器中怎么办?假设我的结果集很小。
  • Teradata 不是这样工作的。互联网上有大量关于此的信息。了解这一点对于成功绝对至关重要。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多