Oracle数据库的数据统计(Analyze)
http://blog.chinaunix.net/space.php?uid=10597892&do=blog&id=2946800
Oracle數據的優化器有兩種優化方法:基于代價/成本的優化器(CBO)和基于規則的優化器(RBO),系統在對SQL進行優化的時候,使用哪種優化決定于初始化參數OPTIMIZER_MODE,該參數值可以設置為:CHOOSE,RULE,ALL_ROWS,FIRST_ROWS。在Oracle9i以后的版本中還引入了新的優化參數命令:FIRST_ROWS_1,FIRST_ROWS_10, FIRST_ROWS_100,FIRST_ROWS_1000。(具體的說明將在以后的BLOG文章中介紹)Oracle推薦使用CBO優化方式,當系統使用CBO方式優化SQL的時候,要使其執行計劃達到最優化,需要定期執行數據統計,必須保證統計數據的及時性,否則可能得不到預計的優化效果,或與預計的優化效果相差懸殊。
要對數據庫對象生成統計信息,可以有以下方法:
完全統計法:analyze table table_name compute statistics;
抽樣估計法:analyze table table_name estimate statistics sample 30 percent;
對表使用抽樣估計法要比完全統計法的生成統計速度要快,但是統計數據可能不夠精確。在開發過程中,我們可能要涉及很多的表的查詢,而我們在使用CBO的時候就需要經常對這些表執行分析統計,得到CBO所需要的統計數據。通常有以下幾種方法來收集統計信息:
1.導出所有需要分析的表的語句腳本,然后執行該腳本。
SQL> SPOOL OFF;
SQL> SPOOL C:\ANALYZE_TAB.SQL
SQL> SELECT 'ANALYZE TABLE '||OWNER||'.'||TABLE_NAME||' COMPUTE STATISTICS;' FROM ALL_TABLES WHERE OWNER NOT IN ('SYS','SYSTEM');
然后調整一下腳本,并執行:
SQL>@C:\ANALYZE_TAB.SQL
可以將該腳本放到服務器端并設置自動執行。
2.使用Oracle提供的過程:DBMS_DDL.ANALYZE_OBJECT,該過程可以對某個特定用戶的特定表執行統計。例如:
完全統計:
SQL>execute dbms_ddl.analyze_object('TABLE','DINYAR','DINYA_TEST01','COMPUTE');
PL/SQL procedure successfully completed
SQL>
50%抽樣統計
SQL>execute dbms_ddl.analyze_object('TABLE','DINYAR','DINYA_TEST01','ESTIMATE',NULL,50);
PL/SQL procedure successfully completed
SQL>
可以使用該過程,生成分析統計數據庫對象的腳本,并定時執行該腳本。
3.使用Oracle提供的過程DBMS_UTILITY.ANALYZE_SCHEMA該過程執行對某個特定用戶下的TABLE,INDEX和CLUSTER的分析統計。如:
完全統計SCHEMA下的所有對象:
SQL> execute dbms_utility.analyze_schema('DINYAR','COMPUTE');
PL/SQL procedure successfully completed
Executed in 6.9 seconds
SQL>
抽樣50%統計SCHEMA下的所有對象:
SQL> execute dbms_utility.analyze_schema('DINYAR','ESTIMATE',NULL,50);
PL/SQL procedure successfully completed
Executed in 1.933 seconds
SQL>
從執行的時間上看,抽樣統計的時間要比完全統計所花費的時間要短,執行的更快。
4.使用Oracle提供的過程DBMS_UTILITY.ANALYZE_DATABASE,該過程可以對整個數據庫中的對象進行分析統計。但需要當前登陸用戶具備足夠的權限,否則系統將提示出錯。如:
SQL> execute dbms_utility.analyze_database('COMPUTE');
begin dbms_utility.analyze_database('COMPUTE'); end;
ORA-20000: You have insufficient privileges for an object in this database.
ORA-06512: at "SYS.DBMS_UTILITY", line 501
ORA-06512: at line 1
SQL>
改換有DBA權限的用戶登陸:
SQL> execute dbms_utility.analyze_database('COMPUTE');
begin dbms_utility.analyze_database('COMPUTE'); end;
ORA-30657: operation not supported on external organized table
ORA-06512: at "SYS.DBMS_DDL", line 179
ORA-06512: at "SYS.DBMS_UTILITY", line 497
ORA-06512: at line 1
SQL>
從上面的錯誤信息可以看出,不支持對外部表的分析統計,查看Oracle的解決辦法,Oracle稱不要試圖做這項操作。
DBMS_UTILITY.ANALYZE_DATABASE的抽樣分析統計和上例中類似。
5.使用Oracle提供的過程:DBMS_STATS,該包中的過程dbms_stats.gather_index_stats,
DBMS_STATS.gather_table_stats,DBMS_STATS.gather_schema_stats,DBMS_STATS.gather_database_stats,DBMS_STATS.gather_system_stats分別執行對索引、表、某個schema、數據庫、系統的統計信息。例如:
SQL> execute dbms_stats.gather_table_stats('DINYAR','DINYA_TEST01');
PL/SQL procedure successfully completed
Executed in 0.29 seconds
SQL> execute dbms_stats.gather_schema_stats('DINYAR');
PL/SQL procedure successfully completed
Executed in 7.07 seconds
SQL>
(該包中還有其他的一些過程,可以對數據庫的對象進行操作,不在這里討論。)
6.定時執行分析統計,使用DBMS_JOB包,創建一個JOB,定時執行過程,對數據庫對象進行分析統計:
PL/SQL procedure successfully completed
Executed in 0.581 seconds
job_num
---------
41
SQL>
這樣就可以在數據庫中定時執行數據庫對象統計信息的收集,保證了使用CBO優化器優化時優化路徑的準確性。
Oracle提供的包中的其他功能請參考文檔:<<Oracle9i Supplied PL_SQL Packages and Types Reference >>
?
Defrag the below tables and indexes might also help.
?
??????????????????????????????????????????? Segment????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???????????Reclaimable space(MB)? Allocated????????? USED_SPACE
| ? | GCD | LOANTRADE_EOD | 122.27 | 704.27 | 582.01 | TABLE | ||||||
| GCD | SWAPTRADE_EOD | 97.92 | 536.00 | 438.08 | TABLE | |||||||
| GCD | SYS_C00314668 | 93.62 | 232.00 | 138.38 | INDEX | |||||||
| GCD | PTRSLIQUIDATION_EOD | 82.66 | 456.00 | 373.34 | TABLE | |||||||
| GCD | PF_LIQUDATION_DETAILS_EOD | 57.15 | 176.00 | 118.85 | TABLE | |||||||
| GCD | SYS_C00314931 | 49.54 | 104.00 | 54.46 | INDEX | |||||||
| GCD | SYS_C00314466 | 48.92 | 120.00 | 71.08 | INDEX | |||||||
| GCD | UK1_ASSETPRICE_RECON | 47.71 | 144.00 | 96.29 | INDEX | |||||||
| GCD | ASSETPRICE_RECON_IDX2 | 45.98 | 88.00 | 42.02 | INDEX | |||||||
| GCD | PTRSLIQUIDATION_EOD_CD_IDX | 40.30 | 137.40 | 97.10 | INDEX | |||||||
| GCD | ASSETPRICE_RECON_IDX3 | 40.18 | 80.00 | 39.82 | INDEX | |||||||
| GCD | PTRSPOSITION_LFID_CD_IDX_EOD | 38.20 | 62.22 | 24.01 | INDEX | |||||||
| GCD | PTRSLIQUIDATION_EOD_PD_IDX | 31.29 | 113.39 | 82.11 | INDEX | |||||||
| GCD | ASSETPRICE_RECON_IDX1 | 27.73 | 72.00 | 44.27 | INDEX | |||||||
| GCD | UK1_ASSETPRICE | 25.55 | 112.00 | 86.45 | INDEX | |||||||
| GCD | PORTFOLIOPOSITION_DETAILS_EOD | 25.09 | 53.00 | 27.91 | TABLE | |||||||
| GCD | PTRSPOSITION_EOD | 24.99 | 104.00 | 79.01 | TABLE | |||||||
| GCD | ASSETPRICE_RECON | 23.24 | 160.00 | 136.76 | TABLE | |||||||
| GCD | LOANTRADE_EOD_CD_IDX | 23.23 | 73.75 | 50.52 | INDEX | |||||||
| GCD | PTRSLIQUIDATION_EOD_SD_IDX | 14.97 | 96.00 | 81.03 | INDEX | |||||||
總結
以上是生活随笔為你收集整理的Oracle数据库的数据统计(Analyze)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 足厥阴肝经
- 下一篇: java 中的路径问题总结(绝对路径与相