现有 table 上的新 IDENTITY 列 - 顺序是什么?
New IDENTITY column on existing table - what will be the order?
我在 SQL Server 2012 中的现有 table 中添加了一个 IDENTITY
列。期望数字按聚集索引(非顺序 GUID)的顺序生成,但令我惊讶的是,它们是按照其中一个索引的顺序生成的,该索引甚至不是唯一的,而且巧合的是我想要的顺序!
谁能解释一下?以下是 table:
的详细信息
id - guid (non-sequential), clustered index, primary key
eventdate - bigint (unix date), not null, non-unique index
more columns, some indexed, all indexes non-unique
标识值按照 eventdate
的顺序分配。我什至发现了一些示例,其中几行具有相同的 eventdate
,并且它们始终具有连续的标识号。
MSDN says 未定义为现有 table 的新列生成标识值的顺序。
IDENTITY
Specifies that the new column is an identity column. The
SQL Server Database Engine provides a unique, incremental value for
the column. When you add identifier columns to existing tables, the
identity numbers are added to the existing rows of the table with the
seed and increment values. The order in which the rows are updated
is not guaranteed. Identity numbers are also generated for any new
rows that are added.
因此,您最好彻底检查一下您是否按需要的顺序获得了新的 IDENTITY
值。检查 table.
的所有行
编辑
"The order is not guaranteed" 并不意味着它是随机的,它只是意味着优化器可以自由选择任何方法来扫描 table。在您的系统中,它显然选择了 eventdate
上的索引(也许它的页面数量最少),但在另一个硬件或另一个版本的服务器上,选择可能会改变,您不应该依赖它。对 table 结构或索引的任何更改也可能会更改选择。优化器的决定很可能是确定性的(即不是随机的),但它没有在文档中披露并且可能取决于许多内部事物并且可能随时更改。
你的结果并不意外。标识值以某种未指定的顺序分配,与索引的顺序一致。
我在 SQL Server 2012 中的现有 table 中添加了一个 IDENTITY
列。期望数字按聚集索引(非顺序 GUID)的顺序生成,但令我惊讶的是,它们是按照其中一个索引的顺序生成的,该索引甚至不是唯一的,而且巧合的是我想要的顺序!
谁能解释一下?以下是 table:
的详细信息 id - guid (non-sequential), clustered index, primary key
eventdate - bigint (unix date), not null, non-unique index
more columns, some indexed, all indexes non-unique
标识值按照 eventdate
的顺序分配。我什至发现了一些示例,其中几行具有相同的 eventdate
,并且它们始终具有连续的标识号。
MSDN says 未定义为现有 table 的新列生成标识值的顺序。
IDENTITY
Specifies that the new column is an identity column. The SQL Server Database Engine provides a unique, incremental value for the column. When you add identifier columns to existing tables, the identity numbers are added to the existing rows of the table with the seed and increment values. The order in which the rows are updated is not guaranteed. Identity numbers are also generated for any new rows that are added.
因此,您最好彻底检查一下您是否按需要的顺序获得了新的 IDENTITY
值。检查 table.
编辑
"The order is not guaranteed" 并不意味着它是随机的,它只是意味着优化器可以自由选择任何方法来扫描 table。在您的系统中,它显然选择了 eventdate
上的索引(也许它的页面数量最少),但在另一个硬件或另一个版本的服务器上,选择可能会改变,您不应该依赖它。对 table 结构或索引的任何更改也可能会更改选择。优化器的决定很可能是确定性的(即不是随机的),但它没有在文档中披露并且可能取决于许多内部事物并且可能随时更改。
你的结果并不意外。标识值以某种未指定的顺序分配,与索引的顺序一致。