Oracle表的分析統計_第1頁
Oracle表的分析統計_第2頁
Oracle表的分析統計_第3頁
Oracle表的分析統計_第4頁
Oracle表的分析統計_第5頁
免費預覽已結束,剩余4頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、總結Oracle 表的分析統計討論一:使用 dbms_stats 還是 analyze自從 Oracle8.1.5 引入 dbms_stats 包,Oracle 及專家們就推薦使用 dbms_stats 取代analyze。理由如下:1. dbms_stats 可以并行分析2. dbms_stats 有自動分析的功能(altertablemonitor)3. analyze 分析統計信息的有些時候不準確第 1,2 比較好理解,且第 2 點實際上在 VLDB(VeryLargeDatabase)中是最吸引人的;3 以前比較模糊,看了 metalink236935.1 解釋,analyze 在分析

2、 Partition 表的時候,有時候會計算出不準確的 Globalstatistics。原因是 dbms_stats 會實在的去分析表全局統計信息(當指定參數);而 analyze 是將表分區(局部)的 statistics 匯總計算成表全局 statistics,可能導致誤差。沒有分區表的情況下兩個都可以使用(看個人習慣,當然也可以分區表使用 dbms_stats,其他使用 analyze)。不過在一些論壇上也有看到 dbms_stats 分析之后出現統計數據不準確的情況,而且確實有 bug在 dbms_stats 上(可能和版本有關,有待查明),應該是少數情況,需要我們注意。還有,一般不

3、建議 analyze 和 dbms_stats 混用。實驗:如果在分區表上用 dbms_stats 統計后,再使用analyzetable 來統計,就會出現表信息不被更新的問題。刪除統計信息后再分析就更新了,或者直接用 dbms_stats 分析。dbms_stats 目前有遇到的 bug 例子如下:http:/ 包可以分析 table、Index 或者整個用戶(schema),數據庫,可以并行分析。不同版本包有些不一樣,dbms_utility(8i 以前的工具包),dbms_stats(8i 或以后提供的工具包),具體的 dbms_stats 包的眾多功能介紹見后面。對命令與工具包的一些總

4、結:1、對于分區表,建議使用 DBMS_STATS 而不是使用 Analyze 語句。a)可以并行進行,對多個用戶,多個 Tableb)可以得到整個分區表的數據和單個分區的數據。c)可以在不同級別上 ComputeStatistics:單個分區,子分區,全表,所有分區d)可以導出統計信息e)可以用戶自動收集統計信息(altertablemonitor)2、DBMS_STATS 勺缺點:a)不能 ValidateStructure(注意:validatestructure 主要在于校驗對象的有效性.computestatistics 在于統計相關的信息)。b)不能 U攵集CHAINEDROWST

5、 鏈接),不能 U攵集CLUSTERTABL 霞表)的信息,這兩個仍舊需要使用 Analyze 語句。c)DBMS_STATS 默認不對索引進行 Analyze,因為默認 Cascade 是 False,需要手工指定為 True 即GATHER_TABLE_STATS:分析表信息,當cascade為true時,分析表、列(索引)信息。Analyze 是同時更新表和索引的統計信息,而 dbms_stats 會先更新表的統計信息,然后再更新索引的統計信息(默認 Cascade 是 False),這里就有一個問題,就是當表的統計信息更新后,而索引的統計信息沒有被更新,這時候 cbo 就有可能選擇錯誤

6、的 plan。3、對于 oracle9 里面的 ExternalTable,Analyze 不能使用,只能使用 DBMS_STAT 既收集信息。Analyze 命令語法如下:ANALYZETABLEschema.tablePARTITION(partition)|SUBPARTITION(subpartition)|INDEXschema.indexPARTITION(partition)|SUBPARTITION(subpartition)|CLUSTERschema.clusterCOMPUTESYSTEMSTATISTICSfor_clause|ESTIMATESYSTEMSTATIST

7、ICSfor_clauseSAMPLEintegerROWS|PERCENT|validation_clauses|LISTCHAINEDROWSinto_clause|DELETESYSTEMSTATISTICS;dbms_stats 所有的功能包如下:GATHER_INDEX_STATS:分析索弓I信息GATHER_TABLE_STATS:分析表信息,當cascade為true時,分析表、列(索引)信息GATHER_SCHEMA_STATS:分析方案信息GATHER_DATABASE_STATS:分析數據庫信息GATHER_SYSTEM_STATS:分析系統信息EXPORT_COLUMN_

