2010-05-19 41 views
1

我目前正在修改我公司的管理系统,以便在网络流量方面运行更精简。现在我试图找出一种有效的方法来查询自上次我询问以来(已被任何用户修改)的记录。如何从SQL Server数据库获取已修改记录的列表?

应用程序启动时加载的作业信息,并在本地缓存它像下面这样:SELECT * FROM jobs

我写出来的日期/时间的记录被修改鼻翼UPDATE jobs SET [email protected], LastModified=GetDate() WHERE [email protected]

当任何用户请求作业列表时,我查询自上次请求列表后的所有记录,如下所示:SELECT * FROM jobs WHERE LastModified>[email protected]并存储请求的日期/时间作为@LastRequest传入用户再次询问。从理论上讲,这将仅返回自上次请求后修改的记录。

我遇到的问题是,当一个查询没有索引的日期/时间列在用户的日期/时间是不是很符合服务器的日期/时间同步,也服务器的负载。有没有更有效的系统,然后查询日期/时间信息?

回答

2

我不知道我会依赖日期时间,因为它是SQL Server的外部。

如果你有一个标识列,我会用该列在表中UserId, LastQueryDateTime, LastIdRetrieved

您查询的基表时,都会(如果存在的或更新)插入用户新行的最大ID这个表。此外,查询应读取此表中的行以获取LastIdRetrieved并在where子句中使用该行。如果所有的代码选择从SQL Server而不是从客户机插入GETDATE()

所有这一切都可能被淘汰,但这个任务是非常耗费人力。

+1

+1服务器端日期时间 - 确定它的工作,但它也是很重要的许多其他原因。 – 2010-05-19 15:58:51

0

最简单的解决方案似乎一次成为领先的解决方案。

解决服务器时间的一个办法就是解决问题。更新该行后,在客户端存储由select LastModified where JobID = @JobID返回的值。这样,客户端可以仅使用服务器时间作为参考进行有效查询。

0

使用更新序列号(USN)很像Active Directory和DNS的使用跟踪,因为他们的上一次复制已更改的对象。选择一个数字开始,每次插入或修改作业表中的记录时,写入最近的USN。在执行最后一个Select查询时跟踪USN,然后您始终知道自上次查询以来更改了哪些记录。例如...

Set LastQryUSN = 100 

Update Jobs Set USN=101, ... 

Update Jobs Set USN=102, ... 

Insert Jobs (USN, ...) Values (103, ...) 

Select * From Jobs Where USN > LastQryUSN 

Set LastQryUSN = 103 

Update Jobs Set USN=104 

Insert Jobs (USN, ...) Values (105, ...) 

Select * From Jobs Where USN > LastQryUSN 

Set LastQryUSN = 105 

...等等

0

当你的职位,得到服务器时间太长:

DECLARE @now DATETIME = GETUTCDATE(); 

SELECT @now AS [ServerTime], * FROM Jobs WHERE Modified >= @LastModified; 

你第一次在一个最小日期为通@上一次更改。在随后的每次通话中,您都会传入ServerTime返回的最后一次通话。通过这种方式,客户时间不在等式中。

答案到服务器的负载,我希望,很明显的:添加改性列的索引。

还有一点值得注意:从不使用本地时间,甚至不使用服务器。始终使用UTC时间,并在修改中存储UTC时间。就像现在一样,当夏令时改变被设置或被移除时,你的程序每年完全拧两次。

+0

不错的尝试,但服务器时间不保证向前移动 - 它可以“周旋”,这可能导致这些查询中的数据丢失。服务器将他们的时间定期同步到活动目录,但这不会导致向前/向后的小跳跃。 – TomTom 2010-05-19 17:23:49

0

当前SQL Server具有更改跟踪功能,您可以正好使用它。只需在要跟踪的表上启用更改跟踪。

相关问题