Oracle 收集物件統計資訊

2021-06-12 03:28:13 字數 3801 閱讀 8672

一. 概述

oracle9i之前,由dba負責收集物件統計資訊。預設情況下,資料庫不提供物件統計資訊。到了oracle10g,在建立資料庫的時候,就建立了乙個定期收集物件統計資訊的作業並進行排程。以便擁有最新的物件統計資訊,因為表時刻都在變化,假如某一時刻插入了資料,物件統計資訊也需要更新的。

二. 收集物件

oracle是用工具包dbms_stats來收集統計資訊,根據不同的用途,收集物件也不相同。可以針對整個資料庫,資料字典,使用者或者單個表,索引進行收集。如下所示:

gather_database_stats:收集資料庫物件統計資訊

gather_dictionary_stats:收集資料字典物件統計資訊

gather_schema_stats:收集整個模式的所有物件統計資訊

gather_table_stats:收集表的物件統計資訊

gather_index_stats:收集索引的物件統計資訊

三. 引數說明

針對不同的收集物件,有不同的引數,如下圖:

引數可以被分為3類:指明目標物件,指明收集選項和指明覆蓋當前統計資訊之前是否備份

1. 目標物件

用來指定要收集統計資訊的物件。

ownname:模式名稱(也就是使用者名稱)

indname:索引名稱

tabname:表名稱

partname:分割槽或者子分割槽名稱,不指定的話收集所有分割槽,預設為null

comp_id:元件id

granularity:分割槽物件的統計級別,可接受值如下圖,到oracle9i為止,預設值為default,從oracle10g開始預設值為auto

cascade:是否收集索引的統計資訊,可接受true,false和dbms_stats.auto_cascade(乙個常量,取值為null,意思是讓資料庫引擎決定是否收集)。oracle9i之前預設值為false,從oracle10g開始預設值為dbms_stats.auto_cascade。

gather_sys:是否收集sys使用者的統計資訊,可接受true,false。預設值為false。

gather_temp:是否收集臨時表的統計資訊,可接受true,false。預設值為false。

options:處理物件以及處理方式

objlist:根據引數options的不同值,返回被處理物件的列表。

force:是否覆蓋鎖定物件資訊

obj_filter_list:根據條件進行統計物件資訊,比如只統計以c打頭的表的統計資訊。

2. 收集選項

指明收集統計資訊的方式,收集哪類列的統計資訊,以及與之相關的sql游標是否失效。

estimate_percent:是否取樣收集統計資訊,可用值從0.000001到100的乙個百分比值。100等同於null,表示不取樣收集。需要理解一點,這個引數僅指定取樣的最小百分比,如果資料庫覺得這個取值太小,會自動增大該值。oracle9i之前預設值為null,oracle10g預設為dbms_stats.auto_sample_size(乙個常量,為0,表示由儲存過程決定取樣大小),要加速統計過程,可取乙個較小的取樣值,比如0.5%或者0.1%。

block_sample:是否採用資料塊取樣(非資料塊取樣就是資料行取樣),資料塊取樣更快速,資料行取樣更準確。只有確信資料是隨機均勻分布的,才可以使用資料塊取樣。true:資料塊取樣,false:資料行取樣,預設false。

method_opt :是否收集直方圖統計資訊,如果收集,取樣的最大桶數。可取值如下:

null或者空字串:只收集列統計資訊,不收集直方圖統計資訊。

收集列統計資訊和所有列的直方圖統計資訊,比如:for all columns size 200,表示對每一列最多取樣200個桶。

只收集某一些列的直方圖統計資訊,比如:for columns size 200 col1,col2,col3,col4 size 1,col5 size 1。只對這5列收集直方圖資訊,而且只對前3列最多取樣200個桶。

oracle9i預設值為 for all columns size 1,oracle10g後預設值為 for all columns size auto。

degree:物件統計時所用的從屬程序數量,預設值為null

no_invalidate:與收集的物件相關的游標是否失效,可用值為true,false和dbms_stats.auto_invalidate。oracle9i預設值為false(相關游標立即失效),oracle10g之後預設為dbms_stats.auto_invalidate(游標過一段時間失效,避免集中重新解析游標)

四. 引數設定

10g方式:(不支援分級別設定,比如資料庫級別,使用者級別)

在oracle10g中可以修改如下引數:cascade, estimate_percent, degree, method_opt, no_invalidate和granularity

檢視某乙個引數的值:

execute dbms_output.put_line(dbms_stats.get_param(pname => 'cascade'))
修改某乙個引數的值:

execute dbms_stats.set_param(pname => 'cascade', pval => 'true')
全部重新恢復預設值:

execute dbms_stats.reset_param_defaults
11g方式: (支援分級別設定)

除開可以修改10g可以修改的引數外,還加3個引數:publish, incremental, stale_precent。由於在每個級別都可以為同一引數設值,比如資料庫級別設定cascade為true,使用者級別設定為false,表級別設定成auto。那麼應該參考哪乙個值呢?這裡採用的是明細優先,先找錶級別,再找使用者級別,最後找資料庫級別。

比如:

begin

dbms_stats.set_database_prefs(pname => 'cascade', pvalue => 'dbms_stats.auto_cascade');

dbms_stats.set_schema_prefs(ownname => 'scott', pname => 'cascade', pvalue => 'false');

dbms_stats.set_table_prefs(ownname => 'scott', tabname => 'emp', pname => 'cascade', pvalue => 'true');

endselect dbms_stats.get_prefs(pname => 'cacade') as global,

dbms_stats.get_prefs(pname => 'cascade',

ownname => 'scott',

tabname => 'emp') as emp,

dbms_stats.get_prefs(pname => 'cascade',

ownname => 'scott',

tabname => 'dept') as dept

from dual;

結果如下:

Oracle統計資訊收集

統計資訊收集 1 建立分析表 cd oracle home rdbms admin sqlplus as sysdba utlxplan.sql 2 為了方便,可以建立乙個同義表 預設情況下只有sys使用者可以使用 sql create public synonym plan tables for ...

Oracle統計資訊收集失敗案例

摘要 有個資料庫顯示作業按照正常時間點執行,但是統計資訊並未更新,導致資料庫統計資訊陳舊,產生大量錯誤的執行計畫。查詢是否被鎖 解決方法 execute dbms scheduler.close window saturday window 再次檢視作業狀態 select window name,a...

Oracle修改統計資訊收集計畫時間

一 查詢收集統計資訊計畫 select from dba scheduler windows t1,dba scheduler wingroup members t2 where t1.window name t2.window name and t2.window group name in ma...