首页    新闻    下载    文档    论坛     最新漏洞    黑客教程    数据库    搜索    小榕软件实验室怀旧版    星际争霸WEB版    最新IP准确查询   
名称: 密码:      忘记密码  马上注册
数据库 :: 数据库

Firebird数据库文件大小增长很快的原因


http://www.gipsky.com/
jingzu:

FB数据库文件大小增长很快,经过试验,是由于插入、删除操作引起,而我的数据库每天需要几个笔数据插入或删除,这样半年数据库文件就有500多M大了,速度变得很慢,而备份恢复后变30M左右,为什么会这样?有什么办法不让增长这么快。

我做个这样的试验,不断的插入1000条记录,然后全部删除空,这样不断的循环,数据库大小很快增长,按道理插入了再删空,数据库应该不会增长的,怎么还是会增长?是不是FB有问题?如何解决些问题?



channon:

你的问题我也碰到,我理解是删除操作不会减少数据空间,新的数据也不会覆盖被删除的数据空间。

我是这样解决的:

使用一个字段表示该记录是否删除。当insert数据时,先看有没有标记为删除的记录,有的话在该记录位置update,并标注为未删除。没有可用的已删除记录时才真的insert记录。

这样虽然在性能上会有一点损失,但数据文件到一定程度后就很少会增长了。



softfan:

其实不光是FB,大多少数据库都是这样的,如果删除记录后立即整理文件,那样就根本无法使用数据库了.比如说Access,是增长很快的.但文件的大小实际上不会影响数据库的效率,只要建立好索引就行,楼主的问题估计是在查询语句中引用了没有建索引的字段.如果没有建立索引,只要达到一定的数量级,即便是整理的很勤快,也不会解决问题.

channon的做法很有意思,也是值得借鉴的一种办法了.

为什么库文件的增长不会影响效率呢?我想是这样的,建立索引后,第一条记录和第100000条记录的查询速度是一样的,索引记录了记录行所在文件的偏移位置,因此,在查询时,先从索引中检索满足条件的记录,返回一个记录偏移地址列表,真正的记录再从这个列表中读取.这也许是数据库中都有一个页面大小的设置的缘故吧,偏移地址应该就是每一个页面的首地址,如果页面大小设置的很大,那样数据库增长的就快,如果小点,那么就会慢点,这个根据实际需求来定.比如整个数据库中所有表的记录最大尺寸不会超过1024个字节,那可以将page大小设置为1024,如果里面保存二进制文件或则大的文本,可以设置大点的page.假如有word这样的文件或者图片要保存,建议单独分离一个数据库用来保存文件,这样可以区别一下,业务数据库增长就不会太快.

我的一个产品里面要保存图片,几天就会达到一个G,如果不分开,我想业务数据库就危险了,一旦出现问题,处理上就会麻烦.而且分开有一个好处,即便文件库损害或者太大想整理,也只要替换一个空的文件库就可以了,不影响业务数据的正常运行,那个大的数据库也可以闲置,或者建立文件库列表,以便重新检索这个数据库.



lmf:

Firebird是多代结构,这样大量插入然后删除不好。不过因为你半年才500M还没有关系,不过变慢是肯定的,如果你每天晚上进行整理,速度就不会慢下来。



jingzu:

谢谢您提供这个方法,由于插入数据一天也就1000多条,且是分开时间的,所以我不用考虑性能,这个方法很好。

以前我记得看过一种数据库,可以先插入到原来删除的位置,现在怎么找也不到,我也以为删除数据时,新插入的会先插入到原来删除的空间。看来FB数据库不是这样的,删除的数据会占用空间,就象回收站一样,这样看来删除的数据有恢复的可能,是吗?



lmf:

如果刚被删除,立即交给人去恢复的话,还是有人能恢复的。俄罗斯人还专门编写了这方面的工具。删除数据时间长了的话,也不容易的。



jingzu:

我按您的方法做了,加入新数据奇慢无比,原来加入1000条数据只要5秒左右,现在要几分钟,您是怎么弄的?



lmf:

一定得加索引,否则数据操作会越来越慢



raintip:

我的数据库超过1G了(一年四个月),性能没什么变化,lmf说的对,主要是索引问题。



channon:

索引很重要!

其次用些小技巧,以较少查询次数。其实时间主要浪费在查询上了。

首先要有一个主键。

比如要插入5条记录,如果每条记录都查询一遍已删除记录的主键,就要查询5次。我是在第一次插入时把所有已删除记录的主键取出来放在stringlist里,以后要插入记录时就看stringlist有没有内容,有的话就用,没有的话就要生成新的主键编号。

不知道这样说明白了没有。



ccccu:

即然原来设计就是如此,就换种思路:

借用备份的方法:

定期或不定期的根据现有数据库的结构生成空表,然后将原数据库的数据导入新数据库中。采用这种方法要注意解决自增字段值的问题。



jingzu:

我也用了这种主键取出来放在stringlist方法,加入数据现在不慢了,但是:

我用循环每次加入1000条记录,数据库文件还是会增加,循环100次后,数据库文件很快到15M以上(当然不用这个方法增长只是慢点),按处理应该不会增加那么快的,问题还出在那里?

特别是备份恢复的时候,变得特别慢了。15M文件备份恢复为3M,用10分钟,奇慢啊。

我的数据结构只有一个主键,一个索引(删除标记作为索引)。



channon:

只要增加的记录数比删除的记录数大,那么数据文件就肯定会增长的。



jingzu:

1000条记录循环加入删除,刚好相等的。

数据库文件大小还是会增加很快。

其实15M数据库文件已没有一条记录了。



channon:

莫名了!
<< firebird database (快速入?) firebird数据库的修复 >>
评分
10987654321
API:
gipsky.com& 安信网络
网友个人意见,不代表本站立场。对于发言内容,由发表者自负责任。

系统导航

 

Copyright © 2001-2010 安信网络. All Rights Reserved
京ICP备05056747号