【发布时间】: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 语句不适用于服务代理队列。