我这里有个附表,查了下有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原表)等等。
我们释放压缩下表,然后再查询看看效果。
https://mp.weixin.qq.com/s/-yfWQOn8MBliQihddeTCjQ