历史数据的插入与压缩 DBCC SHRINKDATABASE收缩指定数据库中的数据文件大小。 DBCC SHRINKFILE收缩相关数据库的指定数据文件或日志文件大小。语法DBCC SHRINKFILE ( { file_name | file_id } { [ , target_size ] | [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ] } ) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果日志不要,清除之.清除日志: DECLARE @LogicalFileName sysname, @MaxMinutes INT, @NewSize INTUSE szwzcheck -- 要操作的数据库名SELECT @LogicalFileName = 'szwzcheck_Log', -- 日志文件名@MaxMinutes = 10, -- Limit on time allowed to wrap log. @NewSize = 20 -- 你想设定的日志文件的大小(M)-- Setup / initializeDECLARE @OriginalSize intSELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileNameSELECT '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 = @LogicalFileNameCREATE 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 = @LogicalFileNameDROP TABLE DummyTransSET NOCOUNT OFF 把szwzcheck换成你数据库的名字即可,在查询分析器里面运行。 有全角的空格(为了显示好看),你自己把他换一下. 收缩日志:企业管理器--所有任务--收缩数据库--文件--选日志文件收缩 收缩数据库与清除日志都是治标的办法,收缩数据库只是把空闲的空间给收回来,起不了压缩数据库的功能。日志文件在我的案例中所占空间很少。我昨天又做了测试,之前的测试是在sql 2000个人版上测试的,插入的效率低。后来换了台机器,安装的企业版,插入效率明显提高,CPU占用也很少。这两个版本有这么大差别吗!还是其他问题。对于数据库的压缩,我想把表导出到文件,然后对文件进行压缩,当需要查询时,解压文件,才把文件导入到数据库供查询使用。通过企业管理器手动可以实现,不知道通过编程怎么实现。 Q1:之前的测试是在sql 2000个人版上测试的,插入的效率低。后来换了台机器,安装的企业版,插入效率明显提高,CPU占用也很少。这两个版本有这么大差别吗!-----------(价格/功用)悬殊的版本性能上一定会有体现 如果多处理器(HT也算)可能会更明显一些 记得2000个人版对超过5线程的并发有特别的限制(企业版好像是接受255并发 注意是CPU对其的并发处理)Q2:于数据库的压缩,我想把表导出到文件,然后对文件进行压缩,当需要查询时,解压文件,才把文件导入到数据库供查询使用。通过企业管理器手动可以实现,不知道通过编程怎么实现。------------这种做法实在不敢恭维,存取时间和存取空间是相对立的,生产环境下大都追求以存取空间换存取时间;TSQL好像没有涉及数据压缩的命令? sorry 记错了 是msde有五个并发限制... however, that MSDE has a limit of five concurrent workloads...[KB Article Q303789] To:rouqu 因为目前我开发的项目为组态平台,其有保存历史纪录一年的要求,保存一周以上的在线数据以便于用户查询,超过七天以内的数据转储压缩到文件,这种方式也是很多组态产品采用的方式,我只是在寻找实现途径。七天之外的数据需手动倒入历史数据才能查询。目前我找到的一种方法是通过ADO的recordset对象save到XML文档,然后通过第三方的压缩组件(如XCEED)进行压缩。不知道有没有更好的方法。 按照这段文字的要求 那就对超过七天的数据BCP OUT导出为TXT文档,需要的时候按时间段加载进来 如果有必要对TXT再压缩如果要进行decision ing、biz stactistics可以从OLTP DB经ETL做成数据仓库DB 设置活动的时间窗口 To:rouqu 想问你,你建议的进行decision ing、biz stactistics,数据仓库等技术哪里有编程方面的详细介绍。还有是否可以缩减历史数据占用空间。我现在以通过转储到XML,然后采用bzip2的压缩方式实现了。不过有点不好的地方在于,存在在线数据,与离线数据的机制,比如要查询7天以前的数据,需要对压缩文件解压,然后通过XML查询,或者BUCK LOAD XML后通过MSSQL查询。 半小时 40M一天 :40×48 = 1.92G一年:1.92*365 = 700G现在的企业存储起点是1T,空间应该不是问题吧。如果确实要压缩的话,可以直接使用操作系统的硬盘压缩,专门建立一个硬盘分区用于存储历史数据库文件,并将该分区设置为压缩方式。 关于数据库数据文件的压缩 oracle 11g里面有多项新技术 如Block级别的数据压缩、SecureFile存储、Advance Compression Option功能选件等(11g白皮书称能实现75%压缩率),对比SQL 2005中似乎还没有涉及,sql 2008中倒是添加了对备份文件的压缩功能 对于实时数据库的压缩 在服务器性能不是一个问题的情况下 取得时间/空间上的平衡似乎也是一个发展方向 特别对于密集采集数据的完全捕捉 无损数据压缩是有必要的我在9楼提到的是,不考虑压缩,就可以试图建立数据仓库数据库来保存历史记录,进一步的用作分析和商业决策,对于你一个单独的开发或者小项目其实没有参考性10楼给出的数据量也可以供LZ参考的~ 合并两个结果 请问这个SELECT是什么意思 关于SQL和sybase的导入速度问题。 如果做网站数据分页存储过程?(没有任何ID做参考,也没有类似ID的字段) 求教:数据库附加问题 xp系统下 ms-sql server 2005 还原数据库时自动关闭 求助一变态sql! 我 的问题 SQL SERVER 7。0 中能否 对多个数据库使用同一个名登陆,而不同的密码。 如何获得刚增加的一条记录的主键? 请问在SQL Server 2k中如何将一个数据库中的部分表用SQL语言导入或追加到另一个数据库的相同表中 离现在最近的星期日 这个SQL语句该怎么写,我们老师也不会
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换成你数据库的名字即可,在查询分析器里面运行。
有全角的空格(为了显示好看),你自己把他换一下.
收缩日志:企业管理器--所有任务--收缩数据库--文件--选日志文件收缩
之前的测试是在sql 2000个人版上测试的,插入的效率低。后来换了台机器,安装的企业版,插入效率明显提高,CPU占用也很少。这两个版本有这么大差别吗!
-----------
(价格/功用)悬殊的版本性能上一定会有体现 如果多处理器(HT也算)可能会更明显一些 记得2000个人版对超过5线程的并发有特别的限制(企业版好像是接受255并发 注意是CPU对其的并发处理)
Q2:
于数据库的压缩,我想把表导出到文件,然后对文件进行压缩,当需要查询时,解压文件,才把文件导入到数据库供查询使用。通过企业管理器手动可以实现,不知道通过编程怎么实现。
------------
这种做法实在不敢恭维,存取时间和存取空间是相对立的,生产环境下大都追求以存取空间换存取时间;TSQL好像没有涉及数据压缩的命令?
因为目前我开发的项目为组态平台,其有保存历史纪录一年的要求,保存一周以上的在线数据以便于用户查询,超过七天以内的数据转储压缩到文件,这种方式也是很多组态产品采用的方式,我只是在寻找实现途径。七天之外的数据需手动倒入历史数据才能查询。目前我找到的一种方法是通过ADO的recordset对象save到XML文档,然后通过第三方的压缩组件(如XCEED)进行压缩。不知道有没有更好的方法。
想问你,你建议的进行decision ing、biz stactistics,数据仓库等技术哪里有编程方面的详细介绍。还有是否可以缩减历史数据占用空间。我现在以通过转储到XML,然后采用bzip2的压缩方式实现了。不过有点不好的地方在于,存在在线数据,与离线数据的机制,比如要查询7天以前的数据,需要对压缩文件解压,然后通过XML查询,或者BUCK LOAD XML后通过MSSQL查询。
一天 :40×48 = 1.92G
一年:1.92*365 = 700G
现在的企业存储起点是1T,空间应该不是问题吧。如果确实要压缩的话,可以直接使用操作系统的硬盘压缩,专门建立一个硬盘分区用于存储历史数据库文件,并将该分区设置为压缩方式。