sql - SQL Server 2012 中某些表的 DEFAULT 约束中的 GETDATE

标签 sql sql-server constraints getdate

正如您所料,我在 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/

相关文章:

SQL - 如何使用用户定义的函数来约束两个表之间的值

mysql - 对 MySQL 表应用外键和检查约束

mysql - 在 mysql 的 Select If 条件中使用更新查询

sql - 何时在 SQL Server 数据仓库中使用用户定义的函数

mysql - 我真的需要表中的索引吗?

java - TomEE 指向错误的数据源

sql - 根据SQL Server中的指定数字动态获取行号间隔

c# - 安装了SQL Server(标准版)如何通过代码获取服务器名称

sql-server - 为什么 SQL Server 意外停止发出范围锁

grails - 如何在 Grails 中对域类中的关系施加约束?