5

我正在试验一个以高速将数据插入 SQL 2005 Server 数据库(在 XP SP3 上)的程序。(这是为了收集时序数据,以便我可以评估我设计的不同方面)。

我的基本设置包括将数据插入到如下表中(并使用仅指定有效负载字段的 SP):

create table data
(
 Id int  PRIMARY KEY Identity,
 payload datatime not null,
 inserted datetime default (getdate()) not null
)

请注意,两个日期时间字段也都具有 UNIQUE 约束。

在客户端程序上,我在如此紧密的循环中调用 SP,以至于我遇到了 .Net DateTime.Now 值的精度问题(也可能是线程休眠),因此违反了有效负载的唯一约束。我通过一个秒表变量、一点 Thread.Sleep() 和手动构建“有效负载”数据的组合来解决,这样它就不会违反 SQL DateTime 字段的分辨率(3.3 毫秒)

但是,随着插入以 5mS 和 10mS 之间的速率生成,我开始看到 SQL 端的“已插入”字段存在问题,其中一行因唯一键违规而被定期拒绝。只有当我将插入速率降低到超过 15 毫秒左右时,这个问题才会消失。这个速度有点像我在.Net DateTime.Now 中遇到的精度问题(我在某处的帖子上读到了 16 毫秒),所以我想知道 SQL Getdate() 函数的实际精度是多少。

那么有人可以告诉我支持 GetDate() 的是什么,它会与 .Net DateTime.Now 值绑定到相同的源吗?我应该期待什么样的精度?

顺便说一句,我知道 SQL 2008 服务器中的 DATETIME2 类型,因此提出了一个问题,即该系统中 GetDate() 的精度是多少。

4

2 回答 2

2

DATETIME 的精度为 3.3 毫秒,但 GETDATE() 不会像您发现的那样返回精确到此的时间。查看日期/时间类型/函数的 MSDN 页面,了解有关新类型/函数如何工作的更多信息。

于 2010-07-31T23:13:34.287 回答
1

DATETIME存储为 2 个整数。一个代表日期部分,另一个代表时间部分(午夜后的滴答数),每个滴答声是 1/300 秒,因此它的理论精度至少为 3.3 毫秒。

我刚刚尝试在我的机器上运行它

declare @d  varchar(24)

while 1=1 
begin
set @d=CONVERT(VARCHAR(24), GETDATE(), 113)
raiserror('%s',0,1, @d) with nowait
end

并且运行了相当长的时间,它确实一次上升了一个刻度,所以我认为不会有任何固有的限制阻止它实现这一目标。

01 Aug 2010 00:56:53:913
...
01 Aug 2010 00:56:53:913
01 Aug 2010 00:56:53:917
...
01 Aug 2010 00:56:53:917
01 Aug 2010 00:56:53:920
...
01 Aug 2010 00:56:53:920
01 Aug 2010 00:56:53:923

关于您对 SQL Server 2008 中精度的查询,GetDate()这与 SQL2005 相同。sysdatetime意味着具有更高的精度。我刚刚尝试运行以下命令,并对两个结果之间的差异感到惊讶。

SET NOCOUNT ON

CREATE TABLE #DT2(
[D1] [datetime2](7) DEFAULT (getdate()),    
[D2] [datetime2](7) DEFAULT (sysdatetime())
) 
GO

INSERT INTO #DT2
          DEFAULT  VALUES
GO 100

SELECT DISTINCT [D1],[D2],DATEDIFF(MICROSECOND, [D1], [D2]) AS MS
 FROM #DT2

结果

D1                           D2                              MS
----------------------------    -----------------------      ------
2010-08-01 18:45:26.0570000   2010-08-01 18:45:26.0625000     5500
2010-08-01 18:45:26.0600000   2010-08-01 18:45:26.0625000     2500
2010-08-01 18:45:26.0630000   2010-08-01 18:45:26.0625000     -500
2010-08-01 18:45:26.0630000   2010-08-01 18:45:26.0781250     15125
2010-08-01 18:45:26.0670000   2010-08-01 18:45:26.0781250     11125
2010-08-01 18:45:26.0700000   2010-08-01 18:45:26.0781250     8125
于 2010-07-31T23:09:44.930 回答