Chinaunix

标题: 为什么聚族索引的空间利用率这么差? [打印本页]

作者: syxie    时间: 2007-03-11 23:49
标题: 为什么聚族索引的空间利用率这么差?
做了测试:

insert一个非聚族索引表和聚族索引表(组合索引),相同的表结构,只是索引类型不同。
需要注明一点的是:insert的时候,数据不是严格按照组合索引的顺序入库的。

发现聚族索引的表,空间页面有空洞,利用率比较低,是非聚族的2倍-2.5倍。这个浪费还是很严重的,必现的。即使聚族索引做物理位置排序,也不应该有如此的浪费啊?

请问有没有大佬有解决办法或者给出合理的解释?谢谢!
作者: hawker    时间: 2007-03-12 01:56
标题: 回复 1楼 syxie 的帖子
出现这种情况是和你的数据插入的顺序有关的,举一个简单的例子
create table t(c1 int) with max_row_per_page=2(语法可能有点问题,自己查一下手册具体的写法)
create cluster index on t (c1)
insert t values(10)
insert t values(9)
....
insert t values(1)

这样的数据插入的结果就会造成空间的浪费。
原理是这样的,当要插入的数据按照聚族索引的排列要求,正要插入在某一个数据的第一条数据之前,那么这个时候,就会新分配一个数据页,将所需插入的数据写新的数据页内,并将旧的数据页的页链断开,并将新页加入加入数据页链表中。
下面画一个简单的图示,希望对你理解问题产生的原因有些帮助。其中4,5为具体的数据,233,234为数据页的数据页号(注:很是奇怪不知道什么原因,编辑的状态下这个方框还算整齐,但是发表之后就比较乱,只是个大致的例子表示一个数据页,大家对付看吧。)
    _____  
  ->|  5     |->
  <-|         |<-
      |(233)|
      |____|
插入数据4后
   _____        _____  
->|  4     |->->|  5     |->   
->|         |<-<-|         |<-   
    |(234)|       |(233) |     
    |____|       |_____|     
              
如果你想释放浪费的空间一个办法是使用非聚簇索引。第二方法定期将表中的数据bcp out出来,然后重新bcp in回去,由于bcp out的时候所有的数据按照聚簇索引的排序顺序bcp out出来,然后bcp in的时候,就不会产生空间浪费的问题了。第三个方法,重建该非聚簇索引。

[ 本帖最后由 hawker 于 2007-3-12 01:59 编辑 ]
作者: syxie    时间: 2007-03-12 23:42
多谢!

我再多问一下:

如果一个聚族索引,其中的数据,如果按照索引倒序的方式入表的话,如果有10条数据的话,那岂不需要10个页面? 但是实际上不是这样的,好像sybase也有什么处理吧?
作者: 1017of    时间: 2007-03-12 23:45
why clustered index?
作者: chuxu    时间: 2007-03-13 13:05
你的表是APL还是DOL?
作者: syxie    时间: 2007-03-14 08:21
APL表
作者: 小无赖    时间: 2007-03-14 21:08
聚族索引应该是比非聚族索引大吧,因为聚族索引的计算是索引+数据的大小,我记得书上好象是这么说的.
作者: hawker    时间: 2007-03-15 21:56
标题: 回复 3楼 syxie 的帖子
图示所指情况是对于一般的数据页(不包括第一个数据页)的情况,如果是第一个数据页上的数据插入,那么就会将数据往下移。
例如:如果一个页可以存4条数据,那么如果你倒序插入10条数据,大概需要7个数据页才可以存下10条数据。如果你正序插入10条数据,那么只需要3个数据页就可以存下10条数据




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2