8、STATS:導出列的分析信息EXPORT_INDEX_STATS:導出索引分析信息EXPORT_SYSTEM_STATS:導出系統分析信息EXPORT_TABLE_STATS:導出表分析信息EXPORT_SCHEMA_STATS:導出方案分析信息EXPORT_DATABASE_STATS:導出數據庫分析信息IMPORT_COLUMN_STATS:導入歹U分析信息IMPORT_INDEX_STATS:導入索引分析信息IMPORT_SYSTEM_STATS:導入系統分析信息IMPORT_TABLE_STATS:導入表分析信息IMPORT_SCHEMA_STATS:導入方案分析信息IMPORT_DA

9、TABASE_STATS:導入數據庫分析信息討論二:analyze 的使用方法(分區表建議使用dbms_stats)可以參考http:/ 的三大功能:搜集和刪除索引、表和簇的統計信息驗證表、索引和簇的結構鑒定表和簇的行遷移(migratedrows)和行鏈接(chainedrows)CBO 是 Oracle 推薦使用的優化方式,要想使用好 CBO,使 SQL 語句發揮最大效能,必須保證統計數據的及時性。統計信息的生成可以有完全計算法和抽樣估算法。SQL 例句如下:完全計算法:analyzetableabccomputestatistics;抽樣估算法(抽樣 20%):analyzetablea

10、bcestimatestatisticssample20percent;對表作完全計算所花的時間相當于做全表掃描,抽樣估算法由于采用抽樣,比完全計算法的生成統計速度要快,如果不是要求要有非常精確的數據的話,盡量采用抽樣分析法。建議對表分析采用抽樣估算,對索引分析可以采用完全計算。Analyze 分析 table,index 等需要的權限:必須在你自己的 Schema(方案)中或者有 ANALYZEANY 系統權限。比如:grantanalyzeanytotolywang;revokeanalyzeanyfromtolywang;Analyze 使用的局限及改善:Analyze命令每次僅僅能影響

11、到一個table(或index),如果想通過analyze為整個schema或整個數據庫中的所有表生成統計數字。可以使用 analyze 的批處理方式(腳本)。Analyze 分析命令解析:ANALYZETABLEschema.tablePARTITION(partition)|SUBPARTITION(subpartition)|INDEXschema.indexPARTITION(partition)|SUBPARTITION(subpartition)|CLUSTERschema.clusterCOMPUTESYSTEMSTATISTICSfor_clause|ESTIMATESYSTE

12、MSTATISTICSfor_clauseSAMPLEintegerROWS|PERCENT|validation_clauses|LISTCHAINEDROWSinto_clause|DELETESYSTEMSTATISTICS;INDEXindex:對索引進行分析,分析的結果會放在 USER_INDEXES,ALL_INDEXES,或DBA_INDEXES 中。一般僅需要對索引進行統計時用到。分析的內容:Depthoftheindexfromitsrootblocktoitsleafblocks(BLEVEL)從索引的根塊到其葉塊的索引的深度(級數)。Numberofleafblocks(

13、LEAF_BLOCKS)葉塊的數量,這些塊包括了指向表中及索引中行的指針。Numberofdistinctindexvalues(DISTINCT_KEYS)不同索引值的數量。Averagenumberofleafblocksforeachindexvalue(AVG_LEAF_BLOCKS_PER_KEY)包括每一個值的記錄的葉塊的平均數。Averagenumberofdatablocksforeachindexvalue(foranindexonatable)(AVG_DATA_BLOCKS_PER_KEY)被一個索弓 I 值指向的數據塊的平土勻數量。Clusteringfactor(ho

14、wwellorderedtherowsareabouttheindexedvalues)(CLUSTERING_FACTOR)一個簇因子,表明了表中的行的順序和索引中的順序相匹配的緊密程度。LAST_ANALYZED 為索引生成的統計數字的日期。TABLEtable:對表進行分析,分析的結果會放在 USER_TABLES,ALL_TABLES 和DBA_TABLES 視圖中,當為表收集統計數字時,除非以別的方式指明,否則 Oracle 也為那個表中的索引收集統計數字。還有,在分析表的時候,oracle 也會分析基于函數的 index 所引用的表達式。分析 table 產生的內容(在上面的幾個視

15、圖列中可以找到):Numberofrows(NUM_ROWS)*表中行的數量。Numberofdatablocksbelowthehighwatermark(thatis,thenumberofdatablocksthathavebeenformattedtoreceivedata,regardlesswhethertheycurrentlycontaindataorareempty)(BLOCKS)高水位一下的數據塊數量(不管是否現在有數據還是空的)。*Numberofdatablocksallocatedtothetablethathaveneverbeenused(EMPTY_BLOCK

16、S)分配給表但未被數據使用的數據塊的數量。Averageavailablefreespaceineachdatablockinbytes(AVG_SPACE)在每一塊中自由空間數量的平均值(以字節表示)。Numberofchainedrows(CHAIN_CNT)鏈接行的數量。Averagerowlength,includingtherowsoverhead,inbytes(AVG_ROW_LEN)在表中行的平均長度,以字節表示。LAST_ANALYZED:為表生成統計數據的日期。分析表的限制:不可以分析數據字典表不可以分析擴展表,但可以用 DBMS_STATS 來實現這個目的不可以分析臨時表

