为什么将Interbase数据库中的数据全删除数据的文件大小不变。(100分)

  • 主题发起人 主题发起人 K
  • 开始时间 开始时间
K

K

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个数据库sdl.gdb文件大小16M,当我将数据全部删除后文件大小
并没有减小,应该如何解决。谢谢
 
关系数据库会记录你对数据库的操作并计为Log.
我曾在MSSQL6.5中用 Delete from t,删除记录数近百万的表,要花一个小时。
后来用Drop table t, 只需几秒。原因在于MSSQL要将t里的数据存入log,在
RollBack时可恢复。MSSQL有语句可清楚log,InterBase也该有吧!
 
我是新手,有没有哪位能讲细些
 
这种SQL 数据库,是在一个文件内存放所有的表定义、数据等等,你删除了数据,
但数据还存在文件内部,所以大小并不发生变化,可以在 Server manager里做
一次 Sweep 操作,就可以了。
 
试了半天还是不成,是不是需要设置其它选项。谢谢

SHOW DB
Database: C:/sdl/newsdl/DB/SDL.GDB
Owner: SYSDBA
PAGE_SIZE 1024
Number of DB pages allocated = 16731
Sweep interval = 20000
 
你确实手工运行sweep了吗?
另外,IB5.5有一个bug,sweep操作会引起问题.
建议升级到5.6以上。

如果还有问题,运行backup/restore,看看大小是否变化。

建议运行一下database statistics,
看 detail,看看average fill是否>60%,
如果是,应该没有问题。
 
温柔一刀:
你是说这个吧,这些信息是什么意思。
Database "C:/sdl/newsdl/DB/SDL.GDB"

Database header page information:
Flags 0
Checksum 12345
Generation 55118
Page size 1024
ODS version 9.1
Oldest transaction 55093
Oldest active 55093
Oldest snapshot 55093
Next transaction 55094
Bumped transaction 1
Sequence number 0
Next attachment ID 0
Implementation ID 16
Shadow count 0
Page buffers 0
Next header page 0
Creation date May 2, 2000 13:55:51
Attributes force write

Variable header data:
Sweep interval: 20000
*END*


Database file sequence:
File C:/sdl/newsdl/DB/SDL.GDB is the only file

Database log page information:
Creation date
Log flags: 2
No write ahead log

Next log page: 0

Variable log data:
Control Point 1:
File name:
Partition offset: 0 Seqno: 0 Offset: 0
Control Point 2:
File name:
Partition offset: 0 Seqno: 0 Offset: 0
Current File:
File name:
Partition offset: 0 Seqno: 0 Offset: 0
*END*

Analyzing database pages ...

BOOKNAME (158)
Primary pointer page: 249, Index root page: 250
Data pages: 0, data page slots: 0, average fill: 0%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

BQ (148)
Primary pointer page: 14842, Index root page: 14843
Data pages: 0, data page slots: 0, average fill: 0%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

BQTEMP (149)
Primary pointer page: 14844, Index root page: 14845
Data pages: 0, data page slots: 0, average fill: 0%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

CUSTOMER (154)
Primary pointer page: 237, Index root page: 238
Data pages: 0, data page slots: 0, average fill: 0%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

FXZ (152)
Primary pointer page: 15768, Index root page: 15769
Data pages: 1, data page slots: 1, average fill: 5%
Fill distribution:
0 - 19% = 1
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

LIBRARIAN (155)
Primary pointer page: 239, Index root page: 244
Data pages: 0, data page slots: 0, average fill: 0%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

PZH (153)
Primary pointer page: 14861, Index root page: 14862
Data pages: 0, data page slots: 0, average fill: 0%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

RKJL (157)
Primary pointer page: 246, Index root page: 247
Data pages: 0, data page slots: 0, average fill: 0%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

TEMP1 (150)
Primary pointer page: 14840, Index root page: 14841
Data pages: 0, data page slots: 0, average fill: 0%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

TEMP2 (151)
Primary pointer page: 14848, Index root page: 14849
Data pages: 0, data page slots: 0, average fill: 0%
Fill distribution:
0 - 19% = 0
20 - 39% = 0
40 - 59% = 0
60 - 79% = 0
80 - 99% = 0

YB (140)
Primary pointer page: 14825, Index root page: 14826
Data pages: 2, data page slots: 2, average fill: 47%
Fill distribution:
0 - 19% = 0
20 - 39% = 1
40 - 59% = 1
60 - 79% = 0
80 - 99% = 0
"你确实手工运行sweep了吗?"
如何手工运行?难到选Maintenance | Database Sweep命令不成。
 
你的很多table average fill都是0,说明数据没有了,
只剩下空间没压缩。

>>难到选Maintenance | Database Sweep命令不成
如果你要立刻sweep,当然是选择这一项!!

Sweep interval = 20000,这是Interbase缺省设置,
是指的20000次Transaction之后才自动sweep!
你可以改小这个数,但系统频繁sweep,既影响效率,又不安全。

如果你要发布DB给别人,当然是手工sweep,或者backup/restore。

总之,如此这般,为什么会“难道”呢? :-)
 
"如果你要发布DB给别人"上次我给别人考我的程序时用的RW-CD,程序没多大,DB
可够大的,我的天呀.......
别告诉我ZIP压缩
 
温柔一刀:
不如你温柔的给我一刀吧
 
呵呵,不要用interbase了,试试xml吧,结构很小。
 
Chenlili:
你指的xml是什么
好象是与网页有关,象html
 
xml是扩展模型语言也可用作网页
interbase没用过但其它数据库大小是初始时设定在一定大小的上的,一旦设定有无数据都是那么大直到用完分配的设备
 
手工Sweep吧, 无可商量
 
我的刀已出完,并且我确信解释清楚并且解决了你提出的问题,
如果你还有什么不明白,我相信与我无关。
有什么不满意的地方,说出来,等别人解答吧。
 
Crab:
"手工Sweep吧"
如何手工Sweep,多谢。
其实我也觉得按温柔一刀所说的没错,可我屡试都没有起作用,
是不是我在使用数据库中有问题,请各位帮想想办法,不然我
做的程序就太大了.
 
新建一个'gdb'用 datapump 倒入空表到'gbd'中,删除原文件.
(^-^)方法差点!
 
yubo:
我不能在使用中老新建删除。
不过要是真的没办法,我在分发程序时直好这样了。
我的命真哭!!!
 
后退
顶部