我在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
,并且它们总是具有连续的标识号。
答案 0 :(得分:2)
MSDN says未定义为现有表的新列生成标识值的顺序。
<a href >
指定新列是标识列。该 SQL Server数据库引擎为其提供唯一的增量值 专栏。将标识符列添加到现有表时, 身份号码被添加到表格的现有行中 种子和增量值。 更新行的顺序 不保证。还会为任何新的身份编号生成身份编号 添加的行。
因此,您最好彻底检查是否按所需顺序获得了新的IDENTITY
值。检查表格的所有行。
修改强>
“订单无法保证”并不意味着它是随机的,它只是意味着优化器可以自由选择任何方法来扫描表。在你的系统中,它显然选择IDENTITY
上的索引(可能它的页面数量最少),但在另一个硬件或服务器的另一个版本上,选择可能会改变,你不应该依赖它。对表结构或索引的任何更改也可能会更改选择。最有可能优化器的决定是确定性的(即不是随机的),但它没有在文档中公开,可能依赖于许多内部事物,并且可能随时发生变化。
您的结果并不出人意料。身份值以某种未指定的顺序分配,与指数的顺序一致。