加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于查看索引所占空间及rebuild对索引的影响

(2010-12-22 16:17:40)
标签:

rebuild

index

it

分类: Oracle数据库

测试目的:

查看索引所占表空间及rebuild对索引重建后所占空间的比较

测试表:

                Invoiceinfo

测试索引:

                Invoiceinfo上的所有索引

测试步骤:

a)         测试前,invoiceinfo中大概有15万条数据,索引所占表空间情况如下:

select t.segment_name "索引名称", bytes/1024/1024 "占用空间(M)" from user_segments t where t.segment_type='INDEX'

       索引名称                  占用空间(M)

1        PK_STUDENT                0.0625

2        PK_INVOICEINFO            56

3        IDX_INVOICEINFO           214

4        IDX_INVOICEINFO_1         208

5        IDX_INVOICEINFO_2         96

6        IDX_INVOICEINFO_3         208

7        IDX_INVOICEINFO_4         246

8        IDX_INVOICEINFO_5         168

9        IDX_INVOICEINFO_6         96

其中,PK_STUDENT与该测试无关

b)         删除invoiceinfofpzt代码不为’1’的数据,然后重新上面的索引使用空间情况,发现变化不大。

原因分析:数据库对象使用的段有一个HWL(高水位线),当对象使用空间增加时,HWL移动到高位,而当对象使用空间减小时,HWL并不会主动降低。这种情况就造成使用索引查询记录时,需要扫描过多的无用数据块。

c)         Rebuild其中一个索引

alter index IDX_INVOICEINFO rebuild;

d)         再次查询索引空间占用情况

       索引名称                             占用空间(M)

1        PK_STUDENT                0.0625

2        PK_INVOICEINFO            56

3        IDX_INVOICEINFO           214

4        IDX_INVOICEINFO_1         208

5        IDX_INVOICEINFO_2         96

6        IDX_INVOICEINFO_3         208

7        IDX_INVOICEINFO_4         246

8        IDX_INVOICEINFO_5         168

9        IDX_INVOICEINFO_6         96

标红的索引表空间IDX_INVOICEINFO并没有变化,说明rebuild对本次操作作用不明显。

e)         删除该索引,然后重建IDX_INVOICEINFO

 

drop index IDX_INVOICEINFO;

 

create index IDX_INVOICEINFO on INVOICEINFO (ENTERPRISEID, INVOICEKIND, INVOICENUMBER, YYBZ);

 

因为表中记录较少,操作秒级完成。此时我们再观察索引统计信息:

 

select t.segment_name "索引名称", bytes/1024/1024 "占用空间(M)" from user_segments t where t.segment_type='INDEX';

 

       索引名称                             占用空间(M)

1        PK_STUDENT                0.0625

2        PK_INVOICEINFO            56

3        IDX_INVOICEINFO           0.0625

4        IDX_INVOICEINFO_1         208

5        IDX_INVOICEINFO_2         96

6        IDX_INVOICEINFO_3         208

7        IDX_INVOICEINFO_4         246

8        IDX_INVOICEINFO_5         168

9        IDX_INVOICEINFO_6         96

可以发现,索引IDX_INVOICEINFO所占空间显著缩小。

 

f)          下面我们再来看一下rebuild online的效果

 

首先需要明确的是,rebuild是对索引进行扫描,而rebuild online是对表进行扫描。在DML操作频繁的OLTP系统中经常用rebuild online会比较合适。

 

alter index IDX_INVOICEINFO_3 rebuild online;

 

此时查询空间占用情况:

 

select t.segment_name "索引名称", bytes/1024/1024 "占用空间(M)" from user_segments t where t.segment_type='INDEX';

 

           索引名称                             占用空间(M)

1        PK_STUDENT                0.0625

2        PK_INVOICEINFO            56

3        IDX_INVOICEINFO           0.0625

4        IDX_INVOICEINFO_1         208

5        IDX_INVOICEINFO_2         96

6        IDX_INVOICEINFO_3         208

7        IDX_INVOICEINFO_4         246

8        IDX_INVOICEINFO_5         168

9        IDX_INVOICEINFO_6         96

 

可以发现,索引IDX_INVOICEINFO_3所占空间没有显著变化。

 

结论:

rebuild索引并不能降低高水位线,先dropcreate才可以达到此目的。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有