【问题标题】:SQL Server Service Broker - Drop serviceSQL Server 服务代理 - 删除服务
【发布时间】:2017-10-03 06:02:59
【问题描述】:

我在数据库中使用了几个月的 Service Broker 队列基础架构。我意识到我的Initiator 队列已达到200 万条记录,即EndDialog 消息。所以感谢link,我重新设计了它。

我的问题是我无法删除那 200 万条记录。我使用了link 中所示的以下方法,并让查询继续执行。它执行了 20 个小时,直到我取消它。

declare @c uniqueidentifier
while(1=1)
begin
    select top 1 @c = conversation_handle from dbo.queuename
    if (@@ROWCOUNT = 0)
    break
    end conversation @c with cleanup
end

现在我正在尝试放弃服务和队列,但似乎又需要很多时间。

drop service initiatorService
drop queue initiatorQueue

还有其他方法可以立即删除吗?

队列数据;

【问题讨论】:

  • 请提供您的数据示例。它不一定是真实的,但是几行数据以及您要删除的条件会很棒。目前我可以理解为什么需要一些时间,因为代码在 while 循环中效率不高,并且正在逐个占用 SQL 资源,如果您查看事件监视器,您可能会发现您的工作是暂停
  • @CodeWarrior 我猜 drop 服务正在成功删除后面的消息代码。一小时后,我看到一半的消息已被删除。第一个使用end conversation 的代码块对我的情况没用,我想我应该使用waitfor receive..,我不确定。我添加了示例数据。
  • 您尝试过简单的delete from [table name] where message_type_name = 'http://schemas.microsoft.com/sql.servicebroker/enddialog',然后您想满足任何其他条件吗?
  • 很遗憾,delete 语句不适用于服务代理队列。

标签: sql-server service-broker


【解决方案1】:

据我所知,没有捷径可以实现你的目标,除非你愿意:

  • 删除并重新创建数据库,或者
  • 重置该数据库中所有队列中的所有 Service Broker 数据,包括对话框本身(在这种情况下,您可以尝试遵循 Remus 在链接问题中的建议 - ALTER DATABASE ... SET NEW_BROKER WITH ROLLBACK IMMEDIATE;

但是,关于您的代码,我建议使用receive 而不是select;否则您可能会多次看到相同的对话框。此外,如果EndDialog 消息出现在队列中,您可能希望将它们与任何其他消息区分开来。

【讨论】:

  • 你说得对,我知道如果没有receive 上面的代码,我无法融化队列中填满的消息,你的第二个选择就是我所做的。
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多