• 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)

    FILEPROPERTY (Transact-SQL)

    CEILING (Transact-SQL)

    DBCC SHRINKFILE (Transact-SQL)

  • 相关阅读:
    Python解析excel文件并存入sqlite数据库
    python简单爬虫
    Python开发简单记事本
    Django初体验——搭建简易blog
    LeetCode — (1)
    机器学习(九)—FP-growth算法
    机器学习(八)—Apriori算法
    linux下debug工具
    linux同步与通信
    后台开发之IO缓冲区管理
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/12807510.html
Copyright © 2020-2023  润新知