客戶現場總是有人抱怨oracle效能差,而發現大多數問題都是由於oracle資料字典中的元資料過期,導致oracle查詢時候無法使用索引,繼而導致的效能低下。
在此需要先解釋一下「oracle優化器」。oracle有兩種優化器:基於規則的優化器(rbo,rule based optimizer),和基於成本的優化器(cbo, cost based optimizer)。
oracle公司已經不再發展「基於規則的優化器」技術,換句話說,這種優化技術被淘汰了。它的基本原理是只要你按照一套嚴格的使用規則去寫sql語句,無論資料表中的內容怎樣,也不會影響到你的「執行計畫」,也就是說對資料不「敏感」,
「基於成本的優化器」才是當前的主流,當前oracle的許多新技術也都是基於cbo的,如星型連線排列查詢,雜湊連線查詢,和並行查詢等。cbo計算各種可能「執行計畫」的「成本」,即cost,從中選用cost最低的方案,作為實際執行方案。各「執行計畫」的cost的計算根據,依賴於資料表中資料的統計分布,oracle資料庫本身對該統計分布並不清楚,須要分析表和相關的索引,才能蒐集到cbo所需的資料。
一般而言,基於成本的優化器所選擇的「執行計畫」都會比基於規整的優化器的「執行計畫」好,而且相對而言,基於成本的優化器對程式設計師的要求也簡單些,節省了程式設計師為了從多個可能的「執行計畫」中選擇乙個最優的方案而花費的除錯時間,
舉個最簡單的例子說明基於成本的優化器是如何影響最後的執行方案,比如有乙個表a,現在寫了select * from a where a.condition = ***x;。oracle現在煩嘀咕了,到底是用a.condition索引來查詢,還是進行全表查詢呢?如果這個表只有50條記錄,當然直接用全表掃瞄效果更好;但是如果這個表有50萬條記錄當然要用索引。而oracle本身並不清楚這個表到底有50條記錄還是50萬條記錄(oracle不會笨到每次執行前都去select count(*) from a一下,這樣效率太低了)。那最好有乙個字典表來保留這些資料,當這個表每天insert操作很多就每天來更新字典表中的這些資料(表的大小--50條或者50萬條);又如果這個表是針對資料倉儲的,雖然表很大但是總量相對穩定,則每週或者每月來更新一次。(注意:本例子是最最最簡單的情況,僅僅為了說明基本道理,實際情況oracle會做很多任務作,同時也會帶來的效能改善和效能惡夢)
下面再來說說如何診斷和解決這些問題,我這裡僅僅給出最簡單的診斷以及維護方案,既便於大家理解,也便於學習,而且這最簡單的方法也確實可以解決大多數問題。
當你已經確定建過索引,但是效能又出奇的差,你可以根據如下步驟來進行:
1、判斷是否字典表失效。
select table_name,num_rows,last_analyzed from user_tables;
如果當你看到又大量的num_rows沒有數值,或者last_analyzed是很久以前的日子了,那麼恭喜你,你已經找到問題的根源了,也無需再去查什麼user_indexes表了,user_tables中的資料有問題,user_indexes肯定也是不正確的。
2、維護資料字典。
analyze table ***x compute statistics for all indexes;
或者:analyze table ***x estimate statistics sample 5 percent;
可以把需要要分析的表乙個乙個的這麼執行。
oracle 9i以後都提供了系統維護包,可以一次執行乙個schema的所有內容:exec dbms_utility.analyze_schema('***xschema','estimate', estimate_percent => 5); estimate_percent是指分析時候的取樣百分比,百分比越小分析的越快,但是精度稍微差點。
3、執行乙個sql驗證一下,一般問題也就解決了。
上述的初步提及了基於成本的優化器的原理,以及oracle是如何使用基於成本的優化器來生成其執行計畫,並給出了最簡單的維護手段,雖然簡單,但是解決80%的常見問題。
關於資料字典
1 什麼是資料字典 data dictionary 應該承認,每個人對資料字典的理解有不同的地方,因為並沒有這方面的標準,下面是三個大同小異的定義 1 資料字典是以資料庫中資料基本單元為單位,按一定順序排列,對其內容作詳細說明的資料集。2 資料字典中存放著系統中所有資料的定義,即對所有資料庫結構的描...
Oracle 資料字典
資料字典包括以下內容 1.所有資料庫schema物件的定義 表,檢視,索引,聚簇,同義詞,序列,過程,函式,包,觸發器 2.資料庫的空間分配和使用情況 3.欄位的預設值 4.完整性約束資訊 5.oracle使用者名稱,角色,許可權等資訊 6.審計資訊 7.其他資料庫資訊 資料字典有4部分組成 內部r...
oracle 資料字典
oracle資料字典 select from user tab columns 檢視使用者列物件 select from user tab comments 檢視使用者表的備註 select from user tab statistics select from all users 所有使用者 s...