基于单个业务表浅谈ORACLE高水位线

        我这里有个附表,查了下有20574161条数据,没有建立索引,查询一条数据时间大概为96S左右,查询水位线:

        select blocks, empty_blocks from dba_tables where table_name='I_GENER_D';

    

        又查了下对应的表空间使用率:

        select Round(total.MB,2) as Total_MB,
  Round(total.MB-free.MB,2) as Used_MB, Round((1-free.MB/total.MB)*100,2) || '%' as Used_Rct
from (select tablespace_name,Sum(bytes)/1024/1024 as MB from dba_free_space group by tablespace_name) free,
  (select tablespace_name,Sum(bytes)/1024/1024 as MB from dba_data_files  group by tablespace_name) total
WHERE free.tablespace_name = total.tablespace_name and total.tablespace_name = 'ORACLE_DATA03';

        我们把数据删除一部分:

        delete from I_GENER_D where  ts<'2017-11-29 22:08:01';--执行结果:19984922行 已删除。

        我们这时候在查一下表数据和水位线以及表空间使用率、单条数据查询:

        

        


       表数据只剩58W条了查询时间还是很长,水位线和表空间占用率也没有变化,因为delete并不会降低水位线以及释放表空间占用。而且我们发现单挑数据查询仍然很慢,按理说数据删除95%以上,查询效率应该大幅度提升,但这里并没有,这就是水位线高影响的。

        解决方案就是表重建( alter table table_name move;)、压缩(alter table table_name shrink space;)、复制表(复制要保留的数据到临时表t,drop原表)等等。

        我们释放压缩下表,然后再查询看看效果。

        高水位线是oracle数据库的存储特性,所以数据库数据delete后不进行任何操作,效率并不会提升。小伙伴们记得以后遇到这种情况知道怎么优化就OK了。

https://mp.weixin.qq.com/s/-yfWQOn8MBliQihddeTCjQ

猜你喜欢

转载自blog.csdn.net/zhuaizhuaihenguai/article/details/80007103