收缩mssql:层出不穷的新方法
在数据库管理中,优化查询速度和提高响应速度一直是一个重要的课题。在MSSQL数据库中,收缩是提高查询速度的一种方法。MSSQL数据库中的收缩操作可以删除已经被删除或者已经改变的数据库记录,从而释放空间。但是,在MSSQL数据库中进行收缩操作并不是一件简单的事情,需要谨慎操作。
1. 收缩数据库的常规方法
在MSSQL数据库中,收缩操作可以通过DBCC SHRINKDATABASE或者DBCC SHRINKFILE命令来完成,但是,这两个命令存在一定的问题。
DBCC SHRINKDATABASE命令可以将整个数据库收缩到所需的大小。但是,这个命令会造成数据库的碎片,从而使得查询速度变慢。另外,这个命令在收缩过程中,会锁定数据库,从而影响其它用户的使用。
DBCC SHRINKFILE命令可以将特定的文件收缩到所需的大小,但是,这个命令需要指定要收缩的文件名,需要用户手动操作,不能自动化。这个命令同样也会造成数据库的碎片,从而使得查询速度变慢。另外,这个命令收缩过程中也会锁定数据库,从而影响其它用户的使用。
2. 新的收缩方法——延迟收缩
针对MSSQL数据库中传统的收缩方法有一些不足之处,人们开始研究新的收缩方法。目前,一种名为“延迟收缩”(Deferred Shrink)的技术正在逐渐流行。
延迟收缩的原理是,在删除数据库记录时,并不立即收缩数据库,而是先将这些记录标记为删除状态,然后把这些记录的空间标记为可以重用的状态。这样做的好处是可以避免数据库碎片,提高查询速度;另外,这种方式并不会锁定数据库,不影响其它用户的使用。
延迟收缩的具体操作方法如下:
在MSSQL数据库中创建一个“删除状态的标记列”。
在MSSQL数据库中设置一个触发器,当一条记录被删除时,将这个标记列设置为“删除状态”。
在MSSQL数据库中设置一个定时任务,定期将数据库中所有“删除状态”的记录清除,并将数据库收缩到合适的大小。
CREATE TABLE demo (
id INT PRIMARY KEY,
name VARCHAR(20),
deleted BIT DEFAULT 0 -- 删除状态的标记列
)
GO
CREATE TRIGGER trigger_delete ON demo FOR DELETE
AS
BEGIN
UPDATE demo SET deleted = 1 WHERE id IN (SELECT id FROM DELETED)
END
GO
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'optimize for ad hoc workloads', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'max server memory (MB)', 16384
GO
RECONFIGURE
GO
EXEC sp_configure 'min server memory (MB)', 8192
GO
RECONFIGURE
GO
EXEC sp_configure 'Cost Threshold for Parallelism', 50
GO
-- 先关闭自动收缩
ALTER DATABASE [demo] SET AUTO_SHRINK OFF
GO
-- 然后定期手动收缩
-- 查看数据库情况
DBCC UPDATEUSAGE (demo)
GO
EXEC sp_spaceused 'demo'
GO
-- 手动收缩
DBCC SHRINKDATABASE (demo, 10)
GO
3. 使用延迟收缩的注意事项
虽然使用延迟收缩可以避免产生数据库碎片,并且不影响其它用户的使用,但是在使用延迟收缩时,也需要遵循一定的注意事项。
需要足够的空间:在使用延迟收缩时,数据库在删除记录时并不立即收缩,所以需要保证有足够的空间来存储这些已经被删除的记录。
需要良好的数据库管理策略:需要定期清除已经被删除的记录,并且将数据库收缩到合适的大小。
需要根据实际情况设置定时任务的时间间隔:如果时间间隔太长,已经被删除的记录可能会占用过多的空间,从而影响查询速度;如果时间间隔太短,则会导致数据库频繁的收缩,从而影响其它用户的使用。
4. 总结
对于MSSQL数据库来说,优化查询速度和提高响应速度是非常重要的。传统的收缩方法在一定程度上可以提高查询速度,但是存在一些问题。新的收缩方法——延迟收缩可以避免数据库碎片,提高查询速度,并且不影响其它用户的使用。但是,在使用延迟收缩时,也需要遵循一定的注意事项。