解决sqlserver数据库表空间不自动释放问题

在项目中遇到了sql server数据库经过频繁地删减数据后,查询变慢的问题。

我把数据导到另一个库中,发现查询就很快。

查了下原因,根本原因是删除数据并不释放表空间,日志文件太过巨大的原因。

网上查了查,解决方案如下:

第一步, 在收缩前先查看日志的大小:
SELECT *
FROM sysfiles
WHERE name LIKE '%LOG%'
GO
 
第二步, 把数据库的恢复模式设成”简单”:
ALTER DATABASE [数据库名] SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE [数据库名] SET RECOVERY SIMPLE
GO
 
第三步, 运行checkpoint指令, 把dirty page写进数据库:
CHECKPOINT
GO
  
第四步, 截断日志: 
BACKUP LOG 库名 WITH NO_LOG
GO
 
第五步, 记录一下日志名为下一步做准备:
 
SELECT Name
FROM sysfiles
WHERE name LIKE '%LOG'
GO
  
第六步, 收缩日志文件, 把不用的空间释放给操作系统:
DBCC SHRINKFILE (文件名, 所需大小)
GO
 
第七步, 验证一下日志大小是否达到所需大小了:
SELECT *
FROM sysfiles
WHERE name LIKE '%LOG%'
GO

第八步,将模式设置回去
ALTER DATABASE [数据库名] SET RECOVERY FULL WITH NO_WAIT 
GO
ALTER DATABASE [数据库名] SET RECOVERY FULL
GO


--查询指定数据库的日志文件名称 
USE [数据库名] 
GO 
SELECT name FROM SYS.database_files WHERE type_desc='LOG'



 后续步骤:
 1)查看你的主要数据库, 看看日志增长是否失控;
 2)查看上面的代码, 并进行必要修改和测试以适应你的数据库要求;
 3)定期收缩数据库 ----(注: 慎用!! 不建议用在production环境里.)
 4)继续监控数据库大小和服务器上的可用空间大小. 

  

释放表空间:

DBCC SHRINKDATABASE (库名,所需大小);

原文地址:https://www.cnblogs.com/King-JJ/p/7098051.html