Azure SQL DW - 标识列值
Azure SQL DW - Identity column values
我正在将 primary/composite 键插入到具有 identity(1,1) bigint
列的中间数据库 table 中。在更传统的关系数据库中,对于 table 中的每个新键,此列递增 1,从而为值创建代理键。但是,在 Azure SQL DW 中,这些值是不连续的,如文档中所述:
The IDENTITY property doesn't guarantee the order in which the surrogate values are allocated, which reflects the behavior of SQL Server and Azure SQL Database. However, in Azure SQL Data Warehouse, the absence of a guarantee is more pronounced.
因此,我的 table 的 id
列只有 4 个唯一值将如下所示:
id, 1, 6, 8, 20
而不是
id, 1, 2, 3, 4
我知道我可以解决这个问题,方法是使用 row_number()
函数和 table 中代理 id
列的 max
自己创建代理键.但是,我担心这不是 Azure SQL DW 的意图,并且会影响数据库性能。
declare @current_val as bigint = (select coalesce(max(id), 0) from dbo.reseeding_table);
因此,由于 Azure 的实施方式,我担心 id identity
列的值会超过其限制。我应该相信 Azure SQL DW 的 identity
专栏的功能吗?
正如 Greg Galloway 所指出的,该问题与最近关于顺序值的主题非常相似。
因为你提出了几个具体的问题,我认为它有足够的不同需要自己的回答。
使用 row_number() 不会影响性能。我一直优先使用它而不是 IDENTITY。
您绝对可以信任身份函数。您可能已经注意到,数字随着配置中节点的数量而增加,这不是随机的。您将始终获得一个新号码。
需要注意的是,您不应该一次插入一行,如果您担心顺序 ID,您可能会这样做。您会发现单个插入非常慢,如果由多个进程执行,可能会导致并发问题。考虑对数据进行微批处理,并使用 Polybase 加载它以获得最佳性能。
我正在将 primary/composite 键插入到具有 identity(1,1) bigint
列的中间数据库 table 中。在更传统的关系数据库中,对于 table 中的每个新键,此列递增 1,从而为值创建代理键。但是,在 Azure SQL DW 中,这些值是不连续的,如文档中所述:
The IDENTITY property doesn't guarantee the order in which the surrogate values are allocated, which reflects the behavior of SQL Server and Azure SQL Database. However, in Azure SQL Data Warehouse, the absence of a guarantee is more pronounced.
因此,我的 table 的 id
列只有 4 个唯一值将如下所示:
id, 1, 6, 8, 20
而不是
id, 1, 2, 3, 4
我知道我可以解决这个问题,方法是使用 row_number()
函数和 table 中代理 id
列的 max
自己创建代理键.但是,我担心这不是 Azure SQL DW 的意图,并且会影响数据库性能。
declare @current_val as bigint = (select coalesce(max(id), 0) from dbo.reseeding_table);
因此,由于 Azure 的实施方式,我担心 id identity
列的值会超过其限制。我应该相信 Azure SQL DW 的 identity
专栏的功能吗?
正如 Greg Galloway 所指出的,该问题与最近关于顺序值的主题非常相似。
因为你提出了几个具体的问题,我认为它有足够的不同需要自己的回答。
使用 row_number() 不会影响性能。我一直优先使用它而不是 IDENTITY。
您绝对可以信任身份函数。您可能已经注意到,数字随着配置中节点的数量而增加,这不是随机的。您将始终获得一个新号码。
需要注意的是,您不应该一次插入一行,如果您担心顺序 ID,您可能会这样做。您会发现单个插入非常慢,如果由多个进程执行,可能会导致并发问题。考虑对数据进行微批处理,并使用 Polybase 加载它以获得最佳性能。