http://space.itpub.net/35489/viewspace-608036
1、什么是STATISTICS:優(yōu)化統(tǒng)計(jì)信息是為了更詳細(xì)的描述數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)對(duì)象而收集的數(shù)據(jù),這些信息被用于為sql語(yǔ)句選擇最優(yōu)的執(zhí)行計(jì)劃。優(yōu)化統(tǒng)計(jì)信息包括的項(xiàng)有:
Table statistics(表統(tǒng)計(jì)信息):Number of rows、Number of blocks、Average row length;
Column statistics(列統(tǒng)計(jì)信息):Number of distinct values (NDV) in column、Number of nulls in column、Data distribution (histogram);
Index statistics(索引統(tǒng)計(jì)信息):Number of leaf blocks、Levels、Clustering factor;
System statistics(系統(tǒng)統(tǒng)計(jì)信息):I/O performance and utilization、CPU performance and utilization。
其中表、列和索引統(tǒng)計(jì)信息都可以通過(guò)統(tǒng)計(jì)信息自動(dòng)收集功能來(lái)收集,系統(tǒng)統(tǒng)計(jì)信息在Oracle 10g中只能通過(guò)手動(dòng)收集來(lái)完成。
2、如何得到STATISTICS:Orcale 10g中,STATISTICS由GATHER_STATS_JOB作業(yè)收集得到,只有當(dāng)數(shù)據(jù)庫(kù)對(duì)象沒(méi)有統(tǒng)計(jì)信息或者統(tǒng)計(jì)信息已經(jīng)過(guò)期(Oracle 10G中是否過(guò)期的標(biāo)準(zhǔn)是數(shù)據(jù)庫(kù)對(duì)象被修改的記錄行數(shù)超過(guò)10%,該信息由Modification Monitoring來(lái)追蹤完成)時(shí)才對(duì)該對(duì)象進(jìn)行信息統(tǒng)計(jì),該作業(yè)在數(shù)據(jù)庫(kù)創(chuàng)建或升級(jí)時(shí)由Scheduler自動(dòng)創(chuàng)建,這些作業(yè)可以從視圖DBA_SCHEDULER_JOBS中查到。
如:SELECT d.owner,d.job_name,d.PRogram_name,d.schedule_type,d.comments FROM DBA_SCHEDULER_JOBS d
結(jié)果:
默認(rèn)情況下,Scheduler在維護(hù)窗口(maintenance window,默認(rèn)啟動(dòng)時(shí)間為周內(nèi)晚上10:00至次日早上6:00及整個(gè)周六周日)打開(kāi)時(shí)運(yùn)行GATHER_STATS_JOB作業(yè),作業(yè)GATHER_STATS_JOB則是通過(guò)調(diào)用系統(tǒng)內(nèi)部過(guò)程DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC來(lái)完成信息統(tǒng)計(jì)的,該過(guò)程可根據(jù)數(shù)據(jù)庫(kù)對(duì)象統(tǒng)計(jì)信息需求的優(yōu)先級(jí)(即數(shù)據(jù)庫(kù)對(duì)象被修改的多少)按先后順序來(lái)完成統(tǒng)計(jì)信息收集任務(wù)。GATHER_STATS_JOB作業(yè)是否隨維護(hù)窗口的關(guān)閉而關(guān)閉則由屬性stop_on_window_close決定,stop_on_window_close的默認(rèn)值為T(mén)RUE,此時(shí)GATHER_STATS_JOB作業(yè)隨維護(hù)窗口的關(guān)閉而關(guān)閉。統(tǒng)計(jì)信息的收集是資源相當(dāng)密集的工作,因此您可能希望確保它不影響數(shù)據(jù)庫(kù)的正常操作。
統(tǒng)計(jì)信息收集還可由過(guò)程DBMS_STATS.GATHER_DATABASE_STATS應(yīng)用GATHER AUTO選項(xiàng),來(lái)完成,與系統(tǒng)地內(nèi)部過(guò)程DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC相比,DBMS_STATS.GATHER_DATABASE_STATS不區(qū)分?jǐn)?shù)據(jù)庫(kù)對(duì)象統(tǒng)計(jì)信息需求的優(yōu)先級(jí)。
非默認(rèn)情況時(shí),Oracle10g可通過(guò)設(shè)置初始化參數(shù) STATISTIC_LEVEL,來(lái)控制是否啟用統(tǒng)計(jì)信息自動(dòng)收集功能。STATISTIC_LEVEL參數(shù)的信息如(表-1):
參數(shù)類型 String
語(yǔ)法 STATISTICS_LEVEL = {ALL | TYPICAL | BASIC}
默認(rèn)值 TYPICAL
參數(shù)類別 動(dòng)態(tài)ALTER session,ALTER SYSTEM
(表-1)
該參數(shù)用于控制數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息收集的級(jí)別。當(dāng)其為默認(rèn)值TYPICAL時(shí),系統(tǒng)將自動(dòng)收集所有主要的有關(guān)自身管理的信息以使系統(tǒng)提供最優(yōu)性能,該值適合于絕大多數(shù)情況;當(dāng)取值A(chǔ)LL時(shí),相對(duì)TYPICAL值系統(tǒng)增加timed OS statistics和plan execution statistics兩項(xiàng)信息統(tǒng)計(jì);當(dāng)取值 BASIC時(shí):有關(guān)系統(tǒng)特性和功能的許多信息統(tǒng)計(jì)功能都將被關(guān)閉(詳細(xì)見(jiàn)附錄1)。因此oracle強(qiáng)烈建意參數(shù)STATISTICS_LEVEL的值盡量不要設(shè)成BASIC。同時(shí)當(dāng)修改參數(shù)以語(yǔ)法“alter system set statistics_level='typical';”完成時(shí),修改后的STATISTICS_LEVEL的作用范圍為整個(gè)系統(tǒng),但當(dāng)使用“ALTER SESSION”時(shí),STATISTICS_LEVEL的作用范圍僅為本SESSION。STATISTIC_LEVEL參數(shù)所控制的所有統(tǒng)計(jì)、報(bào)告功能的狀態(tài)信息都可以從視圖V$STATISTICS_LEVEL中得到,具體有關(guān)視圖V$STATISTICS_LEVEL各字段的含義可參見(jiàn)網(wǎng)頁(yè)http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14237/dynviews_2135.htm#I1030264。
舉例如下:
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET statistics_level=all';
END;--設(shè)置本session statistics_level為‘a(chǎn)ll’
SELECT v.STATISTICS_NAME,v.SESSION_STATUS,v.SYSTEM_STATUS,v.ACTIVATION_LEVEL,v.SESSION_SETTABLE FROM V$STATISTICS_LEVEL v;
結(jié)果如下:
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET statistics_level=basic';
END;--設(shè)置本session statistics_level為‘basic’
SELECT v.STATISTICS_NAME,v.SESSION_STATUS,v.SYSTEM_STATUS,v.ACTIVATION_LEVEL,v.SESSION_SETTABLE FROM V$STATISTICS_LEVEL v;
結(jié)果如下:
3、保存以前版本的統(tǒng)計(jì)信息在優(yōu)化器收集統(tǒng)計(jì)信息時(shí)可能出現(xiàn)原來(lái)的優(yōu)化方法在收集統(tǒng)計(jì)信息之前一直工作良好,但是在此之后,由于新收集的統(tǒng)計(jì)信息產(chǎn)生了不良計(jì)劃,導(dǎo)致查詢突然出錯(cuò)或效率降低。為避免這種情況,統(tǒng)計(jì)信息的收集作業(yè)在收集新信息之前保存當(dāng)前的統(tǒng)計(jì)信息。如果出現(xiàn)問(wèn)題,則可以返回到原有的統(tǒng)計(jì)信息,或者通過(guò)歷史統(tǒng)計(jì)檢查二者之間的不同之處,以解決問(wèn)題。
例如,假設(shè)在 5 月 31 日晚上 10:00 開(kāi)始運(yùn)行表 emp 上的統(tǒng)計(jì)信息收集作業(yè),而隨后查詢的性能變差。Oracle 保存了原有的統(tǒng)計(jì)信息,可以通過(guò)執(zhí)行以下命令重新獲取這些信息:
begin
dbms_stats.restore_table_stats (
'ARUP',
'REVENUE',
'10-DEC-08 10.00.00.000000000 PM -04:00');
end;
此命令將統(tǒng)計(jì)信息恢復(fù)到 12月 10 日晚上 10:00 為止的統(tǒng)計(jì)信息,時(shí)間信息是以 TIMESTAMP數(shù)據(jù)類型提供。歷史統(tǒng)計(jì)信息能夠恢復(fù)的時(shí)間長(zhǎng)度是由保留參數(shù)所決定的。要查看當(dāng)前的保留參數(shù),可使用以下查詢:
SQL> select DBMS_STATS.GET_STATS_HISTORY_RETENTION from dual;
GET_STATS_HISTORY_RETENTION
---------------------------
31
表示可以保存相當(dāng)于 31 天的統(tǒng)計(jì)信息,但并不能予以保證。要了解統(tǒng)計(jì)信息所覆蓋到的確切時(shí)間和日期,只需使用以下查詢:
SQL> select DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY from dual;
GET_STATS_HISTORY_AVAILABILITY
---------------------------------------------------------------------
10-DEC-08 09.21.33.594053000 PM -04:00
該查詢表明可用的最陳舊統(tǒng)計(jì)信息日期為 12 月 10 日上午9:21。 同時(shí),也可以通過(guò)執(zhí)行內(nèi)建的函數(shù)將保留時(shí)間設(shè)為不同的值。例如,要將其設(shè)為 45 天,可使用:
execute DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (45)
4、查看統(tǒng)計(jì)信息表、索引一擊列的統(tǒng)計(jì)信息都存儲(chǔ)在數(shù)據(jù)字典里,可以通過(guò)選取數(shù)據(jù)字典視圖的某些字段來(lái)查看相應(yīng)統(tǒng)計(jì)信息,此處具體涉及到的數(shù)據(jù)字典視圖見(jiàn)附件2。具體各視圖各字段的含義可見(jiàn)網(wǎng)頁(yè):http://download-west.oracle.com/docs/cd/B19306_01/server.102/b14237/toc.htm。
此處就以列統(tǒng)計(jì)信息為列,說(shuō)明查看列統(tǒng)計(jì)信息。
列統(tǒng)計(jì)信息可以按柱狀統(tǒng)計(jì)圖的形式存儲(chǔ),柱狀統(tǒng)計(jì)圖為列數(shù)據(jù)提供了準(zhǔn)確的描述信息,尤其是在數(shù)據(jù)列有傾斜(列為某種值的記錄行數(shù)非常多,而某種值的記錄行數(shù)又非常少)的時(shí)候。Oracle中包含兩種柱狀統(tǒng)計(jì)圖,高度正方圖(height-balanced)和頻率直方圖(frequency histograms),該類型存儲(chǔ)在視圖*TAB_COL_STATISTICS (* 可為USER或 DBA),其取值為HEIGHT BALANCED, FREQUENCY或 NONE
(1)高度直方圖高度直方圖中,數(shù)據(jù)列的值被分成組,每組包含的數(shù)據(jù)數(shù)據(jù)可數(shù)基本相等。比如有一個(gè)列c其值在1到100之間,當(dāng)均勻分布,其列的高度直方圖如下圖:
每個(gè)間隔中都包含數(shù)據(jù)列的10行數(shù)據(jù);當(dāng)不均勻分布時(shí)其列直方圖如下圖
這時(shí),大多數(shù)數(shù)據(jù)行的值為5。查詢時(shí)最有價(jià)值的統(tǒng)計(jì)信息就是各個(gè)組范圍的兩個(gè)端點(diǎn)的值.
查看統(tǒng)計(jì)信息的語(yǔ)法如下:
BEGIN
DBMS_STATS.GATHER_table_STATS (OWNNAME => 'scott', TABNAME => 'EMP',
METHOD_OPT => 'FOR COLUMNS SIZE 6 SAL');
END;
/
SELECT column_name, num_distinct, num_buckets, histogram
FROM USER_TAB_COL_STATISTICS
WHERE table_name = 'EMP' AND column_name = 'SAL';
結(jié)果:
SELECT endpoint_number, endpoint_value
FROM USER_HISTOGRAMS
WHERE table_name = 'EMP' and column_name = 'SAL'
ORDER BY endpoint_number;
結(jié)果:
上圖中,每行對(duì)應(yīng)高度直方圖中的每個(gè)間隔。
(2)頻率直方圖在頻率直方圖中,列中每個(gè)唯一數(shù)據(jù)相當(dāng)于高度直方圖中的每個(gè)間隔,其高度對(duì)應(yīng)該數(shù)據(jù)在列中出現(xiàn)的次數(shù)。當(dāng)列中distinct值得個(gè)數(shù)小于或等于直方圖的分格段的個(gè)數(shù)(即num_buckets的值)時(shí),頻率直方圖會(huì)被自動(dòng)建立。查看頻率直方圖的語(yǔ)法如下:
BEGIN
DBMS_STATS.GATHER_table_STATS (OWNNAME => 'scott', TABNAME => 'EMP',
METHOD_OPT => 'FOR COLUMNS SIZE 12 SAL');
END;
SELECT column_name, num_distinct, num_buckets, histogram
FROM USER_TAB_COL_STATISTICS
WHERE table_name = 'EMP' AND column_name = 'SAL';
結(jié)果:
SELECT endpoint_number, endpoint_value
FROM USER_HISTOGRAMS
WHERE table_name = 'EMP' and column_name = 'SAL'
ORDER BY endpoint_number;
結(jié)果:
5、使用統(tǒng)計(jì)信息收集功能需注意的問(wèn)題注意1:上文曾提到過(guò)Modification Monitoring功能,其由statistics_level設(shè)為‘typical’或‘a(chǎn)ll’來(lái)啟動(dòng),而統(tǒng)計(jì)信息自動(dòng)收集功能是依據(jù)這些監(jiān)控信息來(lái)判斷是否對(duì)該表進(jìn)行統(tǒng)計(jì)信息收集,如果Modification Monitoring功能關(guān)閉,則統(tǒng)計(jì)信息自動(dòng)收集就無(wú)法確認(rèn)表的統(tǒng)計(jì)信息是否已經(jīng)過(guò)期,因此此時(shí)需要手工收集統(tǒng)計(jì)信息。
此外,USER_TAB_MODIFICATIONS表中記錄了所有被監(jiān)控表的數(shù)據(jù)被更改的信息。該信息的更新將會(huì)稍微滯后于真實(shí)的修改,可以通過(guò)DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO存儲(chǔ)過(guò)程來(lái)立刻將更改的信息更新到USER_TAB_MODIFICATIONS表中。對(duì)于更新之后再rollback的記錄,仍然算為已經(jīng)受影響的記錄,Oracle不會(huì)在rollback之后再去更新USER_TAB_MODIFICATIONS表,因此此點(diǎn)需引起注意。
舉例如下(以系統(tǒng)自帶的練習(xí)用戶scott中的數(shù)據(jù)為例,直接在command window中運(yùn)行):
SQL> select * from user_tab_modifications where table_name='EMP';
--no rows selected
SQL> select count(*) from emp;
COUNT(*)
----------
14
SQL> update emp set sal=sal+100;
14 rows updated.
SQL> select * from user_tab_modifications where table_name='EMP';
--no rows selected
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();
PL/SQL procedure successfully completed.
SQL> select inserts,updates,deletes from user_tab_modifications where table_name ='EMP';
INSERTS UPDATES DELETES
---------- ---------- ----------
0 14 0
SQL> rollback;
Rollback complete.
SQL> exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO();
PL/SQL procedure successfully completed.
SQL> select inserts,updates,deletes from user_tab_modifications where table_name ='EMP';
INSERTS UPDATES DELETES
---------- ---------- ----------
0 14 0
注意2:oracle強(qiáng)烈建意參數(shù)STATISTICS_LEVEL的值盡量不要設(shè)成BASIC,所以當(dāng)需要將自動(dòng)統(tǒng)計(jì)信息功能關(guān)閉時(shí),最好采用以下方法:
方法一: SYSDBA登錄
exec dbms_scheduler.disable('SYS.GATHER_STATS_JOB');
exec dbms_scheduler.enable('SYS.GATHER_STATS_JOB');
方法二:以SYSDBA身份登陸
alter system set "_optimizer_autostats_job"=false scope=spfile;
alter system set "_optimizer_autostats_job"=true scope=spfile;
Pfile可以直接修改初始化參數(shù)文件
然后重新啟動(dòng)數(shù)據(jù)庫(kù)。
注意3:
不是所有的數(shù)據(jù)庫(kù)對(duì)象都適合使用統(tǒng)計(jì)信息自動(dòng)收集功能,如當(dāng)在如下情況時(shí),統(tǒng)計(jì)信息自動(dòng)收集功能就無(wú)法達(dá)到需求:
(1) 某些表在工作時(shí)間內(nèi)被刪除(delete)或截?cái)啵╰runcate)并且被重新創(chuàng)建;
(2) 某些重負(fù)荷表在工作時(shí)間內(nèi)被大量修改(insert、update),修改量超過(guò)10%。
對(duì)于這些修改頻率較高的表,要保持其統(tǒng)計(jì)信息不過(guò)期,可采用如下兩個(gè)方法:
對(duì)于(1)可采用下方法:
方法1:將這些表的統(tǒng)計(jì)信息設(shè)為NULL,這樣Oracle會(huì)以查詢優(yōu)化的一部分來(lái)動(dòng)態(tài)的收集這些無(wú)統(tǒng)計(jì)信息表的統(tǒng)計(jì)信息。Oracle動(dòng)態(tài)收集統(tǒng)計(jì)信息功能由參數(shù)OPTIMIZER_DYNAMIC_SAMPLING控制,并且只有當(dāng)該參數(shù)的值大于或等于2時(shí)(默認(rèn)值為2),Oracle動(dòng)態(tài)收集統(tǒng)計(jì)信息功能才能啟動(dòng)。
要將數(shù)據(jù)庫(kù)對(duì)象統(tǒng)計(jì)信息設(shè)為NULL,只需刪除原有的統(tǒng)計(jì)信息,然后給其統(tǒng)計(jì)信息功能加鎖,語(yǔ)法如下:
BEGIN
DBMS_STATS.DELETE_TABLE_STATS('OE','ORDERS');--刪除統(tǒng)計(jì)信息
DBMS_STATS.LOCK_TABLE_STATS('OE','ORDERS'); --不再收集統(tǒng)計(jì)信息
END;
類似的加鎖、解鎖還有LOCK_SCHEMA_STATS、LOCK_TABLE_STATS、UNLOCK_SCHEMA_STATS、UNLOCK_TABLE_STATS。
方法2:將數(shù)據(jù)庫(kù)表的最能代表該表狀況的典型統(tǒng)計(jì)信息固定,以作為該表優(yōu)化統(tǒng)計(jì)信息。我們可以在任何時(shí)候去收集這些典型的信息并將其鎖定,這樣就可達(dá)到目的,這樣的統(tǒng)計(jì)信息有可能比統(tǒng)計(jì)信息自動(dòng)收集功能在晚上所收集到的統(tǒng)計(jì)信息更能表達(dá)數(shù)據(jù)表的狀況。
對(duì)問(wèn)題(2)可采用如下方法:
對(duì)于那些修改量較大的表,統(tǒng)計(jì)信息的收集最好是能緊跟在修改操作之后,而作為sql程序或者數(shù)據(jù)庫(kù)作業(yè)的一部分來(lái)手動(dòng)完成;
注意4:
在下述情況時(shí)需要手工來(lái)完成統(tǒng)計(jì)信息的收集。
(1)對(duì)于外部表,其統(tǒng)計(jì)信息不會(huì)在作業(yè)GATHER_SCHEMA_STATS, GATHER_DATABASE_STATS和統(tǒng)計(jì)信息自動(dòng)收集作業(yè)中被收集,因?yàn)閿?shù)據(jù)操作在外部表上是被禁止的,因此在對(duì)應(yīng)數(shù)據(jù)改變是須手動(dòng)收集外部表的統(tǒng)計(jì)信息。
(2)當(dāng)統(tǒng)計(jì)信息自動(dòng)收集功能停用時(shí)。
(3)另外還有的就是系統(tǒng)統(tǒng)計(jì)信息(system statistics)了。
(4)固定對(duì)象,如動(dòng)態(tài)性能表(dynamic performance table)需要被收集當(dāng)數(shù)據(jù)庫(kù)有明顯操作時(shí),用GATHER_FIXED_OBJECTS_STATS過(guò)程。
6、統(tǒng)計(jì)信息自動(dòng)收集功能oracle 11i相比10g的不同(1)Oracle 10g中,可能存在某些情況,你需要用自己的腳本來(lái)收集某些特殊對(duì)象的統(tǒng)計(jì)信息。但是由于你采用了自動(dòng)收集統(tǒng)計(jì)信息,oracle就會(huì)對(duì)所有對(duì)象使用相同的選項(xiàng)來(lái)收集統(tǒng)計(jì)信息,這樣你就失去了對(duì)某個(gè)對(duì)象的控制權(quán)。當(dāng)你發(fā)現(xiàn)缺省的統(tǒng)計(jì)信息收集方式對(duì)某個(gè)對(duì)象不是很合適時(shí),你必須鎖定該對(duì)象的統(tǒng)計(jì)信息,并使用一個(gè)特殊的選項(xiàng)值對(duì)該對(duì)象來(lái)收集統(tǒng)計(jì)信息。
比如,某個(gè)表的列的數(shù)據(jù)傾斜的非常嚴(yán)重,這時(shí)如果采用標(biāo)準(zhǔn)的采樣率:ESTIMATE_PERCCENT=AUTO_SAMPLE_SIZE可能就不適合了。這時(shí)你就需要單獨(dú)指定該對(duì)象的采樣率。我們知道,在11g之前的收集統(tǒng)計(jì)信息方面,oracle提供的類似的其他選項(xiàng)還包括:CASCADE、DEGREE、METHOD_OPT、NO_INVALIDATE、GRANULARITY。到了11g里,則提供了更大的靈活性,從而使得你可以很簡(jiǎn)單的處理上面所說(shuō)的這種情況。在11g里,上面說(shuō)的這些選項(xiàng)可以在不同的級(jí)別上分別設(shè)置,級(jí)別由高到低分別為:global級(jí)別、數(shù)據(jù)庫(kù)級(jí)別、schema級(jí)別、表級(jí)別。其中,低級(jí)別的選項(xiàng)覆蓋高級(jí)別的選項(xiàng)。
如,對(duì)于上面所舉的例子來(lái)說(shuō),如果要對(duì)你的一個(gè)特殊的、列上的值傾斜的很嚴(yán)重的表收集統(tǒng)計(jì)信息時(shí),你只需要簡(jiǎn)單的調(diào)用如下的存儲(chǔ)過(guò)程來(lái)設(shè)置該表級(jí)別上的的ESTIMATE_PERCCENT=100即可,如下所示:
SQL> exec dbms_stats.set_table_prefs('Schema_name','Table_name','ESTIMATE_PERCCENT','100');
這樣設(shè)置以后,當(dāng)數(shù)據(jù)庫(kù)在自動(dòng)收集統(tǒng)計(jì)信息時(shí),對(duì)于其他沒(méi)有單獨(dú)設(shè)置采樣率的表來(lái)說(shuō),采樣率會(huì)采用AUTO_SAMPLE_SIZE,而對(duì)于你單獨(dú)設(shè)置的Table_name表,則會(huì)使用100的采樣率來(lái)收集統(tǒng)計(jì)信息。類似的,如果需要設(shè)置global級(jí)別上的選項(xiàng),則調(diào)用dbms_stats.set_global_prefs;如果要設(shè)置數(shù)據(jù)庫(kù)級(jí)別上的選項(xiàng),則調(diào)用dbms_stats.set_database_prefs;如果要設(shè)置schema級(jí)別上的選項(xiàng),則調(diào)用dbms_stats.set_schema_prefs即可。
(2)11g中,除了上面提到的這些選項(xiàng)以外,還添加了另外三種新的選項(xiàng):PUBLISH、INCREMENTAL、STALE_PERCENT。其中:
1) PUBLISH:收集完統(tǒng)計(jì)信息以后是否立即將統(tǒng)計(jì)信息發(fā)布到數(shù)據(jù)字典里,還是將它們存放在私有區(qū)域里。TRUE表示立即發(fā)布,F(xiàn)ALSE表示存放到私有區(qū)域里。
2) STALE_PERCENT:確定某個(gè)對(duì)象的統(tǒng)計(jì)信息過(guò)時(shí)的上限,如果過(guò)時(shí)就需要重新收集統(tǒng)計(jì)信息,缺省為10。計(jì)算某個(gè)表的統(tǒng)計(jì)信息是否過(guò)時(shí),oracle會(huì)計(jì)算自從上一次收集該表的統(tǒng)計(jì)信息以來(lái),該表中被修改的數(shù)據(jù)行數(shù)占該表的總行數(shù)的百分比。然后用得出的百分比值與該選項(xiàng)配置的值(如果缺省,就是10)進(jìn)行比較,大于10,則說(shuō)明該表的統(tǒng)計(jì)信息過(guò)時(shí)了,需要重新收集統(tǒng)計(jì)信息;否則就認(rèn)為該表的統(tǒng)計(jì)信息不過(guò)時(shí),不用再次收集。
3) INCREMENTAL:在分區(qū)表上收集global的統(tǒng)計(jì)信息時(shí)(將GRANULARITY設(shè)置為GLOBAL),采用增量方式完成。使用該選項(xiàng)是因?yàn)閷?duì)于某些分區(qū)表來(lái)說(shuō),比如按照月份進(jìn)行范圍分區(qū)的分區(qū)表來(lái)說(shuō),除了代表當(dāng)前月的分區(qū)里的數(shù)據(jù)會(huì)經(jīng)常變化以外,其他分區(qū)里的數(shù)據(jù)不會(huì)變動(dòng)。因此在收集該分區(qū)表上的global的統(tǒng)計(jì)信息時(shí),就沒(méi)有必要再次掃描那些非當(dāng)前月的分區(qū)了。如果你將INCREMENTAL設(shè)置為T(mén)RUE時(shí),則在收集統(tǒng)計(jì)信息時(shí),就不會(huì)掃描那些非當(dāng)前月的分區(qū)里的數(shù)據(jù),而只會(huì)掃描當(dāng)前月的分區(qū)里的數(shù)據(jù)。最后將非當(dāng)前月的分區(qū)上已經(jīng)存在的統(tǒng)計(jì)信息加上當(dāng)前月新算出來(lái)的統(tǒng)計(jì)信息合并就得出了分區(qū)表的global的統(tǒng)計(jì)信息??梢詮囊晥D:DBA_TAB_STAT_PREFS里看到所有的收集統(tǒng)計(jì)信息時(shí)的各個(gè)選項(xiàng)的值。
(3)在Oracle10g版本(包括最新的10.2.0.4)中沒(méi)有已知的修改10%這個(gè)閥值的方法。但是在Oracle11g中則提供了SET_TABLE_PREFS等函數(shù)。
以下命令將指定表的STALE默認(rèn)值從10%改為5%,該值可以從新的dba_tab_stat_prefs數(shù)據(jù)字典中查詢獲得。
--僅限于Oracle11g版本
BEGIN
DBMS_STATS.SET_TABLE_PREFS ( wnname =>'scott', tabname =>'EMP', pname =>'SAL', pvalue =>'5');
END;
/
SQL> select * from dba_tab_stat_prefs;
OWNER TABLE_NAME PREFERENCE_NAME PREFE
---------- ---------- -------------------- -----
scott EMP SAL 5
7、待解決問(wèn)題文章對(duì)oracle 10g的統(tǒng)計(jì)信息自動(dòng)收集功能做了詳細(xì)的解讀,并附帶了部分的實(shí)際實(shí)踐。但是由于本地?cái)?shù)據(jù)庫(kù)的數(shù)據(jù)量非常有限,關(guān)于統(tǒng)計(jì)信息自動(dòng)收集功能如何來(lái)提高數(shù)據(jù)庫(kù)系統(tǒng)的運(yùn)行效率方面還缺乏實(shí)驗(yàn),在后面的學(xué)習(xí)和開(kāi)發(fā)中將會(huì)注意到此點(diǎn),可能會(huì)以實(shí)際的應(yīng)用未基礎(chǔ)來(lái)說(shuō)明統(tǒng)計(jì)信息自動(dòng)收集功能對(duì)系統(tǒng)效率的影響。