【實驗】【analyze】分析特定使用者的表和索引

secooler發表於2009-08-29
1.使用analyze方法對特定使用者的表和索引進行分析指令碼如下
ora10g@testdb183 /home/oracle$ cat analyze_schema.sql
set pagesize 6000
set heading off
spool analytab.sql
select 'analyze table '||table_name||' estimate statistics sample 20 percent;' from user_tables;
spool off
spool analyind.sql
select 'analyze table '||table_name||' estimate statistics sample 20 percent for all indexes;' from user_tables;
spool off
spool analyze.log
@analytab.sql
@analyind.sql
spool off

2.使用方法,進入到sqlplus介面
ora10g@testdb183 /home/oracle$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.3.0 - Production on Sat Aug 29 20:16:29 2009

Copyright (c) 1982, 2006, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options

3.連線到待分析的使用者,這裡是sec使用者
sys@ora10g> conn sec/sec
Connected.

4.使用“@”符號呼叫上面的analyze_schema.sql指令碼,執行過程如下(這個使用者下只有兩張表)
sec@ora10g> @analyze_schema.sql

analyze table T_PARENT estimate statistics sample 20 percent;
analyze table T_CHILD estimate statistics sample 20 percent;


analyze table T_PARENT estimate statistics sample 20 percent for all indexes;
analyze table T_CHILD estimate statistics sample 20 percent for all indexes;


Table analyzed.


Table analyzed.


Table analyzed.


Table analyzed.

sec@ora10g>

5.上面的指令碼使用的是analyze方法進行分析的,analyze方法不支援“並行”操作,下面演示一下使用dbms_stats.gather_schema_stats方法使用4並行對sec使用者的10%資料進行分析的過程。
sec@ora10g> exec dbms_stats.gather_schema_stats(OWNNAME=>'SEC',ESTIMATE_PERCENT=>10,DEGREE=>4,cascade=>true);

PL/SQL procedure successfully completed.

如果想對SEC使用者中所有表使用DBMS_STATS.GATHER_TABLE_STATS方法進行分析,可以參考如下我寫的一個語句(所有能節省DBA寶貴時間的嘗試都應該被鼓勵):
SET lin 300
SET head off
SELECT    'execute DBMS_STATS.GATHER_TABLE_STATS(ownname=>'
       || ''''
       || owner
       || ''''
       || ',tabname=>'
       || ''''
       || table_name
       || ''''
       || ',method_opt=>'
       || ''''
       || 'FOR ALL COLUMNS SIZE 254'
       || ''''
       || ',DEGREE=>4,cascade=>true);'
  FROM dba_tables
 WHERE dba_tables.owner = 'SEC';


6.小結
對錶和索引的定期分析有利於Oracle的CBO得到正確的執行計劃,提高系統的效能。是DBA日常維護中必做的內容。
analyze和dbms_stats兩種方法都可以完成分析的任務,如果在資源可用,並且待分析資料較大的情況下可以考慮使用dbms_stats加並行的方法進行處理。

上面只是演示了一種非常簡單的用法,更多的analyze方法請參考Oracle官方文件《ANALYZE》


更多的DBMS_STATS方法,請參考Oracle官方文件《103  DBMS_STATS》http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_stats.htm#CIHBIEII


-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-613551/,如需轉載,請註明出處,否則將追究法律責任。

相關文章