Oracle 大规模 delete,update 操作 注意事项
一. 说明
如果对大表进行大规模的delete 和update,那么可以注意一下如下说明:
(1) 查看执行计划,如果说删除的记录很多,走索引的成本会比全表扫描更大,因为更新数据时还需要做一些约束校验和创建index entry。而且对于多CPU 情况,全表扫描还可以使用并行的特性。
Oracle Parallel Execution(并行执行)
http://blog.csdn.net/tianlesoftware/archive/2010/09/01/5854583.aspx
(2)如果表上有索引,B-Tree 索引可以unusable索引,函数索引则disable 索引,等操作结束之后在rebuild索引。
(3)如果是大规模的delete,那么可能还需要注意一下高水位的问题,在允许的情况下,可以用alter table move 来降低高水位,同时注意rebuild 索引。
Oracle 高水位(HWM: High Water Mark) 说明
http://blog.csdn.net/tianlesoftware/archive/2009/10/21/4707900.aspx
如果是OLTP的生产环境,对于禁用索引和高水位处理的操作要慎重。
二. 相关测试
--查看表中记录数
SYS@dave2(db2)> select count(*) from dave;
COUNT(*)
----------
3080115
--查看索引信息
SYS@dave2(db2)> select index_name from dba_indexes where table_name='DAVE';
------------------------------
SYS@dave2(db2)> create table dave1 as select /*+parallel(t,3)*/ * from dave t;
SYS@dave2(db2)> explain plan for delete from dave where time_insert<to_date('2011-5-1','yyyy-mm-dd');
SYS@dave2(db2)> select * from table(dbms_xplan.display);
--------------------------------------------------------------------------------
---------------------------------------------------------------------------
| id | operation | name | rows | bytes | cost (%cpu)| time |
---------------------------------------------------------------------------
| 0 | delete statement | | 1369k| 26m| 7916 (3)| 00:01:35 |
|* 2 | table access full| dave | 1369k| 26m| 7916 (3)| 00:01:35 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
--------------------------------------------------------------------------------
---------------------------------------------------
2 - filter("time_insert"<to_date('2011-05-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss'))
SYS@dave2(db2)> explain plan for update dave d set getcard_code=10 where state=2;
SYS@dave2(db2)> select * from table(dbms_xplan.display);
--------------------------------------------------------------------------------
-------------------------------------------------------------------------------
| id | operation | name | rows | bytes | cost (%cpu)| time |
-------------------------------------------------------------------------------
| 0 | update statement | | 96254 | 469k| 2533 (1)| 00:00:31 |
|* 2 | index range scan| idx_state | 96254 | 469k| 194 (2)| 00:00:03 |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
--------------------------------------------------------------------------------
---------------------------------------------------
SYS@dave2(db2)> alter index idx_state unusable;
SYS@dave2(db2)> select status from dba_indexes where index_name='IDX_STATE';
--如果是对进行delete 操作,那么相关的索引要全部禁用才起作用。
SYS@dave2(db2)> update dave d set state=10 where state=2;
SYS@dave2(db2)> alter index idx_state rebuild;
http://blog.csdn.net/tianlesoftware/archive/2011/06/12/6538928.aspx
SYS@dave2(db2)> select num_rows,blocks,empty_blocks from dba_tables where table_name='DAVE';
---------- ---------- ------------
num_rows 的值只有做过统计信息收集之后才有,如果该值与count(*) 差距太大,就说明需要重新进行收集了。
empty_blocks 参数只有使用analyze 收集统计信息才有,使用dbms_stats 收集不到这个参数的信息。 如果empty_blocks 较多,就说明有高水位了。
SYS@dave2(db2)> analyze table dave compute statistics;
Table analyzed.
SYS@dave2(db2)> select num_rows,blocks,empty_blocks from dba_tables where table_name='DAVE';
---------- ---------- ------------
http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668723.aspx
SYS@dave2(db2)> alter table dave move;
SYS@dave2(db2)> select index_name,status from dba_indexes where table_name='DAVE';
------------------------------ --------
SYS@dave2(db2)> alter index IDX_PRCODE rebuild;
SYS@dave2(db2)> alter index IDX_STATE rebuild;
SYS@dave2(db2)> alter index idx_insert rebuild;
SYS@dave2(db2)> alter index SYS_C005469 rebuild;
SYS@dave2(db2)> select index_name,status from dba_indexes where table_name='DAVE';
------------------------------ --------
SYS@dave2(db2)> analyze table dave compute statistics;
SYS@dave2(db2)> select num_rows,blocks,empty_blocks from dba_tables where table_name='DAVE';
---------- ---------- ------------
Blog: http://blog.csdn.net/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(满); DBA2 群:62697977(满) DBA3 群:62697850(满)
DBA 超级群:63306533(满); DBA4 群: 83829929 DBA5群: 142216823
DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
转载于:https://www.cnblogs.com/spring3mvc/archive/2011/06/25/2414594.html
Oracle 大规模 delete,update 操作 注意事项相关推荐
- oracle更新数据还原,oracle误drop/update操作后的数据恢复测试
1.drop表,如何进行恢复 create table etl (id number); insert into etl values (1); commit; drop table etl; 如果d ...
- oracle数据库执行update操作一直执行(转圈)
1.查看是否锁表 SELECT SESS.SID,SESS.SERIAL#,LO.ORACLE_USERNAME,LO.OS_USER_NAME,AO.OBJECT_NAME,LO.LOCKED_MO ...
- 触发器实现两表之间的INSERT,DELETE,UPDATE
需求说明:培训记录处录入"外出培训"记录,保存后同步外出培训合同至"合同模块" 培训记录表PX_Record创建触发器 步骤一.新建触发器:[insert_ht ...
- oracle update 数据库恢复,ORACLE update 操作内部原理
对于oracle的update操作,在数据块中具体是如何出来,是直接更新原来值,还是通过插入新值修改指针的方法实现.下面通过证明: 模拟表插入数据 SQL> create table t_xif ...
- oracle Plsql 执行update或者delete时卡死问题解决办法
oracle Plsql 执行update或者delete时卡死问题解决办法 参考文章: (1)oracle Plsql 执行update或者delete时卡死问题解决办法 (2)https://ww ...
- Linq无聊练习系列7----Insert,delete,update,attach操作练习
/*********************Insert,delete,update,attach操作练习**********************************/ ...
- oracle操作错误还原,Oracle delete误操作数据恢复(BBED)
Oracle delete误操作数据恢复(BBED) 在Oracle中,表数据被错误执行了delete,并 已 提交,如何找回数据呢? 常规的修复方法可以想到 闪回.Rman.impdp . DG . ...
- Oracle表的分区update卡着,分区表分区字段的update操作
默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错--ORA-14402: 更新分区关键字列将导致分区的更改.但是可以通过打开表的r ...
- myBatis之update操作的注意事项
update操作,看似简单实则暗藏玄机. 首先update操作应该是分类的. 第一类,前端传递什么内容,后台随之更新什么内容.前端传递所有字段到后台,后台更新全部字段的值和前端保持一致,null也要更 ...
最新文章
- 数据结构---基础概念
- 函数指针数组在ARM异常中断处理中的应用
- java 深拷贝_java 深拷贝与浅拷贝机制详解
- java_options字符串拼接_java8 StringJoiner拼接字符串
- Java 中判断一个字符串是否包含另外一个字符串的方法
- jenkins部署java项目之小白的笔记
- 哈工大威海算法设计与分析_【斯坦福算法分析和设计02】渐进分析
- 【算法笔记】图文结合彻底搞懂后缀数组
- java经典sql笔试题
- 炫界 (392) -(持法延迟)_火爆手游必不可少低延迟蓝牙耳机,双11精品优质蓝牙耳机推荐...
- 营养电子秤控制板方案
- 电子病历系统源码 医院管理系统源码
- 【Linux】SCP 拷贝命令
- 如何使用 CSS 颜色?
- 华为机试 - HJ10 字符个数统计
- 【合天网安】DoraBox之文件包含及任意文件读取漏洞
- 香港中文大学计算机系直博面试经验
- gitHub常用命令笔记
- C++使用OPENSSL进行RSA加密,java服务端解密
- Y combinator初创加速器2020冬季团队大赏——最好与最坏的时代
热门文章
- Windows10家庭版安装Docker Desktop(非Docker Toolbox)
- json转成类对象转成xml全过程
- 利用微信的weui框架上传、预览和删除图片
- 1.4版本上线(第八次会议)
- 004-docker常用命令[二]-容器操作ps,top,attach,export
- 洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 乱搞
- 6月份美国域名总量新增近5.4万个 环比减少51%
- Access和sql server的语法区别
- 医疗大数据处理流程_我们需要数据来大规模改善医疗流程
- 图像离群值_什么是离群值?