17、不可以計算或估計下列字段類型:REFs,varrays,nestedtables,LOBs(LOBsarenotanalyzed,theyareskipped),LONGs,orobjecttypes.分析分區表最好使用 DBMS_STATS 來實現。PARTITION|SUBPARTITION:對分區表或索引進行分析CLUSTERcluster:對簇進行分析,分析的結果會放在 ALL_CLUSTERS,USER_CLUSTERSandDBA_CLUSTERS.compute_statistics_clause語法:COMPUTESYSTEMSTATISTICSfor_clause對分析對像進

18、行精確的統計,然后把信息存儲的數據字典中。可以選擇對表或對字段進行分析。computed 和 estimated 這兩種方式的統計數據都被優化器用來影響 sql 的執行計劃如果指定 system 選項就只統計系統產生的信息。for_clause:FORTABLE:只統計表FORCOLUMNS:只統計某個字段FORALLCOLUMNS:統計所有字段FORALLINDEXEDCOLUMNS:統計索引的所有字段FORALLINDEXES:只分析索弓 IFORALLLOCALINDEXES 針對分區表中的本地索引estimate_statistics_clauseESTIMATESYSTEMSTATI

19、STICSfor_clauseSAMPLEintegerROWS|PERCENT只是對部分行做一個大概的統計。適用于大表SAMPLE:指定具體統計多少行,如果忽略這個參數的話,oracle 會默認為 1064 行ROWScauses:行數Oracletosampleintegerrowsofthetableorclusterorintegerentriesfromtheindex.Theintegermustbeatleast1.PERCENTcauses:百分數。一般情況下,建議在可以得到足夠精確的統計的前提下使用最小的百分比。validation_clauses分析 REF 或是對像的結構

20、比如:ANALYZETABLEemployeesVALIDATESTRUCTURECASCADE;ANALYZETABLEcustomersVALIDATEREFUPDATE;validatestructure:ANALYZEINDEXXXXXXVALIDATESTRUCTURE;檢查表里的行數據的完全性,并檢查表或者是索引的結構,并把分析過的結果寫入INDEX_STATS數據字典中。對于cascade,有如下解釋:SpecifyCASCADEifyouwantOracletovalidatethestructureoftheindexesassociatedwiththetableorclu

21、ster.Ifyouusethisclausewhenvalidatingatable,thenOraclealsovalidatesthetablesindexes.Ifyouusethisclausewhenvalidatingacluster,thenOraclealsovalidatesalltheclusteredtablesindexes,includingtheclusterindex.備注:需要注意一下各種統計方式的等價性以及執行的先后順序。比如:analyzetabletcomputestatistics=analyzetabletcomputestatisticsforta

22、bleforallindexes還有,任何時候生成表統計的數字時,都擦掉了任意列的統計數字。所以需要順序的執行命令,以免出現問題。先 analyzetabletcomputestatistics,然后 analyzetabletcomputestatisticsforallindexedcolumns.如果順序錯誤,那么列相關統計信息就會被覆蓋。另外,forallcolumns 是對數據列進行直方圖統計。統計分析后的信息存儲視圖:一般我們需要養成一種習慣,在分析之前,需要建立備份表,用于備份之前最近的一次統計分析數據,dbms_stats 包提供了專用的導入導出功能。而 Analyze 分析之后的統計信息存放在以下幾個視圖中:fortable 的統計信息存在于視圖:user_tables、all_tables、dba_tablesforallindexes 的統計信息存在于視圖:user_indexes、all_inde

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論