`

SQLServer数据库文件碎片整理

 
阅读更多

  SQLServer数据库在使用时间久之后,往往数据文件及日志文件会变得很大,有时候甚至高达十几G,这个时候一般做法是裁断日志以缩小日志文件、归档历史记录到新数据库或备份文件以便释放空间,然后执行收缩数据库命令来缩小数据文件大小,然而收缩命令经常并不会有太大的作用,因为收缩是以区为单位进行的,并不会对页进行整理。如果数据库上有很多碎片,如一个可容纳8个页的区实际上只存放1个页,就会造成大量磁盘空间浪费并且无法收缩。
  SQLServer磁盘碎片整理的目的在于,通过重建聚集索引或重建堆自增列的方式,以页为单位进行磁盘空间整理,然后再使用收缩命令收缩数据库文件,真正意义上实现了数据库的完全收缩。
  以下存储过程在MSSQL2008上测试通过,由于需要读写操作和表锁定,请避免在数据库繁忙时段运行。

 

/* 读取磁盘分区信息 */
CREATE PROCEDURE SP_ExtentInfo
AS
        DBCC ExtentInfo(0)
GO

/* SQLServer磁盘碎片整理 */
CREATE PROCEDURE SP_ShrinkSpaces
(
        @UsagePercent numeric(2,2) = 0.60
        --整理小于指定使用率的表空间,1为100%使用率无需整理
)
AS
BEGIN
        --创建保存分区信息的临时表
        Create Table #ExtentInfo
        (
                fileid smallint,
                pageid int,
                pg_alloc int,
                ext_size int,
                obj_id int,
                index_id int,
                partition_number int,
                partition_id bigint,
                iam_chain_type varchar(50),
                pfs_bytes varbinary(10)
        )
        insert into #ExtentInfo exec SP_ExtentInfo
        
        --使用游标,对小于指定空间使用率的表进行整理
        declare @Table sysname
        declare @Index sysname
        declare @IdentityName sysname
        declare @sql varchar(1000)
        declare cs cursor for
                select (select name from sysobjects where id=obj_id and xtype='u'),    --xtype='u'的记录为数据表
                        (select name from sysindexes where id=obj_id and indid=1)    --indid=1的记录为聚集索引
                from #ExtentInfo group by obj_id
                having sum(pg_alloc)*1.0/max(ext_size)/count(*)<=@UsagePercent
        open cs
        fetch next from cs into @Table,@Index
        while @@FETCH_STATUS=0
        begin
                if @Table is not null
                begin
                        if @Index is not null
                        begin
                                --重建聚集索引
                                set @sql = 'alter index ' + @Index + ' on ' + @Table + ' rebuild'
                                print @sql
                                exec(@sql)                        
                        end
                        else
                        begin
                                --对于堆,清空并重新写表或给自增列加聚集索引(128代表自增列)
                                select @IdentityName=name from syscolumns where id=OBJECT_ID(@Table) and status=128
                                if @@ROWCOUNT=0
                                        set @sql = 'select * into #ExtentTable from ' + @Table + ' truncate table ' + @Table + ' insert ' + @Table + ' select * from #ExtentTable'
                                else
                                        set @sql = 'create clustered index ExtentOperaPrimaryKey on ' + @Table + '(' + @IdentityName + ') drop index ' + @Table + '.ExtentOperaPrimaryKey'
                                print @sql
                                exec(@sql)
                        end
                end
                fetch next from cs into @Table,@Index
        end
        close cs
        deallocate cs
        
        --收缩当前数据库
        DBCC SHRINKDATABASE(0)
                
        --重新获取分区信息
        truncate table #ExtentInfo
        insert into #ExtentInfo exec SP_ExtentInfo
        
        --显示当前分区信息
        select fileid,obj_id,index_id,partition_id,ext_size,
                object_name(obj_id) as '对象名',
                count(*) as '实际区数', sum(pg_alloc) as '实际页数',
                ceiling(sum(pg_alloc)*1.00/ext_size)*ext_size as '最大可用页数',
                ceiling(sum(pg_alloc)*1.00/ext_size*100.00/count(*)) as '表空间使用比率'
        from ExtentInfo
        group by fileid,obj_id,index_id,partition_id,ext_size
        order by partition_id,obj_id,index_id,fileid
        
        --删除临时表
        drop table #ExtentInfo
END
GO

 

分享到:
评论

相关推荐

    50种方法巧妙优化你的SQL Server数据库

    《50种方法巧妙优化你的SQL Server数据库》 SQL Server数据库优化是提升系统性能的关键环节。以下是一些针对SQL Server数据库优化的有效策略: 1. **建立和优化索引**:索引是加速查询的关键,特别是在大数据量的...

    Sql Server 数据库收缩工具

    在SQL Server环境中,数据库文件的大小管理是一项关键任务,尤其是对于那些存储空间有限或者数据库文件过大影响性能的情况。"Sql Server 数据库收缩工具"就是专为解决这一问题而设计的实用程序,它可以帮助用户有效...

    造成mdf文件过大的原因

    1. 整理索引碎片:可以使用重组或重建索引的方法来整理索引碎片。重组索引可以使用以下命令: ``` ALTER INDEX ALL ON TableName REORGANIZE ``` 重建索引可以使用以下命令: ``` ALTER INDEX ALL ON TableName ...

    自动部署和备份SQL Server数据库的实现.pdf

    本文件《自动部署和备份SQL Server数据库的实现》将深入探讨如何通过有效的策略和技术来实现这一目标。 首先,自动部署SQL Server数据库涉及到一系列步骤,包括安装服务器、配置环境、创建数据库以及设置安全策略。...

    SQL Server数据库优化方案

    11. **维护索引**:定期重建和碎片整理索引,收缩数据和日志文件以节省空间。 12. **SQL语句优化**:理解DBMS处理查询计划的过程,编写高效且优化的T-SQL代码。 在实际操作中,还需要关注SQL Server的配置选项,如...

    数据库设计对SQL Server数据库性能优化分析.pdf

    SQL Server数据库由主数据文件、事务日志文件和辅助数据文件组成。主数据文件存储数据库的启动信息,是数据库运行的关键;事务日志文件记录所有事务,用于数据恢复,至少需要一个;辅助数据文件则作为主数据文件的...

    50种方法巧妙优化你的SQLServer数据库.doc

    标题中的“50种方法巧妙优化你的SQLServer数据库”指的是针对SQL Server数据库进行性能提升的各种策略和技巧。这些方法旨在改善数据库的响应时间、吞吐量以及资源利用率,以满足日益增长的业务需求。 描述中提到的...

    SQLserver数据库优化.pdf

    12. **索引维护**:定期重建和碎片整理索引,以及收缩数据库和日志文件,有助于保持数据库的健康状态。 13. **T-SQL编写技巧**:理解SQL Server处理查询计划的过程,包括词法、语法检查,查询优化器的工作,以及预...

    SQLserver数据库优化[归类].pdf

    - 定期重建和碎片整理索引,以及收缩数据库和日志文件,以保持良好的数据库健康状态。 4. **T-SQL编写注意事项**: - SQL Server处理查询计划的步骤包括词法、语法检查,优化器优化,预编译生成查询计划,执行和...

    SQL Server 2000完结篇系列之五:使用DBCC命令来进行数据库的维护及性能调节

    在SQL Server 2000中,DBCC(Database Console Commands)是一组强大的系统命令,用于执行各种数据库维护任务和性能调整。这个“SQL Server 2000完结篇系列之五”着重讨论如何利用DBCC命令来确保数据库的健康运行,...

    2009 年度十大 SQL Server 技巧文章

     碎片整理后重建索引  恢复完整备份  删减事务日志  人工通读错误日志 利用动态管理视图提高SQL Server索引效率 就如同数据库DBA了解的一样,合适的索引能够提高查询性能和应用程序可测量性。但是每个附加...

    SQL_Server2005索引碎片分析和解决方法

    - **业务需求**:如果表需要持续对外服务,则可以选择 `DBCC INDEXDEFRAG` 在线进行碎片整理。 - **系统资源**:对于拥有大量空闲磁盘空间和高并发能力的系统,更适合采用 `DBCC DBREINDEX`。 #### 五、总结 综上所...

    SQL Server 2008数据库管理.pptx

    数据库的正常运行离不开定期的维护,SQL Server 2008提供了备份、还原、重建索引、碎片整理等维护任务,以确保数据的完整性和性能。 **数据库的安全性** SQL Server 2008提供了一套全面的安全机制,包括用户权限...

    第13章 自动化SQL Server 2008数据库.zip

    通过SQL Server Agent,我们可以创建作业(Jobs),这些作业可以按照预设的时间表运行,执行如数据备份、索引碎片整理、数据库维护等任务。设置作业时,可以定义作业步骤、调度、通知选项以及作业失败时的错误处理...

    SQL Server 2000数据库优化方案参考

    9. **索引维护**:定期重建和碎片整理索引,如使用DBCC REINDEX和DBCC INDEXDEFRAG,以及收缩数据库和日志文件以释放空间,DBCC SHRINKDB和DBCC SHRINKFILE用于此目的。 10. **T-SQL优化**:正确编写T-SQL语句至关...

    sql server性能优化总结

    - **数据库碎片管理**:定期进行索引和表的碎片整理,以保持数据存储的连续性。 9. **并发控制**: - **事务隔离级别**:选择合适的事务隔离级别,如READ COMMITTED SNAPSHOT可以减少锁竞争。 - **死锁检测与...

    SQL Server DBA best practice

    - 定期备份数据并执行维护任务(如索引重组和碎片整理)对于保持数据库的健康状态非常重要。 #### 总结 本文档提供的最佳实践涵盖了SQL Server DBA在性能调优、高可用性和日常管理等方面的关键点。遵循这些指导...

    Sql Server实用操作小技巧

    1. **重建索引**:使用`DBCC REINDEX`命令或`DBCC INDEXDEFRAG`命令可以对数据库中的索引进行重组或碎片整理,从而提高查询效率并减少索引占用的空间。 2. **数据和日志文件的收缩**:利用`DBCC SHRINKDB`和`DBCC ...

    sql2000数据库教程

    SQL2000是微软公司推出的SQL Server数据库管理系统的一个重要版本,它在20世纪末至21世纪初广泛应用于企业级数据管理。本教程旨在深入讲解SQL2000的管理和维护,涵盖数据库的安全性、备份与恢复等关键知识点。 一、...

Global site tag (gtag.js) - Google Analytics