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';
?
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 操作 注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DB2数据库v11.5下载地址
- 下一篇: Robot Framework 教程 (