一. 说明
如果对大表进行大规模的delete 和update,那么可以注意一下如下说明: (1) 查看执行计划,如果说删除的记录很多,走索引的成本会比全表扫描更大,因为更新数据时还需要做一些约束校验和创建index entry。而且对于多CPU 情况,全表扫描还可以使用并行的特性。 Oracle Parallel Execution(并行执行)http://www.linuxidc.com/Linux/2011-07/38009.htm (2)如果表上有索引,B-Tree 索引可以unusable索引,函数索引则disable 索引,等操作结束之后在rebuild索引。 (3)如果是大规模的delete,那么可能还需要注意一下高水位的问题,在允许的情况下,可以用alter table move 来降低高水位,同时注意rebuild 索引。 Oracle 高水位(HWM: High Water Mark) 说明 http://www.linuxidc.com/Linux/2011-07/38010.htm 如果是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 _PRCODEIDX _STATEIDX _INSERTSYS_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://www.linuxidc.com/Linux/2011-06/37177.htmOracle 10.2.0.4和10.2.0.5 中 OEM bug 8350262Oracle Parallel Execution(并行执行)相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)