为什么 sybase 索引大小比数据本身大得多

why sybase index size is much bigger than data itself

有一个sybase table,它的结构是

{ col1 int, col2 int, msgdate datetime, msg image, primary_key (col1)}

我们已经在 col2 上创建了一个索引。 table 中有将近 400 万行。我使用命令 "sp_spaceused" 检查 table 的大小,发现数据本身大约是 4GB,而 index_size 几乎是 40 GB(大 10 倍)。

索引怎么会消耗这么多spaces?鉴于索引是在类型为 "int" 的列上创建的?我想知道是否是类型为 "image" 的列 "msg" 导致了问题,或者命令 "sp_spaceused" 没有正确报告 space 用法。

谁能给个解释?

以前看过类似的案例,原因总是碎片化。 它发生在经历了数百万次插入和删除的数据行 table 中。所有页面 tables(又名 APL)似乎表现得更好:在我们的数据库中,所有页面 tables 的数量超过数据行,但只有数据行有这个问题。

我不建议仅出于这个原因使用 APL 而不是数据行。

解决方案是通过 运行ning

重组 table
reorg rebuild <TABLE>

这是一个缓慢、昂贵且阻塞的命令,因为它会在物理上重新排列数据和索引结构。 table 在 运行 时不能被其他人访问,它需要 dboption "select into/bulkcopy/pllsort"。综上所述,周末要运行那种任务。从好的方面来说,它非常安全:如果它失败了,table 将被部分重组但仍然可用。

由于像您这样的 table 在重组后往往会再次降级,我建议计划每周安排一次工作来重组 table 最需要的。