场景描述:
现oracle数据库有T表,其中有ID、BATCHID两个字段添加了普通索引。
由于数据增长较快,目前该表中有400W数据。因此设置了一个定时job每天执行一次,该job负责将数据中录入日期早于两天前的数据insert到备份历史表中,同时使用delete语句删除T表中超期数据。
问题:
目前T表中数据为20W左右,但是对无索引的字段做为条件查询时,仍很慢。例如,以某非索引字段A查询用时60s(select * from T where A='' ),查询数据总量时用时87S(select count(*) from T),请问是因为delete语句的原因吗?对于该类需求该如何操作呢?谢谢。
delete 查询慢
------解决方案--------------------------------------------------------
这是因为你平时只用DELETE,记录虽然少了但是数据块还是没有释放。这和表空间的高水位线有关,你可以查一下。 最好的解决方法就是定时重创这线表。
------解决方案--------------------------------------------------------
应该是HWM高水位线的问题,对无索引字段进行查询的时候,走的是全表扫描,全表扫描查询的事HWM以下的数据块。最开始T表没有数据的时候,HWM的位置是0,随着不断往里面插入数据,HWM一直增长,但是Job删除数据的时候,HWM并不会降低,只是释放了空间。举个极端的例子,表中原来有1KW条数据,如果你delete全部数据,执行查询,还是非常慢,因为HWM还在一亿那个位置,没有减小成0.全表扫描会查询HWM以下的数据块。