ORACLE資料庫的統計資料及其生成方式

2021-04-02 15:09:21 字數 3944 閱讀 5917

oracle 資料庫的統計資料及其生成方式

oracle 資料庫的 pl/sql 語句執行的優化器,有基於代價的優化器( cbo )和基於規則的優化器( rbo )。

rbo 的優化方式,依賴於一套嚴格的語法規則,只要按照規則寫出的語句,不管資料表和索引的內容是否發生變化,不會影響 pl/sql 語句的 " 執行計畫 " 。

cbo 自 oracle 7 版被引入, oracle 自 7 版以來採用的許多新技術都是只基於 cbo 的,如星型連線排列查詢,雜湊連線查詢,反向索引,索引表,分割槽表和並行查詢等。 cbo 計算各種可能 " 執行計畫 " 的 " 代價 " ,即 cost ,從中選用 cost 最低的方案,作為實際執行方案。各 " 執行計畫 " 的 cost 的計算根據,依賴於資料表中資料的統計分布, oracle 資料庫本身對該統計分布是不清楚的,須要分析表和相關的索引,才能蒐集到 cbo 所需的資料。

cbo 是 oracle 推薦使用的優化方式,要想使用好 cbo ,使 sql 語句發揮最大效能,必須保證統計資料的及時性。

統計資訊的生成可以有完全計算法和抽樣估算法。 sql 例句如下:

完全計算法: analyze table abc compute statistics;

抽樣估算法 ( 抽樣 20%) : analyze table abc estimate statistics sample 20 percent;

對錶作完全計算所花的時間相當於做全表掃瞄,抽樣估算法由於採用抽樣,比完全計算法的生成統計速度要快,如果不是要求要有精確資料的話,盡量採用抽樣分析法。建議對錶分析採用抽樣估算,對索引分析可以採用完全計算。

我們可以採用以下兩種方法,對資料庫的表和索引及簇表定期分析生成統計資訊,保證應用的正常效能。

1. 在系統設定定時任務,執行分析指令碼。

在資料庫伺服器端,我們以 unix 使用者 oracle ,執行指令碼 analyze, 在 analyze 中,我們生成待執行 sql 指令碼,並執行。(假設我們要分析 scott 使用者下的所有表和索引)

analyze 指令碼內容如下:

sqlplus scott/tiger << eof

set pagesize 5000

set heading off

spool analytab.sql

select 'analyze table scott.'||table_name||' estimate statistics sample 20 percent ;' from user_tables ;

spool off

spool analyind.sql

select 'analyze table scott.'||table_name||' estimate statistics sample 20 percent for all indexes;' from user_tables ;

spool off

spool analyze.log

@analytab.sql

@analyind.sql

spool off

exit

在 unix 平台上 crontab 加入,以上檔案,設定為每個月或合適的時間段執行。

2. 利用 oracle 提供的程式包( package )對相關的資料庫物件進行分析。

有以下的程式包可以對錶,索引,簇表進行分析。

type 可以是: table , index , cluster 中其一。

schema 為: table , index , cluster 的所有者, null 為當前使用者。

name 為:相關物件的名稱。

method 是: estimate , compute , delete 中其一,當選用 estimate ,

下面兩項, estimate_rows 和 estimate_percent 不能同

時為空值。

estimate_rows 是:估算的抽樣行數。

estimate_percent 是:估算的抽樣百分比。

method_opt 是:有以下選項,

for table /* 只統計表 */

[for all [indexed] columns] [size n] /* 只統計有索引的表列 */

for all indexes /* 只分析統計相關索引 */

partname 是:指定要分析的分割槽名稱。

1) dbms_ddl.analyze_object(

type varchar2,

schema varchar2,

name varchar2,

method varchar2,

estimate_rows number default null,

estimate_percent number default null,

method_opt varchar2 default null,

partname varchar2 default null ) ;

該儲存過程可對特定的表,索引和簇表進行分析。

例如,對 scott 使用者的 emp 表,進行 50% 的抽樣分析,引數如下:

dbms_ddl.analyze_object('table', 'scott', 'emp', 'estimate', null,50);

2) dbms_utility.analyze_schema (

schema varchar2,

method varchar2,

estimate_rows number default null,

estimate_percent number default null,

method_opt varchar2 default null ) ;

dbms_utility.analyze_database (

method varchar2,

estimate_rows number default null,

estimate_percent number default null,

method_opt varchar2 default null ) ;

其中, analyze_schema 用於對某個使用者擁有的所有 table , index 和 cluster 的分析統計。

analyze_database 用於對整個資料庫進行分析統計。

3) dbms_stats 是在 oracle8i 中新增的程式包,它使統計資料的生成和處理更加靈活方便,並且可以並行方式生成統計資料。在程式包中的以下過程分別分析統計 table , index , schema , database 級別的資訊。

dbms_stats.gather_table_stats

dbms_stats.gather_index_stats

dbms_stats.gather_schema_stats

dbms_stats.gather_database_stats

在這裡,我們以資料庫 job 的方式,定時對資料庫中 scott 模式下所有的表和索引進行分析:

在 sql*plus 下執行:

variable jobno number;

begin

dbms_jobs.submit ( :jobno ,

' dbms_utility.analyze_schema ( "scott", "estimate", null, 20) ; ',

sysdate, 'sysdate+30');

commit;

end;

/ statement processed.

print jobno

jobno

-------------

16 以上作業,每隔乙個月用 dbms_utility.analyze_schema 對使用者 scott 的所有表,簇表和索引作統計分析

oracle查詢統計資料

oracle 按每天,每週,每月,每季度,每年查詢統計資料 按天統計 select count dataid as 每天運算元量,sum from tablename group by trunc createtime,dd 按自然周統計 select to char date,iw sum fro...

oracle範圍統計資料

需求 充值總筆數 筆數 單筆0 200元 筆數 單筆201 300元 筆數 單筆301 500元 筆數 單筆501元及以上 參照範例 需求 統計wait order表中的工單總數 未處理工單總數 已完成工單總數 未完成工單總數。表結構 為了舉例子方便,wait order表只有兩個字段,分別是id ...

ORACLE資料庫的統計資料及其生成方式

oracle資料庫的pl sql語句執行的優化器,有基於代價的優化器 cbo 和基於規則的優化器 rbo rbo的優化方式,依賴於一套嚴格的語法規則,只要按照規則寫出的語句,不管資料表和索引的內容是否發生變化,不會影響pl sql語句的 執行計畫 cbo自oracle 7版被引入,oracle自7版...