oracle統計信息的鎖定與解鎖


image


(一)問題背景

最近在對一個大約200萬行數據的表查看執行計划時,發現存在異常,理論上應該返回100多萬筆數據的,但是執行計划只返回了2條數據,比較奇怪,稍微思考,肯定是統計信息出問題了。

explain plan for select * from TABLE_***_NOTIFY where be_id is not null;

clipboard

查看表的統計信息,發現最后一次收集統計信息是在2018年4月22日,已經是2年前的信息了,已經很久沒有收集統計信息了

clipboard


(二)Oracle什么情況下會自動收集統計信息

Oracle收集失效的統計信息的策略:自上次自動統計信息收集作業完成之后,如果DBA_TAB_MODIFICATIONS中記錄的INSERT+UPDATE+DELETE所影響的行記錄之和超過了DBA_TABLES中目標表記錄數的10%,或者是自上次統計信息收集完成之后目標表執行過truncate操作,那么Oracle會認為目標表的統計信息已經失效,自動統計信息收集作業就會對目標表重新收集統計信息。


(三)Oracle為什么沒有自動收集統計信息

根據上述策略,理論上肯定是要收集統計信息的,那么這里為什么沒有收集統計信息呢?

首先想到的是統計信息被關閉了。根據個人經驗,在某些公司高並發的業務系統中,統計信息的收集可能會引發異常等待事件,因此會把統計信息關閉,之后要么手動根據DBA_TAB_MODIFICATIONS編寫腳本來收集,要么一直不收集,直到執行計划有問題再對單表收集。

那么是不是Oracle的自動統計信息收集功能關閉了呢?查詢確認,發現自動統計信息是開啟的。

SELECT WINDOW_NAME,AUTOTASK_STATUS,OPTIMIZER_STATS,SEGMENT_ADVISOR,SQL_TUNE_ADVISOR FROM DBA_AUTOTASK_WINDOW_CLIENTS ;

clipboard

既然自動收集統計信息是開啟的,那么只有可能是該表的統計信息被鎖定了,可以嘗試手動收集統計信息

SQL> exec dbms_stats.gather_table_stats(ownname => '***',tabname => '***',cascade => true);

發現有如下報錯,可以確定是統計信息被鎖了,由於過去很久,不知道之前是誰把統計信息給鎖了,系統也多次換人接手,已經無從查起。

clipboard


(四)解決辦法

既然是統計信息鎖了導致無法收集新的統計信息,那么接下來只要解鎖並重新收集統計信息即可,方法如下:

--解鎖某個表的統計信息
EXEC dbms_stats.unlock_table_stats(ownname => '***',tabname => '***'); 

--重新收集某個表的統計信息
EXEC dbms_stats.gather_table_stats(ownname => '***',tabname => '***',cascade => true);


還存在一個問題,數據庫中可能還存在其他的表也被鎖定了統計信息,我如何確認數據庫中哪些表的統計信息被鎖定:

SELECT owner,table_name,stattype_locked FROM DBA_TAB_STATISTICS a WHERE a.stattype_locked IN ('ALL','DATA','CACHE')

備注:stattype_locked為空代表統計信息未鎖定。


【完】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM