Sql server 2005 如何清理sys.conversation_终结点
我有一个表,表上的触发器使用ServiceBroker实现。每天有50多万条记录插入到表中 异步SP用于使用插入的数据检查一般情况,并更新其他表。它在过去1个月内运行良好,在插入记录的2-3秒内执行了SP。但现在需要90多分钟 目前sys.conversation_终结点的记录太多 (请注意,所有表格每天都被截断,因为我不需要这些记录) 其他数据库活动正常(CPU利用率平均为60%) 现在我要去哪里找Sql server 2005 如何清理sys.conversation_终结点,sql-server-2005,msmq,Sql Server 2005,Msmq,我有一个表,表上的触发器使用ServiceBroker实现。每天有50多万条记录插入到表中 异步SP用于使用插入的数据检查一般情况,并更新其他表。它在过去1个月内运行良好,在插入记录的2-3秒内执行了SP。但现在需要90多分钟 目前sys.conversation_终结点的记录太多 (请注意,所有表格每天都被截断,因为我不需要这些记录) 其他数据库活动正常(CPU利用率平均为60%) 现在我要去哪里找 我可以毫无问题地重新创建数据库,但我认为这不是解决问题的好方法您可以使用“结束会话@handl
我可以毫无问题地重新创建数据库,但我认为这不是解决问题的好方法您可以使用“结束会话@handle”或“结束会话@handle with cleanup”脚本来结束特定服务的所有会话:
DECLARE @sql NVARCHAR(MAX)
,@far_service NVARCHAR(256) = N'far_service_name';
WHILE EXISTS (
SELECT COUNT(*)
FROM sys.conversation_endpoints
WHERE far_service = @far_service
)
BEGIN
SET @sql = N'';
SELECT TOP 1000 @sql = @sql + N'END CONVERSATION ''' + CAST(conversation_handle AS NVARCHAR(50)) + N''' WITH CLEANUP;
'
FROM sys.conversation_endpoints
WHERE far_service = @far_service;
--PRINT @sql;
EXEC sys.sp_executesql @stmt = @sql;
--RETURN;
END;
GO
这是我的解决方案,在修改了@thesqldev的代码之后
USE [MY_DATABASE_NAME_HERE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[mqConversationsClearAll]
AS
-- Note: you can check the queue by running this query
-- SELECT * FROM sys.conversation_endpoints GO
DECLARE @getid CURSOR
,@sql NVARCHAR(MAX)
,@conv_id NVARCHAR(100)
,@conv_handle NVARCHAR(100)
,@conv_service NVARCHAR(100)
-- ,@far_service NVARCHAR(256) = N'One_Specific_Service_Target';
-- want to create and execute a chain of statements like this, one per conversation
-- END CONVERSATION 'FE851F37-218C-EA11-B698-4CCC6AD00AE9' WITH CLEANUP;
-- END CONVERSATION 'A4B4F603-208C-EA11-B698-4CCC6AD00AE9' WITH CLEANUP;
SET @getid = CURSOR FOR
SELECT [conversation_id], [conversation_handle], [far_service]
FROM sys.conversation_endpoints
WHERE NOT([State] = 'CO')
-- CO = CONVERSING [State]
-- alternatively, might like one service name only
-- WHERE far_service = @far_service
OPEN @getid
FETCH NEXT
FROM @getid INTO @conv_id, @conv_handle, @conv_service
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'END CONVERSATION ' + char(39) + @conv_handle + char(39) + ' WITH CLEANUP;'
EXEC sys.sp_executesql @stmt = @sql;
FETCH NEXT
FROM @getid INTO @conv_id, @conv_handle, @conv_service
END
CLOSE @getid
DEALLOCATE @getid
然后,只要您想清除sys.conversation_端点,就可以执行新创建的存储过程“mqConversationsClearAll”我们有超过1900万条记录。你如何处理这种情况?