监控发现数据库服务器I/O比较高,查询发现一条占用I/O相对很高的SQL。
1
delete from IVL_DEBUG.MED_BRD_PGM_VOD;
这条SQL每十分钟执行一次,提交给开发人员,既然是全表删除,让他改成truncate,不要用delete,但开发人员很强势,老子一次就删2万多条数据,怎么会占你I/O。
在下治好低头哈腰的给他解释了半天,delete是不会回收空间的,咱们数据库的表空间很充足,数据文件还自动扩展,你用delete删除数据之后,这部分空间虽然被置成可用状态了,但表空间充足的情况下,并不会被使用,这样这张表就会越删越大,你虽然只删除2万多条数据,但是这SQL要走全表扫描。
也不知道他是真不懂还是装糊涂,只好给他看数据了,我查了下表大小,将近12GB。
1
SQL> select bytes/1024/1024/1024 from dba_segments where segment_name='MED_BRD_PGM_VOD';
2
3
BYTES/1024/1024/1024
4
--------------------
5
11.7763672
查询发现,这张表的确就6万多条数据。
1
SQL> select count(*) from IVL_DEBUG.MED_BRD_PGM_VOD;
2
3
COUNT(*)
4
-------