【发布时间】:2010-07-31 23:00:23
【问题描述】:
我正在试验一个以高速将数据插入 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 mS)
但是,随着插入的生成速度介于 5 毫秒和 10 毫秒之间,我开始看到 SQL 端的“已插入”字段存在问题,其中一行因唯一键违规而定期被拒绝。只有当我将插入速率降低到超过 15 毫秒左右时,这个问题才会消失。这个速度有点像我在.Net DateTime.Now 中遇到的精度问题(我在某处的帖子上读到 16mS)所以我想知道 SQL Getdate() 函数的实际精度是多少。
那么有人可以告诉我支持 GetDate() 的是什么,它会与 .Net DateTime.Now 值绑定到相同的源吗?我应该期望它达到什么样的精度?
顺便说一句,我知道 SQL 2008 服务器中的 DATETIME2 类型,因此提出了一个问题,即该系统中 GetDate() 的精度是多少。
【问题讨论】:
-
为什么需要对插入的列进行唯一约束?身份列将显示它们被插入的顺序。我认为数据库生成时间很容易受到由于并发活动,它可以处理您的插入请求的频率的自然变化的影响,之前的插入是否导致页面拆分等无论如何,所以不能真正具有任何语义含义保证像那样限制它。
-
@martin .. 唯一性和顺序不是一回事。我正在尝试不能同时插入两行的想法——但是 getdate 的精度证明我错了。但是我并不是说我正在做的是世界上最聪明的事情!
标签: sql-server-2005 precision getdate