Per*_*sen 5 sql-server identity getdate
我有一个表,其中包含IDENTITY列和GetDate()设置的DateTime列,如下所示:
CREATE TABLE [MyTable](
[Id] [int] IDENTITY(1,1) ,
[InsertTime] [datetime] DEFAULT (getdate()),
[OtherValues] [int]
)
Run Code Online (Sandbox Code Playgroud)
所有INSERT都使用IDENTITY和DateTime列的默认值执行,如下所示:
INSERT INTO [MyTable] ([OtherValues]) VALUES (1)
Run Code Online (Sandbox Code Playgroud)
始终作为任何显式交易之外的独立报表.
我希望Id会严格增加,而InsertTime也会增加但不严格.但是在负载很重的情况下,我们会看到以下几个实例:
| Id | InsertTime |
|------|-------------------------|
| 3740 | 2015-03-05 10:07:25.560 |
| 3741 | 2015-03-05 10:07:25.557 |
| 3742 | 2015-03-05 10:07:25.577 |
Run Code Online (Sandbox Code Playgroud)
我们在InsertTime中略有下降.
有谁知道这是怎么发生的,行的"正确"顺序是什么?
标识列和日期时间列都可能存在问题,可能会导致意外结果,但是,为了确定插入顺序,我建议使用标识值而不是日期时间值。
虽然理论上 DateTime 应始终随着时间的流逝而增加,但由于从系统检索当前时间的方式,可能会缺乏精度。对于所有的细节,这里有一个链接,解释了一些正在发生的事情。
对于标识列,通常期望它至少是升序的,即使不是连续的。但请注意,如果种子更改、增量更改、服务器重新启动等,标识列也可能会导致意外结果。Microsoft在此页面上提供了标识值的保证和不保证的列表。
另一件要记住的事情是,如果您使用事务,则该事务可以生成并获取身份,然后后续事务可以获取下一个标识值,并且理论上最终可能会在第一个事务之前提交其更改。