oracle delete删除数据后磁盘空间的释放问题

leslie_yjm 2013-04-10 01:48:37
服务器空间不够,网上搜到有人问相似的问题,单表300G的数据,想根据delete 加约束条件删除部分数据,但是大家都知道delete不会释放表空间,请问有什么好的方法么?导入导出的感觉不太实际,一是数据太大,二是系统也在实时跑的,肯定有影响。delete操作我已经在做了,就几百万几百万的删记录,但是空间不释放的。这操作是一同事让我做的,我跟他说了delete不释放空间的,他说让我先删着,是不是他晚上还做了其他释放空间的操作了?不然有什么意义。
类似MSSQL的收缩数据库后数据库就明显变小很多,oracle有什么方式吗?

大侠们给点意见吧,我自己现场试试效果

user_segments表里查看表占用的空间
...全文
10806 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChocolateTan 2013-04-18
  • 打赏
  • 举报
回复
分段提交如何? http://netfire.name/archives/20061031/260.html
sych888 2013-04-18
  • 打赏
  • 举报
回复
select num_rows,blocks,empty_blocks from user_tables where table_name='A' NUM_ROWS BLOCKS EMPTY_BLOCKS ---------- ---------- ------------ 1 5 3 BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块.
linwaterbin 2013-04-11
  • 打赏
  • 举报
回复
dba_free_space 有剩余就可被重用
沉---枫 2013-04-11
  • 打赏
  • 举报
回复
方法1。直接truncate表 方法2.delete表之后在根据当前表空间大小,重新设置表空间的大小
leslie_yjm 2013-04-11
  • 打赏
  • 举报
回复
引用 10 楼 czg1230 的回复:
方法1。直接truncate表 方法2.delete表之后在根据当前表空间大小,重新设置表空间的大小
truncate 我知道,那是整表删除,我用delete是加约束条件的,整表删不是找死吗
leslie_yjm 2013-04-10
  • 打赏
  • 举报
回复
引用 楼主 leslie_yjm 的回复:
服务器空间不够,网上搜到有人问相似的问题,单表300G的数据,想根据delete 加约束条件删除部分数据,但是大家都知道delete不会释放表空间,请问有什么好的方法么?导入导出的感觉不太实际,一是数据太大,二是系统也在实时跑的,肯定有影响。delete操作我已经在做了,就几百万几百万的删记录,但是空间不释放的。这操作是一同事让我做的,我跟他说了delete不释放空间的,……
网上看了资料又发现问题,说是shrink 之后,表对应的对象都会实效, 注意:alter table XXX enable row movement语句会造成引用表XXX的对象(如存储过程、包、视图等)变为无效。执行完成后,最好执行一下utlrp.sql来编译无效的对象。 想请教下utlrp.sql 是个啥玩意????????
leslie_yjm 2013-04-10
  • 打赏
  • 举报
回复
差不多算解决了,了解下高水位的问题,对于高水位的具体值是指user_segments里表的bolcks值还是user_tables里的bolcks值?
leslie_yjm 2013-04-10
  • 打赏
  • 举报
回复
alter table test2 enable row movement; alter table test2 shrink space;
陈字文 2013-04-10
  • 打赏
  • 举报
回复
学习了.. 时间久了,oracle也会自动去释放.
软件钢琴师 2013-04-10
  • 打赏
  • 举报
回复
也可以通过收缩 表空间 ,百度吧
软件钢琴师 2013-04-10
  • 打赏
  • 举报
回复
若要彻底删除表,则使用语句:drop tablepurge; 清除回收站里的信息 清除指定表:purge table ; 清除当前用户的回收站:purge recyclebin; 清除所有用户的回收站:purge dba_recyclebin; 不放入回收站,直接删除则是:drop table xx purge; truncate table 后,有可能表空间仍没有释放,可以使用如下语句: alter table 表名称 deallocateunused keep 0; 注意如果不加keep 0的话,表空间是不会释放的
  • 打赏
  • 举报
回复
10g及其以上版本可以使用shrink 或者在线重定义
陈字文 2013-04-10
  • 打赏
  • 举报
回复
如果是整表删除,并且不涉及回滚,则建议使用TRUNCATE... 无需COMMMIT.

17,382

社区成员

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

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