在ms sql数据库中实现定期写入时间戳

时间:2010-06-29 08:35:56

标签: sql-server stored-procedures sql-agent

任务:

每秒将时间戳写入MS SQL数据库表。

解决方案:

  1. 按计划写入时间戳的外部应用程序(例如,Sql代理)。
  2. 存储过程,将时间戳写入无限循环。
  3. 问题。

    1. 哪种解决方案最好?
    2. 在存储过程中运行无限循环有什么缺点吗?
    3. 如何在服务器重启后启动存储过程?
    4. 还有其他解决方案吗?

3 个答案:

答案 0 :(得分:3)

  1. 要么,我倾向于使用WAITFOR DELAY
  2. 存储过程路由
  3. 不是真的
  4. sp_procoption and start up stored procedures
  5. 不涉及外部客户端或系统,我想不出任何

答案 1 :(得分:2)

1,两者都有优点和缺点。根据您的环境进行评估和选择

程序优点:
  - 每秒一次没有SQL代理处理的开销。 (事实上​​,我认为你不能让SQL Agent每秒一次性地发起相同的工作。)
  - 我不认为WAITFOR模式中的过程正在使用资源 - 但您需要检查

程序Disads:
  - 如果程序失败(以某种方式停止),它将无法启动。 (除非您运行SQL代理作业以检查过程是否已停止,在这种情况下也可以使用该过程)   - 可能比你想象的更容易停止/中断(并发/死锁,分离的DB,在维护期间手动停止然后忘记重新启动)

工作优势:
  - 如果作业失败(可能db不可用),下一个作业仍将启动

职位空缺:
  - 看起来非常糟糕,每秒都有SQL代理运行。如果这样做,请测量所需的服务器开销   - 如果SQL代理失败或停止,则作业将不会运行

建议:必须每秒一次吗?可以是每5,10,15或30个一次吗?

2,不应该是任何,除非上面提到的。确保您无法遇到锁定,阻塞或死锁情况!

3,就像@gbn所说,sp_procoption

4,没有任何内容不涉及基于悲观锁定技术的繁琐技巧,或基于时间戳(非日期时间)数据类型的拜占庭逻辑。最好的解决方案似乎是将这两个数据库合二为一的长期解决方案,但这不是一个短期选择。

出于纯粹的偏执,我将两者结合起来:

  • 作业设置为每2,3或5分钟运行
  • 更新时间段的作业调用程序,然后等待几秒钟
  • 程序不会停止,因此作业继续运行;当作业正在运行时,它将无法启动(因为它仍在执行)
  • 如果程序以某种方式死亡,作业将在下次计划运行时再次启动。

答案 2 :(得分:1)

尝试使用SQL Service代理异步执行此操作,并且即使必须重新启动SQL Server服务,其队列系统也允许您不会遗漏任何数据。我曾经在这种情况下使用过这种轮询方案。

http://msdn.microsoft.com/en-us/library/ms345108(SQL.90).aspx#sqlsvcbr_topic2

这可能会有所帮助, http://msdn.microsoft.com/en-us/library/bb839488.aspx