最近工作中碰到一个问题,生产环境中某一张表查询变的好慢,而本地同样的镜像环境查询却很快,研究了半天都没有发现问题。
开会进行讨论,发现一条线索, 由于业务需求,这表中的大部分数据全部被delete删除了,只保留了2w.
因此,推断此问题很有可能就是表的高水位问题。 下面我们就来验证一下:
第一步,查询当前表的blocks大小
执行搜集统计
ANALYZE TABLE Table_A COMPUTE STATISTICS;
查询blocks大小
select table_name,num_rows,blocks,empty_blocks
from user_tables
where table_name='Table_A';
查询结果:TABLE_A 421669 143320 40
第二步,查询当前表实际使用的blocks大小
select count(distinct dbms_rowid.rowid_block_number(rowid)) used_blocks
from Table_A;
查询结果:11369
情况已经很明显了,实际使用的blocks远远小于当前表的blocks. 所以我们需要将表的空间释放掉,
alter table Table_A move;
alter index IDX_ID rebuild online;
注:对表进行move以后,需要重建失效的索引
重新对表进行查询,查询速度很快,问题解决。
进一步学习Oracle高水位知识,可参考:http://blog.csdn.net/tianlesoftware/article/details/4707900#comments