DBCC SHRINKDATABASE
收缩指定数据库中的数据文件大小。 
DBCC SHRINKFILE
收缩相关数据库的指定数据文件或日志文件大小。语法
DBCC SHRINKFILE
    ( { file_name | file_id }
        { [ , target_size ]
            | [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ] 
        }
    )

解决方案 »

  1.   

    如果日志不要,清除之.清除日志: 
    DECLARE @LogicalFileName sysname,
            @MaxMinutes INT,
            @NewSize INT
    USE     szwzcheck             -- 要操作的数据库名
    SELECT  @LogicalFileName = 'szwzcheck_Log',  -- 日志文件名
    @MaxMinutes = 10,               -- Limit on time allowed to wrap log.
            @NewSize = 20                  -- 你想设定的日志文件的大小(M)
    -- Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size 
      FROM sysfiles
      WHERE name = @LogicalFileName
    SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
            CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
            CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
      FROM sysfiles
      WHERE name = @LogicalFileName
    CREATE TABLE DummyTrans
      (DummyColumn char (8000) not null)
    DECLARE @Counter   INT,
            @StartTime DATETIME,
            @TruncLog  VARCHAR(255)
    SELECT  @StartTime = GETDATE(),
            @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
    DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    EXEC (@TruncLog)
    -- Wrap the log if necessary.
    WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time 
          AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = 
    @LogicalFileName)  
          AND (@OriginalSize * 8 /1024) > @NewSize  
      BEGIN -- Outer loop.
        SELECT @Counter = 0
        WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
          BEGIN -- update
            INSERT DummyTrans VALUES ('Fill Log')  
            DELETE DummyTrans
            SELECT @Counter = @Counter + 1
          END   
        EXEC (@TruncLog)  
      END   
    SELECT 'Final Size of ' + db_name() + ' LOG is ' +
            CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
            CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
      FROM sysfiles 
      WHERE name = @LogicalFileName
    DROP TABLE DummyTrans
    SET NOCOUNT OFF
     
    把szwzcheck换成你数据库的名字即可,在查询分析器里面运行。 
    有全角的空格(为了显示好看),你自己把他换一下. 
    收缩日志:企业管理器--所有任务--收缩数据库--文件--选日志文件收缩
      

  2.   

    收缩数据库与清除日志都是治标的办法,收缩数据库只是把空闲的空间给收回来,起不了压缩数据库的功能。日志文件在我的案例中所占空间很少。我昨天又做了测试,之前的测试是在sql 2000个人版上测试的,插入的效率低。后来换了台机器,安装的企业版,插入效率明显提高,CPU占用也很少。这两个版本有这么大差别吗!还是其他问题。对于数据库的压缩,我想把表导出到文件,然后对文件进行压缩,当需要查询时,解压文件,才把文件导入到数据库供查询使用。通过企业管理器手动可以实现,不知道通过编程怎么实现。
      

  3.   

    Q1:
    之前的测试是在sql 2000个人版上测试的,插入的效率低。后来换了台机器,安装的企业版,插入效率明显提高,CPU占用也很少。这两个版本有这么大差别吗!
    -----------
    (价格/功用)悬殊的版本性能上一定会有体现 如果多处理器(HT也算)可能会更明显一些 记得2000个人版对超过5线程的并发有特别的限制(企业版好像是接受255并发 注意是CPU对其的并发处理)
    Q2:
    于数据库的压缩,我想把表导出到文件,然后对文件进行压缩,当需要查询时,解压文件,才把文件导入到数据库供查询使用。通过企业管理器手动可以实现,不知道通过编程怎么实现。
    ------------
    这种做法实在不敢恭维,存取时间和存取空间是相对立的,生产环境下大都追求以存取空间换存取时间;TSQL好像没有涉及数据压缩的命令?
      

  4.   

    sorry 记错了 是msde有五个并发限制... however, that MSDE has a limit of five concurrent workloads...[KB Article Q303789]
      

  5.   

    To:rouqu
        因为目前我开发的项目为组态平台,其有保存历史纪录一年的要求,保存一周以上的在线数据以便于用户查询,超过七天以内的数据转储压缩到文件,这种方式也是很多组态产品采用的方式,我只是在寻找实现途径。七天之外的数据需手动倒入历史数据才能查询。目前我找到的一种方法是通过ADO的recordset对象save到XML文档,然后通过第三方的压缩组件(如XCEED)进行压缩。不知道有没有更好的方法。
      

  6.   

    按照这段文字的要求 那就对超过七天的数据BCP OUT导出为TXT文档,需要的时候按时间段加载进来 如果有必要对TXT再压缩如果要进行decision ing、biz stactistics可以从OLTP DB经ETL做成数据仓库DB 设置活动的时间窗口 
      

  7.   

    To:rouqu
         想问你,你建议的进行decision   ing、biz   stactistics,数据仓库等技术哪里有编程方面的详细介绍。还有是否可以缩减历史数据占用空间。我现在以通过转储到XML,然后采用bzip2的压缩方式实现了。不过有点不好的地方在于,存在在线数据,与离线数据的机制,比如要查询7天以前的数据,需要对压缩文件解压,然后通过XML查询,或者BUCK LOAD XML后通过MSSQL查询。
      

  8.   

    半小时 40M
    一天 :40×48 = 1.92G
    一年:1.92*365 = 700G
    现在的企业存储起点是1T,空间应该不是问题吧。如果确实要压缩的话,可以直接使用操作系统的硬盘压缩,专门建立一个硬盘分区用于存储历史数据库文件,并将该分区设置为压缩方式。
      

  9.   

    关于数据库数据文件的压缩 oracle 11g里面有多项新技术 如Block级别的数据压缩、SecureFile存储、Advance Compression Option功能选件等(11g白皮书称能实现75%压缩率),对比SQL 2005中似乎还没有涉及,sql 2008中倒是添加了对备份文件的压缩功能 对于实时数据库的压缩 在服务器性能不是一个问题的情况下 取得时间/空间上的平衡似乎也是一个发展方向 特别对于密集采集数据的完全捕捉 无损数据压缩是有必要的我在9楼提到的是,不考虑压缩,就可以试图建立数据仓库数据库来保存历史记录,进一步的用作分析和商业决策,对于你一个单独的开发或者小项目其实没有参考性10楼给出的数据量也可以供LZ参考的~