SQL Server中,用来收缩每个数据库文件的SQL脚本
下面这段SQL脚本,可以根据单个数据库中所有文件(数据文件、日志文件等)的大小,来收缩数据库文件:
DECLARE @databaseFiles TABLE ( freeSpace FLOAT, fileName NVARCHAR(300) ) INSERT INTO @databaseFiles(freeSpace,fileName) SELECT CAST(size AS FLOAT) / FILEPROPERTY(name, 'SpaceUsed') AS freeSpace,--sys.database_files的size列是数据库文件目前的大小(返回的是数据库文件的页数,每一页为8KB大小),其中包含分配了但没有使用的空间大小,FILEPROPERTY(name, 'SpaceUsed')是数据库文件实际使用的大小(返回的是数据库文件的页数,每一页为8KB大小),所以size一定是大于等于FILEPROPERTY(name, 'SpaceUsed')的,而这里计算出的freeSpace代表了数据库文件目前的大小是实际使用空间的多少倍 name FROM sys.database_files AS df WHERE df.type_desc = N'ROWS'--这里,如果要收缩数据库的数据文件(mdf,ndf)就是ROWS,如果要收缩数据库的日志文件(ldf)就是LOG WHILE (SELECT COUNT(1) FROM @databaseFiles)>0 BEGIN DECLARE @FreeSpace FLOAT ,@FileName NVARCHAR(300) ,@NewSize INT SELECT TOP 1 @FileName=fileName,@FreeSpace=freeSpace FROM @databaseFiles IF @FreeSpace > 2.5--如果数据库文件目前的大小超过了实际使用空间的2.5倍,就收缩该数据库文件 BEGIN SELECT @NewSize = CEILING(FILEPROPERTY(name, 'SpaceUsed') / 128 * 1.1)--将数据库文件收缩到实际使用空间的1.1倍 FROM sys.database_files AS df WHERE df.type_desc = N'ROWS'--这里,如果要收缩数据库的数据文件(mdf,ndf)就是ROWS,如果要收缩数据库的日志文件(ldf)就是LOG DBCC SHRINKFILE (@FileName, @NewSize) END DELETE FROM @databaseFiles WHERE fileName=@FileName END
注意,其中用到的一些SQL Server系统视图和函数,可以查看下面这几个微软官方文档:
sys.database_files (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
分类:
Sql Server
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2019-04-30 在英文Windows操作系统上使用SQL Server Management Studio(SSMS)导入Excel 97-2003文件时报错:Failure creating file