问题:
MOSS 2007, WSS_Content数据库800G, SharedServices数据库每月10G的速度增长,已经达到240G.
解决方法:
将查询网上的资料,发现是过期的进程记录导致的, 通过运行EXEC DeleteExpiredSessions即可删除, select查询了一下, 34万条记录, 用了4个小时; 使用EXEC 命令删除时, 通常1,2个小时后报错, 总提示
Msg 1204, Level 19, State 4, Procedure DeleteExpiredSessions, Line 7
The instance of the SQL Server Database Engine cannot obtain a LOCK resource at this time. Rerun your statement when there are fewer active users. Ask the database administrator to check the lock and memory configuration for this instance, or to check for long-running transactions.
查看了一下存储过程:
CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
DECLARE @now datetime
SET @now = GETUTCDATE()
DELETE [SharedServices1_DB].dbo.ASPStateTempSessions
WHERE Expires < @now
RETURN 0
决定不使用Delete命令, 而使用TRUNCATE TABLE命令, 因为这个命令更快速, 两个命令的差别请见最后部分.
操作步骤:
1. 备份SharedService数据库;
2. 执行TRUNCATE TABLE ASPStateTempSessions, 用时1秒钟;
3. Shunk数据库
数据库由240G降到2G了.
若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速、无日志记录的方法。TRUNCATE TABLE 与不含有 WHERE 子句的 DELETE 语句在功能上相同。但是,TRUNCATE TABLE 速度更快,并且使用更少的系统资源和事务日志资源。
与 DELETE 语句相比,TRUNCATE TABLE 具有以下优点:
· 所用的事务日志空间较少。
DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。
· 使用的锁通常较少。
当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页,而不是锁定各行。
· 如无例外,在表中不会留有任何页。
执行 DELETE 语句后,表仍会包含空页。例如,必须至少使用一个排他 (LCK_M_X) 表锁,才能释放堆中的空表。如果执行删除操作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。
与 DELETE 语句相同,使用 TRUNCATE TABLE 清空的表的定义与其索引和其他关联对象一起保留在数据库中。
参考文章: