oracle大表如何快速删除一列,Oracle 对表中的记录进行大批量删除
Oracle 对表中的记录进行大批量删除数量时,常常采用分批删除,逐次提交.其目的大概有三个原因:
Oracle 对表中的记录进行大批量删除数量时,常常采用分批删除,逐次提交.其目的大概有三个原因:
1.避免对其他事务select的影响
如果其他事务有需要查询这些要删除的记录,就需要去undo段查询前映像.分批逐次可以减少行更新的时间,以减少这种情况的发生.
2.避免各事务dml的锁等待
如果要删除的这些记录上,有其他事务在做dml操作,就可能会产生相互的行锁等待.分批逐次可以减少行锁定的时间,以减少这种情况的发生.
3.减少使用临时表空间对性能产生的影响
在关联删除时,可能会用到sort或hash区,一次对大量记录进行操作,如果sort_area_size或hash_area_size大小不够就会使用临时表空间,性能会降低.分批逐次可以减少单次操作的记录数,以减少这种情况的发生.
以下是一些对大批量删除进行分批删除逐次提交的代码,可根据自己的实际情况测试修改后实施.
--对无关联的单表中的记录按条件删除
declare
n_count number;
n_rownum number:=10000;
begin
select count(*) into n_count from tb_detail where createdate for i in 1..ceil(icount/irownum) loop
delete from tb_detail a
where createdate commit;
end loop;
end;
--对有关联的表按条件删除
declare
type ridArray is table of rowid index by binary_integer;
type dtArray is table of varchar2(50) index by binary_integer;
v_rowid ridArray;
v_fid_to_delete dtArray;
n_delete number;
n_rownum number:=10000;
begin
select count(*)
into n_delete
from tb_main
where createdate < to_date('20140101', 'yyyymmdd');
for i in 1 .. ceil(n_delete / n_rownum) loop
select fid, rowid BULK COLLECT
INTO v_fid_to_delete, v_rowid
from tb_main
where createdate < to_date('20140101', 'yyyymmdd')
and rownum <= n_rownum;
forall j in 1 .. v_fid_to_delete.COUNT
delete from tb_detail where fid = v_fid_to_delete(j);
forall k in 1 .. v_rowid.COUNT
delete from tb_main where rowid = v_rowid(k);
commit;
end loop;
end;
--对有关联的表按条件删除子表或主表
declare
type dtArray is table of varchar2(50) index by binary_integer;
v_fid_to_delete dtArray;
n_delete number;
n_rownum number := 10000;
begin
select fid BULK COLLECT
INTO v_fid_to_delete
from tb_main
where createdate < to_date('20140601', 'yyyymmdd');
for i in 1 .. ceil(v_fid_to_delete.COUNT / n_rownum) loop
forall j in (i - 1) * n_rownum + 1 .. least(i * n_rownum,v_fid_to_delete.COUNT)
delete from tb_detail where fid = v_fid_to_delete(j);
commit;
end loop;
end;
本文永久更新链接地址:,
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
oracle大表如何快速删除一列,Oracle 对表中的记录进行大批量删除相关推荐
- oracle 大表新增列 慢_Oracle DDL性能改进-大表新增列行为分析
生产过程中常常会遇到对表需要在线增加列,尤其是新增带缺省值的非空列,例如: ALTER TABLE .. ADD COLUMN ( ... NOT NULL DEFAULT ... ) 在Oracle ...
- oracle 大表删除数据后,回收空间的问题。
在oracle中由于表结构设计不合理或者需要清楚老数据的时候,经常需要对大表数据进行清理. 一般有一下几种方法: 1. 删除大部分数据,留下小部分数据.我们可以把需要保留的数据转移到别的表,然后再把大 ...
- ORACLE 大表使用 rowid 切片备份到历史表
ORACLE 大表使用 rowid 切片备份到历史表 概述与要求 思路 备份与清理表的信息 方案 操作前准备 切分字段 备份步骤 清理步骤 脚本 概述与要求 项目需求将几个5000万行大表先备份到历史 ...
- oracle创建索引表,Oracle 大表创建索引
Oracle 大表创建索引 祖仙教小凡仙 海鲨数据库架构师 有个2亿记录的表,发现需要添加一个联合索引,结果就采用普通的create index index_name on tablename (en ...
- Oracle大表清理truncate .. reuse storage
Oracle大表清理truncate .. reuse storage deallocate_unused_clause Purpose Use the deallocate_unused_claus ...
- oracle超大表建索引,Oracle 大表创建索引
有个2亿记录的表,发现需要添加一个联合索引,结果就采用普通的create index index_name on tablename (entp_id,sell_date),结果悲剧了,把所有的DML ...
- oracle变更为大表分区表,叶摇 » Blog Archive » oracle把没有分区的普通大表改成分区表...
oracle把没有分区的普通大表改成分区表 1.根据要改成分区的表的结构创建一张一样结构的表: create table PARA_CELL_W_HIS_EXCHANGE ( START_TIME D ...
- Oracle 大表回表过滤优化案例
某业务报表SQL: 执行时间3小时. asncn3a24zu67 SELECT NVL(XHSD0001.CG_F_GHSMC_TONGJI_SPBS_CGB(FHMX.SPBS), '0000000 ...
- oracle reuse storage,Oracle大表清算truncate . reuse storage
最近需要清理一张大表,要求不能影响性能.在MySQL里边我们可以通过借助coreutils以及硬链接的方式来最小化I/O,Oracle也可以通过分批次回收空间来最小化I/O,到底如何,下面我们拭目以待 ...
最新文章
- Java飞行记录器 JRockit Flight Recorder JFR诊断JVM的历史性能和操作
- wpf窗口向左向上_PaperWM:GNOME 下的平铺窗口管理
- [导入]MsAjax Lib- Boolean.parse 函数
- {}是set类型还是dict类型呢
- keil生成hex文件找不到_骚操作!用Python把公众号文章打包成pdf文件,再也不怕找不到了...
- mybatis-plus学习记录(详细)
- java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...
- wordpress在前台文章界面添加编辑按钮
- 用计算机弹歌我的歌声里,我的歌声里 (完整版)
- 如何学习Python进行数据分析
- c语言程序设计黄保和第二章,c语言程序设计答案(选择题+编程)黄保和、江戈版...
- 看懂Oracle的执行计划
- 想做出高级又好看的PPT,这9个技巧你别错过
- PDF文件加密解密-文件设置密码
- Three.js地球开发—6.三维球面上某点进行贴图标注
- Windows 小技巧10--Windows常见软件、系统配置
- 《数据结构与算法》课程设计:18-背包问题
- 究竟是什么人在买爱马仕?
- 解决嵌入百度导航4.1.x遇到的坑
- 源码时代UI干货分享|Axure基础教程