4

正如您所料,我在 SQL Server 2012 中的某些表上遇到了 DEFAULT 约束中的 GETDATE 问题。

我有两个如下表(A 和 B):

CREATE TABLE [dbo].[TABLE_A_OR_B] (
[TABLE_A_OR_B_PK]   BIGINT          IDENTITY (1, 1) NOT NULL,
[CREATE_DATETIME]   DATETIME2 (7)   CONSTRAINT [DF_TABLE_A_OR_B_CREATE_DATETIME] DEFAULT (getdate()) NOT NULL,
[CREATE_USER]       VARCHAR (100)   CONSTRAINT [DF_TABLE_A_OR_B_CREATE_USER] DEFAULT (suser_sname()) NOT NULL,
...
CONSTRAINT [PK_TABLE_A_OR_B] PRIMARY KEY CLUSTERED ([TABLE_A_OR_B_PK] ASC)
);

而且我有一个程序,我正在执行两个插入 - 第一个到表 A,第二个到 B,没有列 CREATE_DATETIME。他们之间有很多东西。

现在猜猜表 A 和 B 中的 CREATE_DATETIME 列是什么?

两次 - 可能在 1 000 000 条记录之后,从未有过 - 对于来自同一 sp 执行(已验证)的记录,表 A 中的日期时间大于表 B 中的日期时间,例如:

row in A: 2013-11-07 00:02:22.7000000 
row in B: 2013-11-07 00:02:22.6970000

你能给我一些线索吗?

评论答案:
1. 没有触发器。
2.一次没有1 000 000条记录,它是第一次出现错误时表中记录的总数。此信息用于统计分析 - 今天错误发生在上次错误后 xx 数千条记录之后 - 所以它非常随机。
3. 是的,语句100%按此顺序执行。
4.没有事务或单-两个不同的进程-相同的错误。
5. 确定 DATETIME2。

重要的!有人告诉我,GETDATE 的精度为 3 毫秒,所以可能 GETDATE 使用循环法循环毫秒,所以两次相同或几乎相同的时间(差异 < 3 毫秒)它可以给出两个不同的近似值?

4

3 回答 3

1

如果您在表 A 中插入并提交第一个插入,然后在表 B 中插入并提交第二个插入,则很有可能得到此结果,因为插入两条记录需要时间差。即使您没有在单独的事务中提交插入。

当表增长时,由于许多原因,插入将花费越来越多的时间。如果表在每次插入中都有索引,则索引必须注意记录的保存或组织位置。其次,sql server 内部页面中的碎片会使插入花费更多时间。如果您想要更快的插入保持低填充因子,请检查您的索引结构。

如果您总是想要相同的时间,请创建一个变量来获取时间,然后使用此变量在两个表中进行插入。

希望能帮助到你。

于 2013-11-08T02:45:29.373 回答
1

GETDATE()源自操作系统的时钟 - 如果某些原因导致服务器上的时钟更改(到更早的时间),您将实现(明显的)时间旅行。

什么可能导致这样的变化?显而易见的是手动调整,或者如果服务器设置为自动将其时钟与外部源同步 - 例如您域上的另一台机器或通过 NTP。也可能有其他可能的原因。

于 2013-11-08T13:44:21.003 回答
0

GETDATE 到 SYSDATETIME 约束的变化似乎可以解决问题。

于 2013-11-12T11:46:57.607 回答