场景描述:
现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查询慢

解决方案 »

  1.   

    以某非索引字段A查询用时60s(select * from T where A='' )不是,无索引大数据查询肯定慢,加索引后可解决大表建议分区
      

  2.   

    这是因为你平时只用DELETE,记录虽然少了但是数据块还是没有释放。这和表空间的高水位线有关,你可以查一下。  最好的解决方法就是定时重创这线表。
      

  3.   

    应该是HWM高水位线的问题,对无索引字段进行查询的时候,走的是全表扫描,全表扫描查询的事HWM以下的数据块。最开始T表没有数据的时候,HWM的位置是0,随着不断往里面插入数据,HWM一直增长,但是Job删除数据的时候,HWM并不会降低,只是释放了空间。举个极端的例子,表中原来有1KW条数据,如果你delete全部数据,执行查询,还是非常慢,因为HWM还在一亿那个位置,没有减小成0.全表扫描会查询HWM以下的数据块。
      

  4.   


    之前我在网上查了一下,我感觉也是这个原因。我看了一下解决方案,基本都是建议truncate表,但是实际应用中,该表需保存最近两天的数据,且数据会被前端实时查询,怎样解决高水位线重置?
      

  5.   


    之前我在网上查了一下,我感觉也是这个原因。我看了一下解决方案,基本都是建议truncate表,但是实际应用中,该表需保存最近两天的数据,且数据会被前端实时查询,怎样解决高水位线重置?有没有这方面的经验分享?谢谢
      

  6.   

    执行Job的时候,重建表,然后把最近两天的数据给插入进去
      

  7.   

    这两条命令压缩表,
    alter table t enable row movement;
    alter table t shrink space;