專利名稱:數(shù)據(jù)庫優(yōu)化方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及移動通信技術(shù),特別涉及數(shù)據(jù)庫優(yōu)化方法和裝置。
背景技術(shù):
在數(shù)據(jù)庫應用中,每天都有大量的SQL訪問數(shù)據(jù)庫。目前,數(shù)據(jù)庫比如hformix 數(shù)據(jù)庫都是通過INFORMIX數(shù)據(jù)庫接口訪問INFORMIX數(shù)據(jù)庫的系統(tǒng)表來查詢當前時間點正在執(zhí)行的SQL的執(zhí)行情況(其包含該SQL當前耗用的資源等)。INFORMIX數(shù)據(jù)庫接口只能提供一個時間點的SQL執(zhí)行狀況,并無數(shù)據(jù)采集匯總分析的功能,因此,其不能提供一個時間段內(nèi)SQL的執(zhí)行情況,缺乏統(tǒng)計及過濾功能。如此,導致數(shù)據(jù)庫管理人員無法定位關(guān)鍵SQL,進而影響數(shù)據(jù)庫的優(yōu)化。其中,關(guān)鍵SQL為執(zhí)行頻率和執(zhí)行成本較高的SQL,其對數(shù)據(jù)庫的資源耗用較大,定位出關(guān)鍵SQL,對數(shù)據(jù)庫優(yōu)化有事半功倍的作用。
發(fā)明內(nèi)容
本發(fā)明提供了數(shù)據(jù)庫優(yōu)化的方法和裝置,以定位出關(guān)鍵SQL,利于數(shù)據(jù)庫優(yōu)化。本發(fā)明提供的技術(shù)方案包括一種數(shù)據(jù)庫優(yōu)化方法,包括A,捕獲原始SQL;B,針對捕獲的每一原始SQL,對該原始SQL進行標準化處理,得到對應該原始SQL 的標準SQL,并生成該標準SQL的標識;C,根據(jù)各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL。一種數(shù)據(jù)庫優(yōu)化裝置,包括
捕獲單元,用于捕獲原始SQL ;處理單元,用于針對所述捕獲單元捕獲的每一原始SQL,對該原始SQL進行標準化處理,得到對應該原始SQL的標準SQL,并生成該標準SQL的標識;定位單元,用于根據(jù)所述處理單元生成的各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL。由以上技術(shù)方案可以看出,本發(fā)明中,通過對捕獲的原始SQL進行標準化處理,得到對應該原始SQL的標準SQL,并生成該標準SQL的標識;之后根據(jù)各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL。即實現(xiàn)了定位出關(guān)鍵SQL,通過分析關(guān)鍵SQL優(yōu)化數(shù)據(jù)庫的目的。進一步地,本發(fā)明有針對性地對關(guān)鍵SQL進行優(yōu)化,還能實現(xiàn)對數(shù)據(jù)庫的最少修改,達到優(yōu)化效果最大的目的,也大大減少風險性。
圖1為本發(fā)明實施例提供的基本流程圖;圖2為本發(fā)明實施例提供的步驟102的實現(xiàn)流程圖3為本發(fā)明實施例提供的步驟104的實現(xiàn)流程圖;圖4為本發(fā)明實施例提供的裝置結(jié)構(gòu)圖。
具體實施例方式為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面結(jié)合附圖和具體實施例對本發(fā)明進行詳細描述。關(guān)鍵SQL需要耗用較大的數(shù)據(jù)庫資源,因此,找出關(guān)鍵SQL并對其進行優(yōu)化,是實現(xiàn)數(shù)據(jù)庫優(yōu)化的最佳方式。本發(fā)明提供的方法能夠定位出關(guān)鍵SQL,具體如圖1所示。參見圖1,圖1為本發(fā)明實施例提供的基本流程圖。如圖1所示,該流程可包括以下步驟步驟101,捕獲原始SQL具體實現(xiàn)時,本步驟101以設定捕獲粒度為單位從數(shù)據(jù)庫的共享內(nèi)存池中捕獲原始SQL。其中,所述捕獲粒度按照對系統(tǒng)負荷影響最小、且保證捕獲的原始SQL具有代表性的原則設定,本實施例通常設置所述捕獲粒度為5至15分鐘。步驟102,針對捕獲的每一原始SQL,對該原始SQL進行標準化處理,得到對應該原始SQL的標準SQL。本步驟102中,對原始SQL進行標準化處理可為提取原始SQL的執(zhí)行路線,將該執(zhí)行路線抽象過濾為標準SQL,其具體可參見圖2所示的流程。步驟103,生成標準SQL的標識。步驟104,根據(jù)各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL。本步驟104具體可參見圖3所示的流程。至此,完成圖1所示的流程。從圖1所示的流程可以看出,本發(fā)明有針對性地對關(guān)鍵SQL進行優(yōu)化,還能實現(xiàn)對數(shù)據(jù)庫的最少修改,達到優(yōu)化效果最大的目的,也大大減少風險性。需要說明的是,以上步驟101至步驟104由預先在數(shù)據(jù)庫所在服務器上安裝的SQL 采集引擎實現(xiàn)。在步驟102中,對原始SQL進行標準化處理實質(zhì)上是從應用角度而言,其是將該原始SQL還原到業(yè)務層面,以實現(xiàn)屬于同業(yè)務的不同SQL不被分散來定位關(guān)鍵SQL ;從數(shù)據(jù)庫角度或者技術(shù)角度而言,由于數(shù)據(jù)庫對具有相同執(zhí)行路線的不同SQL執(zhí)行的操作是完全一樣的,因此,該標準化處理為將原始SQL抽象到執(zhí)行路線,以實現(xiàn)屬于同一數(shù)據(jù)庫操作的不同SQL不被分散來定位關(guān)鍵SQL。以查詢用戶基本信息的數(shù)據(jù)庫操作為例,如果從具體的SQL進行分析,因查詢帶有用戶名等參數(shù),幾乎每一個查詢的SQL語句都不相同,比如,其中一個 SQL 為 select氺from taw—user where userid =“yjy2,,,另一個 SQL 為 select氺from taw_user where userid = “zhouli ”,但實際上,查詢用戶基本信息業(yè)務本身是一個操作, 在數(shù)據(jù)庫查詢中的執(zhí)行路線是相同的,因此,可將這兩個SQL抽象到同一執(zhí)行路線。在步驟103中,步驟103中的生成操作具體可為利用設定的哈希(HASH)碼生成函數(shù),生成該標準SQL的哈希碼,即標準SQL的標識為哈希碼。其中,哈希碼是一個十進制數(shù)字,用于唯一標識標準SQL。在步驟104中,步驟104的定位操作具體可參見圖3所示的流程。根據(jù)步驟104的描述可以知道,關(guān)鍵SQL是根據(jù)標準SQL的哈希碼定位的,而不是將標準SQL本身的字符串進行比較確定,這一方面可以提供定位效率,另一方面減少對數(shù)據(jù)庫系統(tǒng)的負荷。另外,根據(jù)步驟104的描述可以知道,定位關(guān)鍵SQL是基于標準SQL,而不是直接采用原始SQL。通過對步驟102的分析可以知道,標準SQL是對應執(zhí)行路線,基于此,可以看出步驟104是從執(zhí)行路線的角度定位關(guān)鍵SQL,這能夠保證定位出的關(guān)鍵SQL更加準確。下面通過圖2對步驟102進行詳細描述參見圖2,圖2為本發(fā)明實施例提供的步驟102的實現(xiàn)流程圖。如圖2所示,針對步驟101捕獲的每一原始SQL,執(zhí)行如下處理步驟201,按照順序遍歷原始SQL中的字符,將遍歷到的字符作為當前字符。本步驟201中的字符為單詞、符號或者數(shù)組。步驟202,判斷所述當前字符是否為最后一個未被遍歷的字符,如果否,執(zhí)行步驟 203,如果是,結(jié)束當前處理流程。若當前字符為最后一個未被遍歷的字符,則結(jié)束當前處理流程,將處理后的SQL 作為標準SQL。步驟203,判斷當前字符是否在設定的運算符中,如果是,執(zhí)行步驟204;否則,執(zhí)行步驟205。本步驟203中的運算符至少包含以下字符中的至少一個等于(=)、大于(>)、 小于(<)、尖括號(<>)、大于等于(>=),小于等于(<=)、like。步驟204,確定當前字符的下一個字符為執(zhí)行參數(shù),并將其替換為標準字符,將替換后的標準字符的下一個字符作為當前字符,返回步驟202。步驟205,判斷當前字符是否為between,如果否,將當前字符的下一個字符作為當前字符,返回步驟202 ;如果是,執(zhí)行步驟206。步驟206,確定當前字符的下一個字符為執(zhí)行參數(shù),將其替換為標準字符。步驟207,如果步驟206替換后的標準字符的下一個字符為and,則確定該and的下一個字符為執(zhí)行參數(shù),將其替換為標準字符,并將該替換后的標準字符的下一個字符確定為當前字符,返回執(zhí)行步驟202。至此,完成圖2所示的流程。從圖2所示的流程可以看出,圖2主要是過濾掉原始SQL中執(zhí)行參數(shù)的影響,以便將屬于同一數(shù)據(jù)庫操作的不同SQL處理為同一標準SQL。在上述圖2所示的流程中,標準字符具體實現(xiàn)時可為“? ”,或者其他字符,本發(fā)明實施例并不具體限定。下面以標準字符為“? ”為例,對圖2所示的流程進行具體分析。假如捕獲到的SQL至少包含以下兩個SQL,即SQLl和SQL2,在業(yè)務層面上,其屬于同一個數(shù)據(jù)庫操作,即用于查詢并統(tǒng)計某一部門未處理任務工單數(shù)量的操作,但對于數(shù)據(jù)庫來說,由于它們包含了不同的參數(shù),因此,是兩條不同的SQL SQL 1 select count(distinct commontaskO.id) as col_0_0_
from commontask—task—undo commontaskO, CommonTask—main commontaskl where
(commontaskO.taskOwner =lSung' or commontaskO.operateRoleld -1600') and
(commontaskO .taskStatus = 3 or commontaskO .taskStatus = 8 or commontaskO.taskStatus = 2)
and commontaskO.taskDisplayName <> 'caoga'
and commontaskl.id = commontaskO. sheetKey and commontaskl .deleted <> '1'SQL2
select count(distinct commontaskO.id) as col__0—0_
from commontask—task—undo commontaskO, CommonTask—main commontaskl where
(commontaskO.taskOwner =lMYang1 or commontaskO.operateRoleld 二'1710’) and
(commontaskO .taskStatus = 2 or commontaskO .taskStatus 二 6 or commontaskO .taskStatus = 1) and commontaskO.taskDisplayName <> 'caoga'
and commontaskl.id 二 commontaskO.sheetKey and commontaskl .deleted <> T對上述兩個原始SQL分別基于圖2所示的處理流程,可以得到同一標準SQL,具體為
8CN 102541884 ASelect count(distinct commontaskO.id) as col—0—0— from commontask—task—undo commontaskO, commonTask—main commontaskl where
(commontaskO.taskOwner = ? or commontaskO.operateRoleld = ) and
(commontaskO. taskStatus = ? or commontaskO .taskStatus = ? or commontaskO .taskStatus = ) and commontaskO.taskDisplayName <> ? and commontaskl.id=commontaskO.sheetKey and commontaskl .deleted <> ?也就是說,通過圖2,能夠?qū)儆谕粩?shù)據(jù)庫操作的不同SQL處理為同一標準SQL, 這能保證步驟104定位的關(guān)鍵SQL更加準確,具體參見圖3所示。以上對圖2所示方法的應用進行了描述,下面通過圖3對步驟104的具體流程進行描述。需要說明的是,為便于定位關(guān)鍵SQL,步驟103在針對每一標準SQL生成該標準 SQL的哈希碼后,進一步包括存儲標準SQL的記錄至已創(chuàng)建的采集數(shù)據(jù)庫表中,其中,標準 SQL的記錄包含標準SQL、標準SQL的捕獲時間、以及該標準SQL的哈希碼至已創(chuàng)建的采集數(shù)據(jù)庫表中;所述標準SQL的捕獲時間為捕獲該標準SQL對應的原始SQL的時間。以標準 SQL 為 select*from taw_user where userid = 為例,則該標準 SQL 的記錄為hashid 2627970744. 00000sql select^from taw_user where userid = ?intime 20100702174157其中,hashid是通過HASH碼生成函數(shù)生成的該標準SQL即select*fromtaw_user where userid = 的哈希碼,intime為該標準SQL的捕獲時間?;诖?,步驟104的具體實現(xiàn)流程如圖3所示參見圖3,圖3為本發(fā)明實施例提供的步驟104的實現(xiàn)流程圖。如圖3所示,該流程可包括步驟301,從采集數(shù)據(jù)庫表中采集捕獲時間在設定統(tǒng)計周期內(nèi)的標準SQL的哈希碼。由于頻繁采集SQL會給數(shù)據(jù)庫帶來負荷,所以不可能將所有執(zhí)行過的SQL全部采集,而是以設定統(tǒng)計周期為單位采集,然后匯總定位出關(guān)鍵SQL,這樣不會給數(shù)據(jù)庫增加太大負荷。比如,設定統(tǒng)計周期為2010年11月30日12點10分10秒至2010年11月30日 13點10分10秒,基于此,本步驟301可從采集數(shù)據(jù)庫表中將捕獲時間在2010年11月30 日12點10分10秒至2010年11月30日13點10分10秒的所有標準SQL采集出來。步驟302,確定采集的每一哈希碼標識的標準SQL在所述設定統(tǒng)計周期內(nèi)的執(zhí)行頻率和執(zhí)行成本。其中,標準SQL的執(zhí)行頻率為該標準SQL在所述設定統(tǒng)計周期內(nèi)被執(zhí)行的次數(shù),具體實現(xiàn)時,可通過統(tǒng)計該標準SQL的哈希碼在所有被采集的哈希碼中出現(xiàn)的次數(shù)。比如,步驟301采集的哈希碼為5個,分別為A1、A2、A1、A1和A4 ;由于Al在采集的5個哈希碼中出現(xiàn)了 3次,如此,確定Al標識的SQL的執(zhí)行頻率為3,相應地,也可確定出A2和A4標識的 SQL的執(zhí)行頻率為1。至于標準SQL的執(zhí)行成本,其是一個SQL執(zhí)行時消耗系統(tǒng)資源的估算值,沒有計量單位,值越大,表示消耗的系統(tǒng)資源將越多,執(zhí)行時間也越長,其可由數(shù)據(jù)庫中的優(yōu)化器確定。其中,優(yōu)化器可通過分析執(zhí)行SQL的磁盤I/O、CPU時間消耗、內(nèi)存開銷等因素,構(gòu)造所有可能的執(zhí)行計劃,并估算出其執(zhí)行SQL的成本,最后選擇具有最低執(zhí)行成本的執(zhí)行計劃。優(yōu)選地,本實施例在確定出采集的所有哈希碼標識的標準SQL的執(zhí)行頻率后,且在確定該標準SQL的執(zhí)行成本之前進一步包括按照執(zhí)行頻率的大小對各個標準SQL排隊; 比如,將執(zhí)行頻率最大的標準SQL排在最前面,依次類推,即可形成一個隊列;如此,本步驟 302可針對隊列中的標準SQL按順序確定對應的執(zhí)行成本。步驟303,將執(zhí)行頻率和執(zhí)行成本均大于對應閾值的標準SQL確定為需要優(yōu)化的關(guān)鍵SQL。通常,執(zhí)行頻率高、且執(zhí)行成本高的標準SQL耗用的數(shù)據(jù)庫資源比較多,其一般為關(guān)鍵SQL。因此,本步驟303可根據(jù)實際情況設置執(zhí)行頻率和執(zhí)行成本分別對應的閾值,以便準確、快速識別出關(guān)鍵SQL。至此,通過上述步驟301至步驟303實現(xiàn)了關(guān)鍵SQL的識別。從圖3可以看出,本流程是基于標準SQL識別關(guān)鍵SQL的,而并非采用原始SQL,由于標準SQL能夠統(tǒng)一屬于同一數(shù)據(jù)庫操作但不同的原始SQL,因此,圖3所示的流程避免了屬于同一數(shù)據(jù)庫操作的不同原始SQL分開處理造成關(guān)鍵SQL定位不準確、影響數(shù)據(jù)庫優(yōu)化的缺陷。以上對本發(fā)明實施例提供的方法進行了詳細描述,下面對本發(fā)明實施例提供的裝置進行描述。參見圖4,圖4為本發(fā)明實施例提供的裝置結(jié)構(gòu)圖。如圖4所示,該裝置可包括捕獲單元401,用于捕獲原始SQL ;處理單元402,用于針對捕獲單元401捕獲的每一原始SQL,對該原始SQL進行標準化處理,得到對應該原始SQL的標準SQL,并生成該標準SQL的標識;定位單元403,用于根據(jù)處理單元402生成的各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL。優(yōu)選地,捕獲單元401以設定捕獲粒度為單位從數(shù)據(jù)庫的共享內(nèi)存池中捕獲原始 SQL ;其中,所述捕獲粒度按照對系統(tǒng)負荷影響最小、且保證捕獲的原始SQL具有代表性的原則設定。本實施例中,處理單元402具體實現(xiàn)時可包括標準化子單元4021,用于針對捕獲單元401捕獲的每一原始SQL,對該原始SQL進行標準化處理,得到對應該原始SQL的標準SQL ;標識生成子單元4022,用于生成每一標準SQL的標識。其中,標準化子單元4021可通過提取原始SQL的執(zhí)行路線,將該執(zhí)行路線抽象過濾為標準SQL實現(xiàn)標準化處理,具體包括以下模塊遍歷模塊4023,用于按照順序遍歷原始SQL中的字符,所述字符為單詞、符號或者數(shù)組,將遍歷到的字符作為當前字符;第一判斷模塊40M,用于判斷所述當前字符是否為最后一個未被遍歷的字符,如果否,發(fā)送判斷通知給第二判斷模塊4025 ;如果是,結(jié)束當前流程;第二判斷模塊4025,用于接收到判斷通知后,判斷當前字符是否在設定的運算符中,如果是,確定當前字符的下一個字符為執(zhí)行參數(shù),將其替換為標準字符,將替換后的標準字符的下一個字符作為當前字符,并觸發(fā)第一判斷模塊40M執(zhí)行判斷操作;如果否,將當前字符的下一個字符作為當前字符,并觸發(fā)第一判斷模塊40M執(zhí)行判斷操作。第三判斷模塊40 ,用于在第二判斷模塊4025判斷結(jié)果為否之后,且在第二判斷模塊4025執(zhí)行將當前字符的下一個字符作為當前字符之前,判斷當前字符是否為 between,如果否,觸發(fā)第二判斷模塊4025繼續(xù)執(zhí)行將當前字符的下一個字符作為當前字符的操作,如果是,發(fā)送處理通知給處理模塊4027 ;處理模塊4027,用于接收到所述處理通知后,確定當前字符的下一個字符為執(zhí)行參數(shù),將其替換為標準字符,并在該替換后的標準字符的下一個字符為and時,確定該and 的下一個字符為執(zhí)行參數(shù),將其替換為標準字符,并將該替換后的標準字符的下一個字符確定為當前字符,并觸發(fā)第一判斷模塊40M執(zhí)行判斷操作。優(yōu)選地,標識生成子單元4022在生成標準SQL的標識之后進一步包括記錄標準 SQL、該標準SQL的捕獲時間、以及該標準SQL的標識至已創(chuàng)建的采集數(shù)據(jù)庫表中,所述標準 SQL的捕獲時間為捕獲該標準SQL對應的原始SQL的時間;基于此,定位單元403可根據(jù)采集數(shù)據(jù)庫表的記錄執(zhí)行定位關(guān)鍵SQL的操作。如圖4所示,定位單元403可包括采集子單元4031,用于從所述采集數(shù)據(jù)庫表中采集捕獲時間在設定統(tǒng)計周期內(nèi)的標準SQL的標識;確定子單元4032,用于針對采集子單元4031采集的每一標準SQL的標識,確定該標準SQL在所述設定統(tǒng)計周期內(nèi)的執(zhí)行頻率和執(zhí)行成本;其中,確定子單元4032確定標準SQL在設定統(tǒng)計周期內(nèi)的執(zhí)行頻率包括確定該標準SQL的標識在采集的所有標準SQL標識中的出現(xiàn)次數(shù),將所述出現(xiàn)次數(shù)確定為該標準 SQL在設定統(tǒng)計周期內(nèi)的執(zhí)行頻率。至于確定子單元4032確定標準SQL在設定統(tǒng)計周期內(nèi)的執(zhí)行成本,其可按照現(xiàn)有方式確定,這里不再贅述。定位子單元4033,用于將執(zhí)行頻率和執(zhí)行成本均大于對應閾值的標準SQL確定為需要優(yōu)化的關(guān)鍵SQL。優(yōu)選地,標識生成子單元4022利用設定的哈希HASH碼生成函數(shù),生成該標準SQL 的哈希碼。以上對本發(fā)明實施例提供的裝置進行了描述。由以上技術(shù)方案可以看出,本發(fā)明中,通過對捕獲的原始SQL進行標準化處理,得到對應該原始SQL的標準SQL,并生成該標準SQL的標識;之后根據(jù)各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL。即實現(xiàn)了定位出關(guān)鍵SQL,通過分析關(guān)鍵SQL優(yōu)化數(shù)據(jù)庫的目的。
進一步地,本發(fā)明有針對性地對關(guān)鍵SQL進行優(yōu)化,還能實現(xiàn)對數(shù)據(jù)庫的最少修改,達到優(yōu)化效果最大的目的,也大大減少風險性。以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進等,均應包含在本發(fā)明保護的范圍之內(nèi)。
權(quán)利要求
1.一種數(shù)據(jù)庫優(yōu)化方法,其特征在于,該方法包括 A,捕獲原始SQL;B,針對捕獲的每一原始SQL,對該原始SQL進行標準化處理,得到對應該原始SQL的標準SQL,并生成該標準SQL的標識;C,根據(jù)各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟A以設定捕獲粒度為單位從數(shù)據(jù)庫的共享內(nèi)存池中捕獲原始SQL。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述捕獲粒度按照對系統(tǒng)負荷影響最小、 且保證捕獲的原始SQL具有代表性的原則設定。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟B中,對原始SQL進行標準化處理包括Bi,提取原始SQL的執(zhí)行路線,將該執(zhí)行路線抽象過濾為標準SQL。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,步驟Bl包括B11,按照順序遍歷原始SQL中的字符,所述字符為單詞、符號或者數(shù)組,將遍歷到的字符作為當前字符;B12,判斷所述當前字符是否為最后一個未被遍歷的字符,如果否,執(zhí)行步驟B13 ;如果是,結(jié)束當前流程;B13,判斷當前字符是否在設定的運算符中,如果是,確定當前字符的下一個字符為執(zhí)行參數(shù),將其替換為標準字符,將替換后的標準字符的下一個字符作為當前字符,返回步驟 B12 ;如果否,將當前字符的下一個字符作為當前字符,返回步驟B12。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述運算符至少包含以下字符中的至少一個等于=、大于>、小于<、尖括號 、大于等于> =,小于等于< =、like。
7.根據(jù)權(quán)利要求5所述的方法,其特征在于,步驟B13中,在判斷出當前數(shù)據(jù)不在設定的運算符中之后,且在將當前字符的下一個字符作為當前字符之前,進一步包括B00,判斷當前字符是否為between,如果否,繼續(xù)執(zhí)行步驟B13中將當前字符的下一個字符作為當前字符的操作,如果是,執(zhí)行步驟BOl ;B01,確定當前字符的下一個字符為執(zhí)行參數(shù),將其替換為標準字符;之后執(zhí)行步驟B02 ;B02,如果步驟BOl替換后的標準字符的下一個字符為and,則確定該and的下一個字符為執(zhí)行參數(shù),將其替換為標準字符,并將該替換后的標準字符的下一個字符確定為當前字符,返回執(zhí)行步驟B12。
8.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟B中,在生成標準SQL的標識之后進一步包括記錄標準SQL、該標準SQL的捕獲時間、以及該標準SQL的標識至已創(chuàng)建的采集數(shù)據(jù)庫表中,所述標準SQL的捕獲時間為捕獲該標準SQL對應的原始SQL的時間;步驟C中,根據(jù)各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL包括 Cl,從所述采集數(shù)據(jù)庫表中采集捕獲時間在設定統(tǒng)計周期內(nèi)的標準SQL的標識; C2,針對采集的每一標準SQL的標識,確定該標準SQL在所述設定統(tǒng)計周期內(nèi)的執(zhí)行頻率和執(zhí)行成本;C3,將執(zhí)行頻率和執(zhí)行成本均大于對應閾值的標準SQL確定為需要優(yōu)化的關(guān)鍵SQL。
9.根據(jù)權(quán)利要求8所述的方法,其特征在于,步驟C2中,確定標準SQL在設定統(tǒng)計周期內(nèi)的執(zhí)行頻率包括確定該標準SQL的標識在步驟Cl采集的所有標準SQL標識中出現(xiàn)的次數(shù),將該出現(xiàn)次數(shù)確定為該標準SQL在設定統(tǒng)計周期內(nèi)的執(zhí)行頻率。
10.根據(jù)權(quán)利要求1至9任一所述的方法,其特征在于,步驟B中,生成標準SQL的標識包括利用設定的哈希HASH碼生成函數(shù),生成該標準SQL的哈希碼。
11.一種數(shù)據(jù)庫優(yōu)化裝置,其特征在于,該裝置包括 捕獲單元,用于捕獲原始SQL;處理單元,用于針對所述捕獲單元捕獲的每一原始SQL,對該原始SQL進行標準化處理,得到對應該原始SQL的標準SQL,并生成該標準SQL的標識;定位單元,用于根據(jù)所述處理單元生成的各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL。
12.根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述捕獲單元以設定捕獲粒度為單位從數(shù)據(jù)庫的共享內(nèi)存池中捕獲原始SQL ;所述捕獲粒度按照對系統(tǒng)負荷影響最小、且保證捕獲的原始SQL具有代表性的原則設定。
13.根據(jù)權(quán)利要求11所述的裝置,其特征在于,所述處理單元包括標準化子單元,用于針對所述捕獲單元捕獲的每一原始SQL,對該原始SQL進行標準化處理,得到對應該原始SQL的標準SQL ;標識生成子單元,用于生成每一標準SQL的標識。
14.根據(jù)權(quán)利要求13所述的裝置,其特征在于,所述標準化子單元通過提取原始SQL的執(zhí)行路線,將該執(zhí)行路線抽象過濾為標準SQL實現(xiàn)標準化處理,具體包括以下模塊遍歷模塊,用于按照順序遍歷原始SQL中的字符,所述字符為單詞、符號或者數(shù)組,將遍歷到的字符作為當前字符;第一判斷模塊,用于判斷所述當前字符是否為最后一個未被遍歷的字符,如果否,發(fā)送判斷通知給第二判斷模塊;如果是,結(jié)束當前流程;第二判斷模塊,用于接收到判斷通知后,判斷當前字符是否在設定的運算符中,如果是,確定當前字符的下一個字符為執(zhí)行參數(shù),將其替換為標準字符,將替換后的標準字符的下一個字符作為當前字符,并觸發(fā)所述第一判斷模塊執(zhí)行判斷操作;如果否,將當前字符的下一個字符作為當前字符,并觸發(fā)所述第一判斷模塊執(zhí)行判斷操作。
15.根據(jù)權(quán)利要求14所述的裝置,其特征在于,所述標準化子單元還包括第三判斷模塊,用于在第二判斷模塊的判斷結(jié)果為否之后,且在所述第二判斷模塊執(zhí)行將當前字符的下一個字符作為當前字符之前,判斷當前字符是否為between,如果否,觸發(fā)所述第二判斷模塊繼續(xù)執(zhí)行將當前字符的下一個字符作為當前字符的操作,如果是,發(fā)送處理通知給處理模塊;處理模塊,用于接收到所述處理通知后,確定當前字符的下一個字符為執(zhí)行參數(shù),將其替換為標準字符,并在該替換后的標準字符的下一個字符為and時,確定該and的下一個字符為執(zhí)行參數(shù),將其替換為標準字符,并將該替換后的標準字符的下一個字符確定為當前字符,并觸發(fā)所述第一判斷模塊執(zhí)行判斷操作。
16.根據(jù)權(quán)利要求13所述的裝置,其特征在于,所述標識生成子單元在生成標準SQL的標識之后進一步包括記錄標準SQL、該標準SQL的捕獲時間、以及該標準SQL的標識至已創(chuàng)建的采集數(shù)據(jù)庫表中,所述標準SQL的捕獲時間為捕獲該標準SQL對應的原始SQL的時間;所述定位單元包括采集子單元,用于從所述采集數(shù)據(jù)庫表中采集捕獲時間在設定統(tǒng)計周期內(nèi)的標準SQL 的標識;確定子單元,用于針對采集的每一標準SQL的標識,確定該標準SQL在所述設定統(tǒng)計周期內(nèi)的執(zhí)行頻率和執(zhí)行成本;定位子單元,用于將執(zhí)行頻率和執(zhí)行成本均大于對應閾值的標準SQL確定為需要優(yōu)化的關(guān)鍵SQL。
17.根據(jù)權(quán)利要求13至16任一所述的裝置,其特征在于,所述標識生成子單元利用設定的哈希HASH碼生成函數(shù),生成該標準SQL的哈希碼。
全文摘要
本發(fā)明提供了數(shù)據(jù)庫優(yōu)化方法和裝置,其中,該方法包括A,捕獲原始SQL;B,針對捕獲的每一原始SQL,對該原始SQL進行標準化處理,得到對應該原始SQL的標準SQL,并生成該標準SQL的標識;C,根據(jù)各個標準SQL的標識定位出需要優(yōu)化的關(guān)鍵SQL。采用本發(fā)明,能夠定位出關(guān)鍵SQL,利于數(shù)據(jù)庫優(yōu)化。
文檔編號G06F17/30GK102541884SQ20101059518
公開日2012年7月4日 申請日期2010年12月10日 優(yōu)先權(quán)日2010年12月10日
發(fā)明者何昱吾, 劉陽, 宋玉軍, 張黔, 杜鵬, 林昊, 陸恩波 申請人:中國移動通信集團貴州有限公司