【问题标题】:How to measure accurate time offset from SQL Server?如何从 SQL Server 测量准确的时间偏移?
【发布时间】:2013-10-13 13:29:25
【问题描述】:

当我的应用程序启动时,我使用SELECT CURRENT_TIMESTAMP 从 SQL Server 检索日期/时间,并将差异与本地日期/时间进行比较 - 并记录此偏移量。每个记录日期/时间的动作都会根据这个时间差进行调整。因此,每当我保存任何日期/时间时,它将是服务器的日期/时间 - 每次我需要它时都不会多次实际查询服务器。

问题是,我们假设这台服务器在地球的另一端,并且连接有一点延迟。我也需要考虑这种滞后。不是从请求到响应的延迟,而是服务器接收请求到响应的延迟。

我如何测量从 SQL Server 获取其当前日期/时间到我的应用程序接收到它之间的延迟时间?

考虑到 SQL Server 是一个如此强大的数据库引擎,我认为有一些内置技巧可以适应这一点。

【问题讨论】:

  • 我很好奇需要这种精度的应用程序是什么。如果您需要知道服务器站点的准确时间,网络延迟问题可能是您最不关心的问题。
  • 将所有服务器同步到一个公共时间源并通过GETUTCDATE()存储所有日期不是更好
  • 这是一个已经很好开发的遗留应用程序,具有事务结构,目前跟踪时间的方法很差。一切都记录为服务器的日期/时间,但每次需要时都会查询服务器。我正在对其进行调整,以使其更准确和性能更好,同时保持我们的数据库结构完好无损(没有重大变化)。如果它处于早期开发阶段,我会使用 UTC。
  • 我询问了该应用程序,以便我们可以判断您的答案需要多精确,以及要花费多少合理的努力才能获得准确的答案。在每个站点设置 GPS 是否值得。在信号离开时查询服务器站点上的 GPS,并在信号到达时查询接收站点上的 GPS。这只是我脑海中的一个想法——我应该承认,除了知道这不是一个微不足道的问题之外,我对“数据通信理论”一无所知。

标签: sql-server delphi sql-server-2008-r2 ado datetimeoffset


【解决方案1】:

这实际上是数据通信理论中更普遍的问题,而不仅仅是 SQL Server 的问题。解决它的一种方法是在开始时进行 3 次或 5 次握手,并找到一个 ACK​​ 的中位时间。然后将其用作 Delta 用于所有未来的通信。

在 SQL Server 的情况下,您可以运行一个非常简单的查询,例如 SELECT 1,并检查获取结果所需的时间。这里的一个陷阱是避免使用任何低级机制,如 TCP(如果您也可以控制服务器端),因为执行查询将确保您计算的总增量包括 SQL Server 接收查询和解析的时间它等等。

【讨论】:

  • 所以你的意思是做 3 次左右并测量平均中途时间?
  • 是的,就是这个意思。
  • 这可行,但我认为这是一个肮脏的解决方案。 +1,但如果有人有更精确的解决方案,我会等待。
【解决方案2】:

没有办法确定。考虑到请求接收需要 3 秒。请求到达服务器可能需要 2 秒,而答案可能需要 1 秒。或者,请求到服务器需要 1 秒,服务器到接收需要 2 秒。

您可以假设两者大致相等,只需将总延迟除以 2。您可能想要制作多个样本并对其进行平均。

还要考虑延迟会随着时间的推移而变化。您现在发送的请求可能会有 1 秒的延迟,但从现在开始一小时后发送的请求可能需要一半或两倍的时间,具体取决于网络上的负载。

【讨论】:

  • 值得考虑的重要信息,但不一定能解决问题。
  • 可能没有解决办法
猜你喜欢
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多