使用delete删除数据后,查询很慢,求解?

mifantuanzi27 2013-02-01 12:05:48
场景描述:
现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语句的原因吗?对于该类需求该如何操作呢?谢谢。
...全文
2305 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iqlife 2013-02-01
  • 打赏
  • 举报
回复
以某非索引字段A查询用时60s(select * from T where A='' ) 不是,无索引大数据查询肯定慢,加索引后可解决 大表建议分区
mybluetiankong 2013-02-01
  • 打赏
  • 举报
回复
这两条命令压缩表, alter table t enable row movement; alter table t shrink space;
youqi1984 2013-02-01
  • 打赏
  • 举报
回复
定时重创这线表,我觉得还是可以的。在业务峰值最小时,执行作业。
合理的索引要创建,比如在分割的时间上
wmg494005678 2013-02-01
  • 打赏
  • 举报
回复
引用 6 楼 mifantuanzi27 的回复:
引用 5 楼 wmg494005678 的回复: 应该是HWM高水位线的问题,对无索引字段进行查询的时候,走的是全表扫描,全表扫描查询的事HWM以下的数据块。最开始T表没有数据的时候,HWM的位置是0,随着不断往里面插入数据,HWM一直增长,但是Job删除数据的时候,HWM并不会降低,只是释放了空间。举个极端的例子,表中原来有1KW条数据,如果你delete全部数据,执行查询,还是非常慢,因为H……
执行Job的时候,重建表,然后把最近两天的数据给插入进去。。。
mifantuanzi27 2013-02-01
  • 打赏
  • 举报
回复
引用 2 楼 shadow1986a 的回复:
这是因为你平时只用DELETE,记录虽然少了但是数据块还是没有释放。这和表空间的高水位线有关,你可以查一下。 最好的解决方法就是定时重创这线表。
之前我在网上查了一下,我感觉也是这个原因。我看了一下解决方案,基本都是建议truncate表,但是实际应用中,该表需保存最近两天的数据,且数据会被前端实时查询,怎样解决高水位线重置?有没有这方面的经验分享?谢谢
mifantuanzi27 2013-02-01
  • 打赏
  • 举报
回复
引用 5 楼 wmg494005678 的回复:
应该是HWM高水位线的问题,对无索引字段进行查询的时候,走的是全表扫描,全表扫描查询的事HWM以下的数据块。最开始T表没有数据的时候,HWM的位置是0,随着不断往里面插入数据,HWM一直增长,但是Job删除数据的时候,HWM并不会降低,只是释放了空间。举个极端的例子,表中原来有1KW条数据,如果你delete全部数据,执行查询,还是非常慢,因为HWM还在一亿那个位置,没有减小成0.全表扫描会查询H……
之前我在网上查了一下,我感觉也是这个原因。我看了一下解决方案,基本都是建议truncate表,但是实际应用中,该表需保存最近两天的数据,且数据会被前端实时查询,怎样解决高水位线重置?
wmg494005678 2013-02-01
  • 打赏
  • 举报
回复
应该是HWM高水位线的问题,对无索引字段进行查询的时候,走的是全表扫描,全表扫描查询的事HWM以下的数据块。最开始T表没有数据的时候,HWM的位置是0,随着不断往里面插入数据,HWM一直增长,但是Job删除数据的时候,HWM并不会降低,只是释放了空间。举个极端的例子,表中原来有1KW条数据,如果你delete全部数据,执行查询,还是非常慢,因为HWM还在一亿那个位置,没有减小成0.全表扫描会查询HWM以下的数据块。
iqlife 2013-02-01
  • 打赏
  • 举报
回复
你吧执行计划贴出来看看,看看哪里耗费了的成本高
mifantuanzi27 2013-02-01
  • 打赏
  • 举报
回复
引用 1 楼 java3344520 的回复:
以某非索引字段A查询用时60s(select * from T where A='' ) 不是,无索引大数据查询肯定慢,加索引后可解决 大表建议分区
无索引查询20W数据,用时60S,感觉有些太慢了,应该不只是没有索引的原因吧
shadow1986a 2013-02-01
  • 打赏
  • 举报
回复
这是因为你平时只用DELETE,记录虽然少了但是数据块还是没有释放。这和表空间的高水位线有关,你可以查一下。 最好的解决方法就是定时重创这线表。

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