日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle 大规模 delete,update 操作 注意事项

發布時間:2023/12/9 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 操作 注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。