正如您所料,我在 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,第二次插入没有列 CREATE_DATETIME 的 B。他们之间有很多东西。
现在猜猜表 A 和 B 的 CREATE_DATETIME 列中是什么?
两次 - 可能在 1 000 000 条记录之后,从来没有过 - 表 A 中的日期时间大于表 B 中来自同一个 sp 执行(已验证)的记录的日期时间,例如:
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 毫秒)下两次,它可以给出两种不同的近似值?
最佳答案
如果您在表 A 中插入并提交第一个插入,然后在表 B 中插入并提交第二个插入,则很可能会得到这个结果,因为插入两条记录需要时间差。即使您不在单独的事务中提交插入。
当表增长时,插入将花费越来越多的时间,原因有很多。如果表在每次插入时都有索引,则索引必须记下记录的保存或组织位置。其次,sql server 内部页面的碎片化会使插入花费更多的时间。如果您想要更快的插入保持低填充因子,请检查您的索引结构。
如果您希望始终保持相同的时间,请创建一个变量以获取时间,然后使用此变量在两个表中进行插入。
希望能帮助到你。
关于sql - SQL Server 2012 中某些表的 DEFAULT 约束中的 GETDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19845370/