一.  说明

如果对大表进行大规模的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';

INDEX_NAME

------------------------------

IDX _PRCODE

IDX _STATE

IDX _INSERT

SYS_C005469

--创建一个备份表,下次使用

SYS@dave2(db2)> create table dave1 as select /*+parallel(t,3)*/ * from dave t;

Table created.

--查看执行计划

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);

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 2615685836

---------------------------------------------------------------------------

| id  | operation          | name | rows  | bytes | cost (%cpu)| time     |

---------------------------------------------------------------------------

|   0 | delete statement   |      |  1369k|    26m|  7916   (3)| 00:01:35 |

|   1 |  delete            | dave |       |       |            |          |

|*  2 |   table access full| dave |  1369k|    26m|  7916   (3)| 00:01:35 |

---------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

---------------------------------------------------

2 - filter("time_insert"<to_date('2011-05-01 00:00:00', 'yyyy-mm-dd              hh24:mi:ss'))

15 rows selected.

--查看走执行计划的大规模update 操作

SYS@dave2(db2)> explain plan for update dave d set getcard_code=10 where state=2;

Explained.

SYS@dave2(db2)> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 3706120077

-------------------------------------------------------------------------------

| id  | operation         | name      | rows  | bytes | cost (%cpu)| time     |

-------------------------------------------------------------------------------

|   0 | update statement  |           | 96254 |   469k|  2533   (1)| 00:00:31 |

|   1 |  update           | dave      |       |       |            |          |

|*  2 |   index range scan| idx_state | 96254 |   469k|   194   (2)| 00:00:03 |

-------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

---------------------------------------------------

2 - access("STATE"=2)

14 rows selected.

--禁用索引

SYS@dave2(db2)> alter index idx_state unusable;

Index altered.

SYS@dave2(db2)> select status from dba_indexes where index_name='IDX_STATE';

STATUS

--------

UNUSABLE

--如果是对进行delete 操作,那么相关的索引要全部禁用才起作用。

--更新数据

SYS@dave2(db2)> update dave d set  state=10 where state=2;

101837 rows updated.

SYS@dave2(db2)> commit;

Commit complete.

--rebuild 索引

SYS@dave2(db2)> alter index idx_state rebuild;

Index altered.

Oracle alter index 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     BLOCKS EMPTY_BLOCKS

---------- ---------- ------------

3080115      35350            0

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';

NUM_ROWS     BLOCKS EMPTY_BLOCKS

---------- ---------- ------------

3080115      35350         4585

有关统计信息更多内容参考:

Oracle Statistic 统计信息 小结

http://blog.csdn.net/tianlesoftware/archive/2009/10/14/4668723.aspx

--处理高水位

SYS@dave2(db2)> alter table dave move;

Table altered.

--move 会使所有索引失效,需要重新rebuild

SYS@dave2(db2)> select index_name,status from dba_indexes where table_name='DAVE';

INDEX_NAME                     STATUS

------------------------------ --------

IDX_PRCODE                     UNUSABLE

IDX_STATE                      UNUSABLE

IDX_INSERT                     UNUSABLE

SYS_C005469                    UNUSABLE

--rebuild 索引

SYS@dave2(db2)> alter index IDX_PRCODE rebuild;

Index altered.

SYS@dave2(db2)> alter index IDX_STATE rebuild;

Index altered.

SYS@dave2(db2)> alter index idx_insert rebuild;

Index altered.

SYS@dave2(db2)> alter index SYS_C005469 rebuild;

Index altered.

SYS@dave2(db2)> select index_name,status from dba_indexes where table_name='DAVE';

INDEX_NAME                     STATUS

------------------------------ --------

IDX_PRCODE                     VALID

IDX_STATE                      VALID

IDX_INSERT                     VALID

SYS_C005469                    VALID

-- 使用analyze 分析表

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';

NUM_ROWS     BLOCKS EMPTY_BLOCKS

---------- ---------- ------------

3080115      35487         4448

因为我这里没有进行大量的delete 操作,效果很有限。

