分割槽表truncate慢處理
背景
某使用者一套業務系統反饋晚上跑批非常慢,後來客戶發現是在處理truncate分割槽表分割槽的時候慢。
初步分析
truncate的實質是在不修改資料塊的情況下,透過修改segment header的data_object_id,hwm,extent map,aux map等資訊來實現清空表的目的,其中還涉及資料字典基表以及L1、L2點陣圖塊的修改,所以說truncate操作只是儲存資料的資料塊沒有產生任何redo和undo,但是segment header,點陣圖塊,資料字典基表還是會產生redo和undo。一般來說是很快的。
初步思路
首先truncate這個動作本身是非常快的,只是更新資料字典資訊,不涉及清除表的真正資料。
思路1:資料庫是否存在異常等待事件
思路2:在不知道具體原因的情況下對會話進行10046跟蹤。(通用方法)
排查步驟
登入客戶生產環境,檢視等待事件,發現沒有異常等待事件
對truncate語句會話進行10046跟蹤
對10046會話進行跟蹤:
SQL ID: f63rfdamawhv2 Plan Hash: 1605285479 select ts#, file#, block# from seg$ where type# =11 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 2010 0.04 0.05 0 0 0 0 Execute 2010 0.05 0.06 0 0 0 0 Fetch 2010 526.17 526.63 0 52736370 0 2010 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 6030 526.27 526.75 0 52736370 0 2010 Misses in library cache during parse: 1 Optimizer mode: CHOOSE Parsing user id: SYS (recursive depth: 1) Number of plan statistics captured: 3 Rows (1st) Rows (avg) Rows (max) Row Source Operation ---------- ---------- ---------- --------------------------------------------------- 1 1 1 TABLE ACCESS FULL SEG$ (cr=26237 pr=0 pw=0 time=429271 us cost=5177 size=16 card=1)
有異常語句發現:去mos查詢select ts#, file#, block# from seg$ where type# =11
匹配bug:
建議客戶優先設定隱含引數:
ALTER SYSTEM SET "_drop_stat_segment" =1;
發現客戶已經設定此引數,說明此設定此引數無效!
既然隱含引數設定無效,那麼嘗試透過打補丁的方式去規避此問題。
打完補丁後,有一個小插曲。叢集啟動,asm磁碟帶不起來,各位知道這是啥問題不?
驗證
打完補丁後驗證truncate速度
alter table ADM.ADM_D_ACCOUNT_DETAIL TRUNCATE PARTITION PART_20220609
打完補丁後truncate分割槽表為3s
未打補丁之前truncate分割槽表為8分鐘
結論
當我們排查問題沒有思路的時候,不妨嘗試下10046跟蹤去細細檢視執行此語句的會話全過程,或許就會明朗了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23825935/viewspace-2917161/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PLSQL根據分割槽表的分割槽名批次truncate分割槽SQL
- 【實驗】【PARTITION】RANGE分割槽表截斷表分割槽(Truncate Partition)
- 海量資料處理_表分割槽
- 分割槽表split操作及maxvalue處理
- MySQL分表後原分割槽表處理方案MySql
- 海量資料處理_表分割槽(分割槽自動維護與歷史分割槽歸檔)
- 海量資料處理_表分割槽(線上重定義)
- 分割槽表中全域性及本地分割槽索引什麼時候會失效及處理索引
- oracle分割槽表和分割槽表exchangeOracle
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- oracle分割槽表和非分割槽表exchangeOracle
- 分割槽表中全域性及本地分割槽索引什麼時候會失效及處理[final]索引
- Oracle分割槽表及分割槽索引Oracle索引
- INTERVAL分割槽表鎖分割槽操作
- var分割槽不足%15問題處理
- 全面學習分割槽表及分割槽索引(9)--刪除表分割槽索引
- 全面學習分割槽表及分割槽索引(11)--合併表分割槽索引
- 全面學習分割槽表及分割槽索引(12)--修改list表分割槽索引
- 學習筆記】分割槽表和分割槽索引——新增表分割槽(二)筆記索引
- 如何查詢分割槽表的分割槽及子分割槽
- 定期truncate 歷史間隔分割槽INTERVAL PARTITION
- 使用split對分割槽表再分割槽
- 簡單ORACLE分割槽表、分割槽索引Oracle索引
- rebuild分割槽表分割槽索引的方法Rebuild索引
- 分割槽表及分割槽索引建立示例索引
- MySQL分割槽, 子分割槽以及對錄入Null值的處理情況MySqlNull
- 全面學習分割槽表及分割槽索引(10)--交換分割槽索引
- 全面學習分割槽表及分割槽索引(8)--增加和收縮表分割槽索引
- 【學習筆記】分割槽表和分割槽索引——分割槽表的其他管理(三)筆記索引
- 範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別
- 【MYSQL】 分割槽表MySql
- postgresql分割槽表SQL
- Oracle 表分割槽Oracle
- MySQL 分割槽表MySql
- oracle分割槽表Oracle
- MySQL分割槽表MySql
- oracle表分割槽Oracle
- Oracle 分割槽表Oracle