我们使用服务代理两个多月,突然发现系统的整体性能下降了。经过大量的挖掘和分析,我发现 page life expectancy
价格很低。然后在simplesqlserver的帮助下查看我的缓冲池,它填充了sys.sysdercv对象(5GB)。再找了一点,我发现 sys.conversation_endpoint
有1900万行10 gb的数据。我的错误是没有结束目标队列中的会话,但在结束双方(发起方和目标队列)中的会话后,它仍然保留在目标队列中 sys.conversation_endpoints
cd状态(关闭)。删除这些行的一种方法是调用 end conversation with cleanup
但这需要很多时间才能完成。我写这份工作,但我想它需要超过7天才能完成。我的工作是:
DECLARE @BatchSize Int
SELECT @BatchSize = 1000
declare @i int = @BatchSize;
declare @sum int = 0;
WHILE @i = @BatchSize BEGIN
print concat('while ', @sum);
select @i = 0;
declare @handle uniqueidentifier
declare conv cursor for select top (@BatchSize) conversation_handle from sys.conversation_endpoints
open conv
fetch NEXT FROM conv into @handle
while @@FETCH_STATUS = 0
Begin
select @i = @i + 1;
END Conversation @handle with cleanup
fetch NEXT FROM conv into @handle
End
close conv
deallocate conv
select @sum = @sum + @i;
END
所以,我的问题是:如何一次截断这个表及其数据。就像truncate命令一样 truncate table sys.conversation_endpoints
,此命令生成此错误:
Cannot find the object "conversation_endpoints" because it does not exist or you do not have permissions.
我想知道,有没有什么服务可以重新启动它,或者做什么事情来安全地删除大量的数据?
暂无答案!
目前还没有任何答案,快来回答吧!