日期:2014-05-16  浏览次数:20595 次

TC/TT的table型数据库空间消耗问题注意点

? ? 新公司的一个项目大量使用TT的table模式,代替MySQL表。上次收到运维的报告,说到一个应用的TC数据文件到了22G!考虑到当前的数据量,这和我以往常用的Oracle和MySQL相比,数据文件都是偏大的。想起xuwk给我说的:“TC的table实际上还是key-value结构”。我猜想TC由于没有schma的概念(Schema Free),所有表都按简单的kv模型处 理,必然要把每个记录的meta信息都存储下来,问题最大的就是:“字段名”每个记录都要存储,造成的浪费!
? ? 为了证实,我在自己虚机上测试如下:
#建立tct库,并增加3条记录:
tctmgr create cjxtest.tct
tctmgr put cjxtest.tct x1 "name" "u1" "password" "u11111"
tctmgr put cjxtest.tct x22 "name" "u21" "password" "u11122"
tctmgr put cjxtest.tct x333 "name" "u333" "password" "u1333333333333333"
? ? 然后用xxd cjxtest.tct | grep "^00811" ??来查看16进制内容,在尾部可见内容体(文件前面都是索引空余部分)
0081130: 0000 0000 0000 0000 0000 0000 0000 0000??................
0081140: c838 0000 0000 0000 0000 0800 0218 7831??.8............x1
0081150: 04 6e 616d 6502 7531 08 70 6173 7377 6f72??.name.u1.passwor
0081160: 6406 7531 3131 3131 0000 0000 0000 0000??d.u11111........
0081170: c849 0000 0000 0000 0000 0600 0319 7832??.I............x2
0081180: 3204 6e61 6d65 0375 3231 0870 6173 7377??2.name.u21.passw
0081190: 6f72 6406 7531 3131 3232 0000 0000 0000??ord.u11122......
00811a0: c8d8 0000 0000 0000 0000 0900 0425 7833??.............%x3
00811b0: 3333 046e 616d 6504 7533 3333 0870 6173??33.name.u333.pas
00811c0: 7377 6f72 6411 7531 3333 3333 3333 3333??sword.u133333333
00811d0: 3333 3333 3333 3300 0000 0000 0000 0000??3333333.........

? ? 基本证实:每条记录都重复存储了字段名(而且字段名可以随意更改、覆盖,并没有schma的约束)。具体来说存储结构是:主键标志+主键+(长度+字段名+长度+字段内容)+......? ?其中(长度+字段名+长度+字段内容)可循环。


? ? 还有一种情况:如果某个字段的内容更新了,比如上面的x2,新内容空余长度不够怎么办?也要像Oracle等DB一样,发生"行迁移"。如执行:

tctmgr put cjxtest.tct x22 "nametttttttttttttttttttttttttttttttttttttttttttttt" "u21" "password" "u11122"

? ? 再来看看tc文件内容 xxd cjxtest.tct | grep "^00811"
0081140: c838 0000 0000 0000 0000 0800 0218 7831??.8............x1
0081150: 046e 616d 6502 7531 0870 6173 7377 6f72??.name.u1.passwor
0081160: 6406 7531 3131 3131 0000 0000 0000 0000??d.u11111........
0081170: b030 0000 0000 0000 0000 0600 0319 7832??.0............x2
0081180: 3204 6e61 6d65 0375 3231 0870 6173 7377??2.name.u21.passw
0081190: 6f72 6406 7531 3131 3232 0000 0000 0000??ord.u11122......
00811a0: c8d8 0000 0000 0000 0000 0900 0425 7833??.............%x3
00811b0: 3333 046e 616d 6504 7533 3333 0870 6173??33.name.u333.pas
00811c0: 7377 6f72 6411 7531 3333 3333 3333 3333??sword.u133333333
00811d0: 3333 3333 3333 3300 0000 0000 0000 0000??3333333.........
00811e0: c849 0000 0000 0000 0000 0800 0347 7832??.I...........Gx2
00811f0: 3232 6e61 6d65 7474 7474 7474 7474 7474??22nametttttttttt
0081200: 7474 7474 7474 7474 7474 7474 7474 7474??tttttttttttttttt
0081210: 7474 7474 7474 7474 7474 7474 7474 7474??tttttttttttttttt
0081220: 7474 7474 0375 3231 0870 6173 7377 6f72??tttt.u21.passwor
0081230: 6406 7531 3131 3232 0000 0000 0000 0000??d.u11122........
? ? 可以看到x2出现了两条记录,原来的那一条应该是在文件的主键索引部分,修改了位置,释放了原有记录的空间。等待下次有更小的记录时,重新分配(可以 tctmgr put cjxtest.tct x4444 "name" "u1" "password" "u