Pet*_*r M 5 precision sql-server-2005 getdate
我正在试验一个程序,该程序可以高速将数据插入 SQL 2005 Server 数据库(在 XP SP3 上)。(这是为了收集时序数据,以便我可以评估设计的不同方面)。
我的基本设置包括将数据插入到如下表中(并使用仅指定有效负载字段的 SP):
create table data
(
Id int PRIMARY KEY Identity,
payload datatime not null,
inserted datetime default (getdate()) not null
)
Run Code Online (Sandbox Code Playgroud)
请注意,这两个日期时间字段也有 UNIQUE 约束。
在客户端程序上,我在如此紧密的循环中调用 SP,以至于我遇到了 .Net DateTime.Now 值的精度问题(也可能是线程休眠),因此违反了有效负载的唯一约束。我通过结合秒表变量、一些 Thread.Sleep() 和手动构建“有效负载”数据来解决这个问题,这样它就不会违反 SQL DateTime 字段的分辨率(3.3 mS)
然而,随着插入的生成速度在 5 毫秒到 10 毫秒之间,我开始看到 SQL 端“插入”字段的问题,其中一行会因唯一键违规而定期被拒绝。只有当我将插入速率降低到 15 毫秒左右时,这个问题才会消失。这个速率可疑地类似于我在 .Net DateTime.Now 中遇到的精度问题(我在某处的帖子上读到 16mS),所以我想知道 SQL Getdate() 函数的实际精度是多少。
那么有人可以告诉我什么支持 GetDate(),它是否与 .Net DateTime.Now 值绑定到相同的源?我应该期望它达到什么样的精度?
顺便说一句,我了解 SQL 2008 服务器中的 DATETIME2 类型,因此这就提出了一个问题:该系统中 GetDate() 的精度是多少。
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
Run Code Online (Sandbox Code Playgroud)
在相当长的一段时间内,它确实一次上涨一个基点,所以我认为不会有任何固有的限制阻止它实现这一目标。
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
Run Code Online (Sandbox Code Playgroud)
关于 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
Run Code Online (Sandbox Code Playgroud)
结果
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2919 次 |
最近记录: |