码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server中,用来收缩每个数据库文件的SQL脚本

时间:2020-04-30 12:00:55      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:ros   rop   收缩   man   desc   style   into   t-sql   esc   

下面这段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 = NROWS--这里,如果要收缩数据库的数据文件(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 = NROWS--这里,如果要收缩数据库的数据文件(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   

原文地址:https://www.cnblogs.com/OpenCoder/p/12807510.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!