-------------------------------------------------------------------------------------------------------

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 操作 注意事项相关推荐

  1. oracle更新数据还原,oracle误drop/update操作后的数据恢复测试

    1.drop表,如何进行恢复 create table etl (id number); insert into etl values (1); commit; drop table etl; 如果d ...

  2. oracle数据库执行update操作一直执行(转圈)

    1.查看是否锁表 SELECT SESS.SID,SESS.SERIAL#,LO.ORACLE_USERNAME,LO.OS_USER_NAME,AO.OBJECT_NAME,LO.LOCKED_MO ...

  3. 触发器实现两表之间的INSERT,DELETE,UPDATE

    需求说明:培训记录处录入"外出培训"记录,保存后同步外出培训合同至"合同模块" 培训记录表PX_Record创建触发器 步骤一.新建触发器:[insert_ht ...

  4. oracle update 数据库恢复,ORACLE update 操作内部原理

    对于oracle的update操作,在数据块中具体是如何出来,是直接更新原来值,还是通过插入新值修改指针的方法实现.下面通过证明: 模拟表插入数据 SQL> create table t_xif ...

  5. oracle Plsql 执行update或者delete时卡死问题解决办法

    oracle Plsql 执行update或者delete时卡死问题解决办法 参考文章: (1)oracle Plsql 执行update或者delete时卡死问题解决办法 (2)https://ww ...

  6. Linq无聊练习系列7----Insert,delete,update,attach操作练习

    /*********************Insert,delete,update,attach操作练习**********************************/             ...

  7. oracle操作错误还原,Oracle delete误操作数据恢复(BBED)

    Oracle delete误操作数据恢复(BBED) 在Oracle中,表数据被错误执行了delete,并 已 提交,如何找回数据呢? 常规的修复方法可以想到 闪回.Rman.impdp . DG . ...

  8. Oracle表的分区update卡着,分区表分区字段的update操作

    默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错--ORA-14402: 更新分区关键字列将导致分区的更改.但是可以通过打开表的r ...

  9. myBatis之update操作的注意事项

    update操作,看似简单实则暗藏玄机. 首先update操作应该是分类的. 第一类,前端传递什么内容,后台随之更新什么内容.前端传递所有字段到后台,后台更新全部字段的值和前端保持一致,null也要更 ...

最新文章

  1. 数据结构---基础概念
  2. 函数指针数组在ARM异常中断处理中的应用
  3. java 深拷贝_java 深拷贝与浅拷贝机制详解
  4. java_options字符串拼接_java8 StringJoiner拼接字符串
  5. Java 中判断一个字符串是否包含另外一个字符串的方法
  6. jenkins部署java项目之小白的笔记
  7. 哈工大威海算法设计与分析_【斯坦福算法分析和设计02】渐进分析
  8. 【算法笔记】图文结合彻底搞懂后缀数组
  9. java经典sql笔试题
  10. 炫界 (392) -(持法延迟)_火爆手游必不可少低延迟蓝牙耳机,双11精品优质蓝牙耳机推荐...
  11. 营养电子秤控制板方案
  12. 电子病历系统源码 医院管理系统源码
  13. 【Linux】SCP 拷贝命令
  14. 如何使用 CSS 颜色?
  15. 华为机试 - HJ10 字符个数统计
  16. 【合天网安】DoraBox之文件包含及任意文件读取漏洞
  17. 香港中文大学计算机系直博面试经验
  18. gitHub常用命令笔记
  19. C++使用OPENSSL进行RSA加密,java服务端解密
  20. Y combinator初创加速器2020冬季团队大赏——最好与最坏的时代

热门文章

  1. Windows10家庭版安装Docker Desktop(非Docker Toolbox)
  2. json转成类对象转成xml全过程
  3. 利用微信的weui框架上传、预览和删除图片
  4. 1.4版本上线(第八次会议)
  5. 004-docker常用命令[二]-容器操作ps,top,attach,export
  6. 洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 乱搞
  7. 6月份美国域名总量新增近5.4万个 环比减少51%
  8. Access和sql server的语法区别
  9. 医疗大数据处理流程_我们需要数据来大规模改善医疗流程
  10. 图像离群值_什么是离群值?