一種Oracle統(tǒng)計信息自動收集方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種數(shù)據(jù)庫統(tǒng)計信息收集方法,尤其涉及一種Oracle統(tǒng)計信息自動收集方法。
【背景技術(shù)】
[0002]統(tǒng)計信息指Oracle數(shù)據(jù)庫優(yōu)化器(optimizer)統(tǒng)計信息,統(tǒng)計信息描述了 Oracle數(shù)據(jù)庫對象的物理特性,比如表中有多少條記錄,占用多大的磁盤空間等,就是一個更加詳細(xì)描述數(shù)據(jù)庫和數(shù)據(jù)庫對象的集合。
[0003]當(dāng)Oracle 數(shù)據(jù)庫工作在 CBO (Cost Based Optimizer)模式下(Oracle 數(shù)據(jù)庫 1g以上版本默認(rèn)并推薦使用該模式),優(yōu)化器根據(jù)數(shù)據(jù)字典中記錄的對象統(tǒng)計信息,評估SQL語句不同執(zhí)行計劃的成本,從而找到最優(yōu)的執(zhí)行計劃,使得SQL語句的執(zhí)行效率最高。
[0004]統(tǒng)計信息的準(zhǔn)確性對于Oracle數(shù)據(jù)庫執(zhí)行計劃有顯著影響,如果統(tǒng)計信息中記錄的對象屬性(比如表的數(shù)據(jù)行數(shù)量)與實際情況存在較大偏差(一般見于統(tǒng)計信息更新不及時),會導(dǎo)致Oracle數(shù)據(jù)庫優(yōu)化器選擇錯誤的執(zhí)行計劃,輕則引起SQL語句執(zhí)行時間變長,重則可能由于過度消耗系統(tǒng)資源,從而引發(fā)數(shù)據(jù)庫整體處理能力下降甚至無法正常處理業(yè)務(wù)請求。
[0005]現(xiàn)有通用的處理方法是:
[0006]1、Oracle數(shù)據(jù)庫系統(tǒng)使用默認(rèn)的統(tǒng)計收集策略收集統(tǒng)計信息
[0007]2、數(shù)據(jù)庫管理員手工(或通過shell腳本)收集特定數(shù)據(jù)庫對象的統(tǒng)計信息
[0008]3、使用Oracle數(shù)據(jù)庫的統(tǒng)計信息動態(tài)采樣功能
[0009]4、數(shù)據(jù)比對方法,即掃描數(shù)據(jù)庫所有表的數(shù)據(jù)行數(shù)(rows),之后與現(xiàn)有的統(tǒng)計信息進(jìn)行比較,如果差異較大,則進(jìn)行統(tǒng)計信息收集
[0010]上述方法一般適用于數(shù)據(jù)量較小、業(yè)務(wù)負(fù)載不高、業(yè)務(wù)類型較單一的情況,但在TB以上級別的大數(shù)據(jù)量、高業(yè)務(wù)壓力,以及同時進(jìn)行聯(lián)機(jī)事務(wù)處理和數(shù)據(jù)分析業(yè)務(wù)類型混合的業(yè)務(wù)場景下無法保證Oracle數(shù)據(jù)庫統(tǒng)計信息收集的準(zhǔn)確性與完整性?,F(xiàn)有技術(shù)的缺點如下:
[0011 ] 1、默認(rèn)的統(tǒng)計信息收集作業(yè)可能影響正常的業(yè)務(wù)處理。OracIe默認(rèn)的統(tǒng)計信息收集策略會在工作日每天晚上22點到第二天早上6點,及周末全天,自動收集沒有統(tǒng)計信息的和統(tǒng)計信息過舊的對象的統(tǒng)計信息。收集統(tǒng)計信息過程需要消耗大量系統(tǒng)資源,但在此時間窗口內(nèi),并非所有業(yè)務(wù)系統(tǒng)都處于業(yè)務(wù)閑時,所以在該時間段內(nèi)執(zhí)行統(tǒng)計收集作業(yè)會造成嚴(yán)重的資源爭用,影響正常的業(yè)務(wù)處理。
[0012]2、采用默認(rèn)收集策略,統(tǒng)計信息收集的完整性不可控。由于默認(rèn)的時間窗口范圍有限,在數(shù)據(jù)庫對象多、數(shù)據(jù)量大、數(shù)據(jù)量變化大的情況下會出現(xiàn)規(guī)定時間段內(nèi)無法完成所需對象的統(tǒng)計信息收集操作。在此情況下,數(shù)據(jù)庫對象的統(tǒng)計信息可能長期得不到更新,影響SQL語句的執(zhí)行效率。數(shù)據(jù)庫管理員可以手工修改并延長作業(yè)的時間窗口,但又可能會出現(xiàn)作業(yè)的時間窗口與后續(xù)業(yè)務(wù)高峰重合,產(chǎn)生資源爭用。
[0013]3、采用統(tǒng)計信息動態(tài)采樣方法,在頻繁訪問某一對象的時候?qū)е滦阅芟陆?。所謂動態(tài)采樣即為:對于沒有統(tǒng)計信息的表,Oracle會在執(zhí)行SQL語句之前對語句涉及到的對象做一次統(tǒng)計信息收集操作。該方法可以得到相對準(zhǔn)確的執(zhí)行計劃,但每次執(zhí)行均需要做動態(tài)統(tǒng)計信息收集,在對象訪問頻繁的情況下,大量的重復(fù)采樣操作會消耗的過多不必要的系統(tǒng)資源,影響系統(tǒng)運行效率。
[0014]4、手工或Shell腳本進(jìn)行特定對象的統(tǒng)計信息收集??稍谝欢ǔ潭壬暇徑饽J(rèn)策略帶來的問題,但仍有局限性,比如:1、只能收集指定對象統(tǒng)計信息。2、無法自動識別新增對象,無法自動識別并定義收集粒度及限定資源消耗。3、需要根據(jù)對象變化經(jīng)常修改腳本,維護(hù)成本大,效率不高。
【發(fā)明內(nèi)容】
[0015]本發(fā)明所要解決的技術(shù)問題是提供一種Oracle統(tǒng)計信息自動收集方法,能夠自動、正確、高效的收集Oracle統(tǒng)計信息,提高Oracle數(shù)據(jù)庫運行的效率、穩(wěn)定性以及業(yè)務(wù)的連續(xù)性。
[0016]本發(fā)明為解決上述技術(shù)問題而采用的技術(shù)方案是提供一種Oracle統(tǒng)計信息自動收集方法,其中,包括如下步驟:a)將數(shù)據(jù)庫表設(shè)計為分區(qū)表,并按照業(yè)務(wù)特點劃分為不同的統(tǒng)計收集類型山)操作系統(tǒng)定期調(diào)度數(shù)據(jù)庫存儲過程,輸入數(shù)據(jù)庫表屬主、表名或分區(qū)名稱進(jìn)行不同粒度的統(tǒng)計信息收集;c)所述數(shù)據(jù)庫存儲過程根據(jù)輸入數(shù)據(jù)庫表屬主、表名或分區(qū)名稱,查找相應(yīng)的統(tǒng)計收集類型并完成數(shù)據(jù)庫表對象的統(tǒng)計信息收集。
[0017]上述的Oracle統(tǒng)計信息自動收集方法,其中,所述步驟a)將數(shù)據(jù)庫表劃分為如下的統(tǒng)計收集類型:全表收集:收集所有分區(qū)信息;按周期收集:收集周期的長短與預(yù)估的數(shù)據(jù)庫表對象的行數(shù)成反比。
[0018]上述的Oracle統(tǒng)計信息自動收集方法,其中,所述步驟a)對數(shù)據(jù)庫表按如下周期劃分統(tǒng)計收集類型:
[0019]按當(dāng)前月分區(qū):需要收集當(dāng)前月的統(tǒng)計信息;
[0020]按上月分區(qū):需要收集上一個月的統(tǒng)計信息;
[0021]按當(dāng)前旬分區(qū):每月三個分區(qū),收集當(dāng)前日期所在分區(qū)的統(tǒng)計信息;
[0022]按上旬分區(qū):每月三個分區(qū),收集當(dāng)前日期前一個旬分區(qū)的統(tǒng)計信息;
[0023]按當(dāng)前日分區(qū):需要收集當(dāng)前日的統(tǒng)計信息;
[0024]按前一日分區(qū):需要收集前一日的統(tǒng)計信息。
[0025]上述的Oracle統(tǒng)計信息自動收集方法,其中,所述步驟c)還包括根據(jù)收集到的數(shù)據(jù)庫表對象的行數(shù)統(tǒng)計信息對收集周期進(jìn)行實時調(diào)整;對于統(tǒng)計收集類型為全表收集的數(shù)據(jù)庫表,當(dāng)收集到的數(shù)據(jù)庫表對象的統(tǒng)計行數(shù)超過預(yù)設(shè)閥值時,更新統(tǒng)計收集類型為按當(dāng)前月分區(qū)。
[0026]上述的Oracle統(tǒng)計信息自動收集方法,其中,所述步驟a)預(yù)先將所有數(shù)據(jù)庫表的屬主、表名、分區(qū)名稱及其統(tǒng)計收集類型記錄存儲在數(shù)據(jù)字典表;所述步驟b)使用操作系統(tǒng)命令crontab,在指定時間點運行主腳本來定期調(diào)度數(shù)據(jù)庫存儲過程,所述主腳本輸入數(shù)據(jù)庫表屬主、表名和分區(qū)名稱進(jìn)行單表統(tǒng)計信息收集,所述主腳本輸入數(shù)據(jù)庫表屬主進(jìn)行多表統(tǒng)計信息收集。
[0027]上述的Oracle統(tǒng)計信息自動收集方法,其中,所述主腳本通過掃描數(shù)據(jù)字典表獲取匹配的數(shù)據(jù)庫表的屬主、表名和分區(qū)名稱;對于多表統(tǒng)計信息收集,所述主腳本通過掃描數(shù)據(jù)字典表獲取匹配的屬主下所有數(shù)據(jù)庫表。
[0028]上述的Oracle統(tǒng)計信息自動收集方法,其中,對于單表統(tǒng)計信息收集,如果所述主腳本通過掃描數(shù)據(jù)字典表后無法獲取匹配的數(shù)據(jù)庫表的屬主、表名和分區(qū)名稱,則判定輸入數(shù)據(jù)庫表為新增的數(shù)據(jù)庫表;接著,進(jìn)一步判斷所述新增數(shù)據(jù)庫表是否為用戶數(shù)據(jù)表,若是則對該用戶數(shù)據(jù)表進(jìn)行全表收集,并更新數(shù)據(jù)字典表。
[0029]本發(fā)明對比現(xiàn)有技術(shù)有如下的有益效果:本發(fā)明提供的Oracle統(tǒng)計信息自動收集方法,將數(shù)據(jù)庫表設(shè)計為分區(qū)表,新增、修改、刪除等操作僅針對當(dāng)前或某些特定分區(qū),查詢及統(tǒng)計根據(jù)不同的統(tǒng)計收集類型分別實現(xiàn),從而能夠方便基于屬主、表、分區(qū)等粒度進(jìn)行統(tǒng)計信息收集,提高Oracle數(shù)據(jù)庫運行的效率、穩(wěn)定性以及業(yè)務(wù)的連續(xù)性。
【附圖說明】
[0030]圖1為本發(fā)明Oracle統(tǒng)計信息自動收集流程示意圖;
[0031]圖2為本發(fā)明Oracle統(tǒng)計信息自動收集方法的數(shù)據(jù)庫存儲過程示意圖。
【具體實施方式】
[0032]下面結(jié)合附圖和實施例對本發(fā)明作進(jìn)一步的描述。
[0033]圖1為本發(fā)明Oracle統(tǒng)計信息自動收集流程示意圖。
[0034]請參見圖1,本發(fā)明提供的Oracle統(tǒng)計信息自動收集方法,包括如下步驟:
[0035]a)將數(shù)據(jù)庫表設(shè)計為分區(qū)表,并按照業(yè)務(wù)特點劃分為不同的統(tǒng)計收集類型;
[0036]b)操作系統(tǒng)定期調(diào)度數(shù)據(jù)庫存儲過程,輸入數(shù)據(jù)庫表屬主、表名或分區(qū)名稱進(jìn)行不同粒度的統(tǒng)計信息收集;
[0037]c)所述數(shù)據(jù)庫存儲過程根據(jù)輸入數(shù)據(jù)庫表屬主、表名或分區(qū)名稱,查找相應(yīng)的統(tǒng)計收集類型并完成數(shù)據(jù)庫表對象的統(tǒng)計信息收集。
[0038]本發(fā)明聯(lián)合使用操作系統(tǒng)級別計劃任務(wù)以及調(diào)用數(shù)據(jù)庫內(nèi)部處理方法,依據(jù)每套Oracle數(shù)據(jù)庫的表結(jié)構(gòu)及業(yè)務(wù)特點,將數(shù)據(jù)庫表劃分為小表(數(shù)據(jù)量IG以下)、大表(數(shù)據(jù)量IG以上)、不按時間分區(qū)的分區(qū)表、按天分區(qū)的分區(qū)表、按10天分區(qū)的分區(qū)表、按月分區(qū)的分區(qū)表等不同類別,根據(jù)業(yè)務(wù)特點制定相應(yīng)的統(tǒng)計信息收集策略,并根據(jù)模版和框架編寫存儲過程,通過腳本自動調(diào)度運行。本發(fā)明通過自動的計劃任務(wù)、自定義數(shù)據(jù)庫腳本及存儲過程等處理方法,可以針對Oracle數(shù)據(jù)庫對象的統(tǒng)計信息進(jìn)行自動、高效的收集,預(yù)防性能問題的發(fā)生,減少人工干預(yù),減少系統(tǒng)的運維成本,提高系統(tǒng)的易用性、穩(wěn)定性和可用性。
[0039]本發(fā)明的整體架構(gòu)包括以下四個重要組成部分:
[0040]a)策略部分,根據(jù)業(yè)務(wù)變更進(jìn)行更新,生成并更新策略字典表(以下簡稱“字典表,,);
[0041]b)操作系統(tǒng)級別計劃任務(wù)(負(fù)責(zé)定期調(diào)度);
[0042]c)主腳本(負(fù)責(zé)調(diào)用存儲過程,負(fù)責(zé)傳入數(shù)據(jù)庫庫表屬主及策略類型);
[0043]d)數(shù)據(jù)庫存儲過程(根據(jù)輸入變量進(jìn)行相應(yīng)數(shù)據(jù)庫表等對象的統(tǒng)計信息收集)。
[0044]整體流程及相互調(diào)用關(guān)系如下:
[0045]1、數(shù)據(jù)庫表的業(yè)務(wù)訪問策略:
[0046]在數(shù)據(jù)庫物理設(shè)計階段,會根據(jù)業(yè)務(wù)訪問數(shù)據(jù)的規(guī)則對數(shù)據(jù)庫表進(jìn)行設(shè)計,例如:將數(shù)據(jù)庫表設(shè)計為分區(qū)表,新增、修改、刪除等操作僅針對當(dāng)前或某些特定分區(qū),查詢及統(tǒng)計操作涉及多個分區(qū)。
[0047]2、策略字典表
[0048]初次使用本方案時,需要根據(jù)業(yè)務(wù)的訪問策略梳理并生成策略字典表,在字典表中將數(shù)據(jù)庫表按照業(yè)務(wù)特點劃分為不同類型(TYPE)。如果業(yè)務(wù)對數(shù)據(jù)的訪問方式有變更,也需要對該字典表進(jìn)行同步更新,例如:
[0049]1:全表收集:非分區(qū)表、收集所有分區(qū)信息
[0050]2:按月分區(qū),需要收集當(dāng)前月的統(tǒng)計信息
[0051]3:按月分區(qū),需要收集上一個月的統(tǒng)計信息
[