SQL Server 2012中某些表的默认GETDATE约束
正如您所预料的,在SQLServer2012中的一些表上,默认约束中的GETDATE有问题 我有如下两张表(A和B): 我有一个过程,在这个过程中,我要做两个插入——第一个插入到表A,第二个插入到B,没有列CREATE_DATETIME。他们之间有很多东西 现在猜猜表A和B中CREATE_DATETIME列中是什么 对于来自同一sp执行(已验证)的记录,表A中的datetime比表B中的datetime大两次(可能在1000000条记录之后,以前从未有过),如下所示: 你能给我一些线索吗 评论回复:SQL Server 2012中某些表的默认GETDATE约束,sql,sql-server,constraints,getdate,Sql,Sql Server,Constraints,Getdate,正如您所预料的,在SQLServer2012中的一些表上,默认约束中的GETDATE有问题 我有如下两张表(A和B): 我有一个过程,在这个过程中,我要做两个插入——第一个插入到表A,第二个插入到B,没有列CREATE_DATETIME。他们之间有很多东西 现在猜猜表A和B中CREATE_DATETIME列中是什么 对于来自同一sp执行(已验证)的记录,表A中的datetime比表B中的datetime大两次(可能在1000000条记录之后,以前从未有过),如下所示: 你能给我一些线索吗 评论回
1.没有触发器。
2.一次没有1000000条记录,它是表中第一次出现错误时的记录总数。此信息用于统计分析-今天的错误发生在上次错误之后的xx数千条记录之后-因此它是非常随机的。
3.是的,语句按此顺序100%执行。
4.无事务或单个-两个不同的进程-相同错误。
5.当然可以
重要!有人告诉我GETDATE的精度为3毫秒,因此可能GETDATE使用循环法对毫秒进行循环,以便在相同或几乎相同的时间内(差<3ms)进行两次循环,它可以给出两种不同的近似值?如果在表A中插入并提交第一次插入,然后在表B中插入并提交第二次插入,很有可能得到这个结果,因为需要时间差来插入两条记录。即使您没有在单独的事务中提交插入 当表增长时,由于许多原因,插入将花费越来越多的时间。如果表在每次插入时都有索引,则索引必须注意记录保存或组织的位置。其次,sql server内部页面中的碎片会使插入花费更多时间。如果想要更快的插入,请检查索引结构,并保持较低的填充因子 如果希望始终使用相同的时间,请创建一个变量获取时间,然后使用此变量在两个表中进行插入 希望有帮助。源于操作系统的时钟-如果有什么事情导致服务器上的时钟发生变化(提前),您将实现(明显的)时间旅行
是什么导致了这样的变化?最明显的是手动调整,或者如果服务器设置为自动将其时钟与外部源(例如域中的另一台机器或通过NTP)同步。可能还有其他原因。约束中的GETDATE到SYSDATETIME更改似乎可以解决问题。我想您可以在两个表上创建一个后插入触发器,使用一列中的时间更新另一个表中的datetime列。您一次插入的行数超过一百万行吗?您是否考虑过使用定义并填充一次的变量来覆盖默认值,而不是依赖默认值?您是否有作业的执行计划;您知道SQL在插入TableB之前实际执行插入TableA吗?:这似乎是给定代码的逻辑顺序,但是SQL是否以相同的方式编译代码?插入是在单个事务中还是在多个事务中?表A或表B是否具有数据类型datetime的日期列而不是datetime2,也就是说,您确定它们都是datetime2
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)
);
row in A: 2013-11-07 00:02:22.7000000
row in B: 2013-11-07 00:02:22.6970000