ISQL-SE 4.10.DD6(DOS 6.22):
我的应用程序有以下SQL脚本(CODE REVIEW),我的用户在工作日结束时执行以重新编写事务表:
DATABASE dbfiles;
UNLOAD TO "U:\UNL\ACTIVES.UNL"
SELECT * FROM transaction
WHERE trx_type IN ("E","I","C","P")
ORDER BY trx_cust_fullname,
trx_last_pymt;
UNLOAD TO "U:\UNL\INACTIVES.UNL"
SELECT * FROM transaction
WHERE trx_type IN ("F","R","T","X","V")
ORDER BY trx_cust_fullname,
trx_last_pymt DESC;
DROP TABLE transaction;
CREATE TABLE transaction
(
trx_store CHAR(2),
trx_cust_fullname CHAR(30),
trx_type CHAR(1),
trx_num SERIAL,
[...]
);
LOAD FROM "U:\UNL\ACTIVES.UNL" INSERT INTO transaction;
LOAD FROM "U:\UNL\INACTIVES.UNL" INSERT INTO transaction;
CREATE CLUSTER INDEX custn_idx ON transaction (trx_cust_fullname);
CREATE UNIQUE INDEX trxn_idx ON transaction (trx_num);
[3 more indexes...]
UPDATE STATISTICS FOR transaction;
运行此脚本后:TRANS103.DAT大小为882,832字节,但是 TRANS103.IDX大小只有22,089字节!
虽然这个IDX文件大小对我来说不太好看,但是我用“执行”屏幕查询了事务表中的所有行,所有1083行都可以显示,更新了一些,添加了其他行并删除了一些没有问题,退出,再次回去,没有遇到任何问题!然后我跑'bcheck -y TRANS103'无论如何都得到了以下结果:
S:\DBFILES.DBS> bcheck –y TRANS103
BCHECK C-ISAM B-tree Checker version 4.10.DD6
C-ISAM File: s:\dbfiles.dbs\trans103
Checking dictionary and file sizes.
Index file node size = 512
Current C-ISAM index file node size = 512
Checking data file records.
Checking indexes and key descriptions.
Index 1 = unique key
0 index node(s) used -- 1 index b-tree level(s) used
Index 2 = duplicates (2,30,0)
42 index node(s) used -- 3 index b-tree level(s) used
Index 3 = unique key (32,5,0)
29 index node(s) used -- 2 index b-tree level(s) used
Index 4 = duplicates (242,4,2)
37 index node(s) used -- 2 index b-tree level(s) used
Index 5 = duplicates (241,1,0)
36 index node(s) used -- 2 index b-tree level(s) used
Index 6 = duplicates (46,4,2)
38 index node(s) used -- 2 index b-tree level(s) used
Checking data record and index node free lists.
ERROR: 177 missing index node pointer(s)
Fix index node free list ? yes
Recreating index node free list.
Recreating index 6.
Recreating index 5.
Recreating index 4.
Recreating index 3.
Recreating index 2.
Recreating index 1.
184 index node(s) used, 177 free -- 1083 data record(s) used, 0 free
所以在bcheck之后,现在它的.IDX大小增加到122,561字节,这听起来大小合适,所以我回到“执行”,重复以前的测试,没有遇到任何问题。出于好奇,我再次对它进行了bcheck,它重复了我跑的第一个bcheck的相同结果!就像第一个bcheck从未修复过桌子一样!......任何人都知道为什么bcheck再次修复本来应该已经“修复“?..它可能与集群索引有关吗?
答案 0 :(得分:0)
几年前我和Informix合作过,但不是最近。当你只有一个索引时,你有没有尝试过bcheck
? This discussion和另一个here让我觉得bcheck
一次修复了一个(损坏的?)索引。我希望这会有所帮助。
答案 1 :(得分:0)
因此,为了规避上述问题,我没有创建聚簇索引,而是创建非聚簇索引。现在所有的表在我查看它们时看起来都没问题,但是我需要聚簇索引!..在isql> query-language> run或者作为一个sql脚本中对所有数据文件运行bcheck是个好主意在SE引擎运行且目录文件打开的情况下sysmenuitems menuscript选项?..之前,我在卸载引擎时从操作系统提示符运行所有.DAT文件(包括系统目录)的bcheck。