现有表上的新IDENTITY列 - 订单是什么?

时间:2016-03-11 23:34:38

标签: sql sql-server sql-server-2012 identity clustered-index

我在SQL Server 2012中的现有表中添加了IDENTITY列。预计将按聚簇索引(非顺序GUID)的顺序生成数字,但令我惊讶的是,它们是按顺序生成的其中一个索引甚至不是唯一的,也恰好是我想要的顺序!

任何人都能解释一下吗?以下是该表的详细信息:

   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,并且它们总是具有连续的标识号。

1 个答案:

答案 0 :(得分:2)

MSDN says未定义为现有表的新列生成标识值的顺序。

  

<a href >

     

指定新列是标识列。该   SQL Server数据库引擎为其提供唯一的增量值   专栏。将标识符列添加到现有表时,   身份号码被添加到表格的现有行中   种子和增量值。 更新行的顺序   不保证。还会为任何新的身份编号生成身份编号   添加的行。

因此,您最好彻底检查是否按所需顺序获得了新的IDENTITY值。检查表格的所有行。

修改

“订单无法保证”并不意味着它是随机的,它只是意味着优化器可以自由选择任何方法来扫描表。在你的系统中,它显然选择IDENTITY上的索引(可能它的页面数量最少),但在另一个硬件或服务器的另一个版本上,选择可能会改变,你不应该依赖它。对表结构或索引的任何更改也可能会更改选择。最有可能优化器的决定是确定性的(即不是随机的),但它没有在文档中公开,可能依赖于许多内部事物,并且可能随时发生变化。

您的结果并不出人意料。身份值以某种未指定的顺序分配,与指数的顺序一致。