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

2021-03-31 08:56:58 字數 3697 閱讀 8622

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 ***pute 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,***pute,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');

***mit;

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 資料庫的統計資料及其生成方式 oracle 資料庫的 pl sql 語句執行的優化器,有基於代價的優化器 cbo 和基於規則的優化器 rbo rbo 的優化方式,依賴於一套嚴格的語法規則,只要按照規則寫出的語句,不管資料表和索引的內容是否發生變化,不會影響 pl sql 語句的 執行計...