SQL Server中,用来收缩每个数据库文件的SQL脚本
时间:2021-07-01 10:21:17
帮助过:21人阅读
@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)
FILEPROPERTY (Transact-SQL)
CEILING (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
SQL Server中,用来收缩每个数据库文件的SQL脚本
标签:ros rop 收缩 man desc style into t-sql esc