none
关于数据库收缩的疑问 RRS feed

  • 问题

  • 一个360G的库,在做了历史数据归档后,空闲了约100G的空间。现在想执行数据库收缩操作,但有疑问,一下子收缩这么多,是否会对数据文件产生损坏?

    另外,将数据库收缩作为定期执行的维护动作,是否合适?

    2012年2月29日 7:32

答案

  • 那你收缩好了,收缩后最好能做索引重建,如果硬盘不坏,仅是dbcc shinkfile,肯定不会损坏数据文件,除非你中奖。

    Best Regards, nicofer

    • 已标记为答案 szslxm1 2012年3月1日 7:01
    2012年2月29日 9:00

全部回复

  • 一般来讲,如果空间不是问题,不推荐对数据库文件进行收缩,因为收缩数据文件会产生索引碎片。定期收缩更不推荐了。
    refer:http://blog.csdn.net/Garnett_KG/article/details/5615865

    Best Regards, nicofer


    • 已编辑 nicofer 2012年2月29日 8:16
    2012年2月29日 8:13
  • 归档后,原库的空间空闲出来很多但数据文件却没有减小;而归档库插入大量数据,空间剧增。所以空间不够用,需要收缩。现在有些担心收缩会把文件搞坏。

    2012年2月29日 8:35
  • 那你收缩好了,收缩后最好能做索引重建,如果硬盘不坏,仅是dbcc shinkfile,肯定不会损坏数据文件,除非你中奖。

    Best Regards, nicofer

    • 已标记为答案 szslxm1 2012年3月1日 7:01
    2012年2月29日 9:00
  • 实在需要可以收缩,建议不要收缩完。最好不要定期执行,除非你经常归档。

    还有,没有聚集索引会收缩比较慢。


    想不想时已是想,不如不想都不想。

    2012年2月29日 9:17
    版主
  • 收缩完成后,计划进行索引重建。说起“中奖”,还真有过一次。
    2012年3月1日 6:54
  • “实在需要可以收缩,建议不要收缩完。”那我留一些空闲的extents出来。

    2012年3月1日 6:59
  • 收缩完成后,查询一下,是否有索引碎片产生,是否有必要重建,重组 索引

    下面是 索引重建,重组判断

    ---

    SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] ' +
           CASE
                  WHEN ps.avg_fragmentation_in_percent > 15
                  THEN 'REBUILD'
                  ELSE 'REORGANIZE'
           END +
           CASE
                  WHEN pc.partition_count > 1
                  THEN ' PARTITION = ' + CAST(ps.partition_number AS nvarchar(MAX))
                  ELSE ''
           END,
           avg_fragmentation_in_percent
    FROM   sys.indexes AS ix
           INNER JOIN sys.tables t
           ON     t.object_id = ix.object_id
           INNER JOIN sys.schemas s
           ON     t.schema_id = s.schema_id
           INNER JOIN
                  (SELECT object_id                   ,
                          index_id                    ,
                          avg_fragmentation_in_percent,
                          partition_number
                  FROM    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL)
                  ) ps
           ON     t.object_id = ps.object_id
              AND ix.index_id = ps.index_id
           INNER JOIN
                  (SELECT  object_id,
                           index_id ,
                           COUNT(DISTINCT partition_number) AS partition_count
                  FROM     sys.partitions
                  GROUP BY object_id,
                           index_id
                  ) pc
           ON     t.object_id              = pc.object_id
              AND ix.index_id              = pc.index_id
    WHERE  ps.avg_fragmentation_in_percent > 10
       AND ix.name IS NOT NULL


    • 已编辑 jackyCui 2012年3月1日 7:04
    2012年3月1日 7:03