本發(fā)明涉及數(shù)據(jù)庫(kù)
技術(shù)領(lǐng)域:
:,特別涉及一種數(shù)據(jù)庫(kù)SQL效率檢測(cè)方法及裝置。
背景技術(shù):
::數(shù)據(jù)庫(kù)SQL語(yǔ)句的執(zhí)行效率是常見(jiàn)的影響生產(chǎn)系統(tǒng)性能的突出因素。在軟件測(cè)試階段,一方面,往往由于SQL動(dòng)態(tài)性能測(cè)試過(guò)程人力消耗較大,針對(duì)性能方面的測(cè)試覆蓋面不夠,另一方面,數(shù)據(jù)分布差異等原因,導(dǎo)致SQL語(yǔ)句在測(cè)試環(huán)境跟生產(chǎn)環(huán)境的執(zhí)行方法不同,效率出現(xiàn)較大差異,因此部分?jǐn)?shù)據(jù)庫(kù)SQL性能問(wèn)題無(wú)法在測(cè)試階段發(fā)現(xiàn),而只能在生產(chǎn)實(shí)際運(yùn)行時(shí)才發(fā)現(xiàn),如此,很多原本容易解決的問(wèn)題,由于沒(méi)有提前檢測(cè)發(fā)現(xiàn),缺乏解決問(wèn)題的時(shí)間窗口,解決不及時(shí),會(huì)造成影響廣度、深度的升級(jí)。技術(shù)實(shí)現(xiàn)要素:本發(fā)明實(shí)施例的主要目的在于提出一種數(shù)據(jù)庫(kù)SQL效率檢測(cè)方法及裝置,為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種數(shù)據(jù)庫(kù)SQL效率檢測(cè)方法,包括:配置參數(shù);根據(jù)所述參數(shù)獲取待檢測(cè)程序的程序源碼,對(duì)所述程序源碼進(jìn)行解析,獲得SQL語(yǔ)句,將所述SQL語(yǔ)句與歷史基線表比對(duì),確定待分析的SQL語(yǔ)句;對(duì)所述待分析的SQL語(yǔ)句進(jìn)行分析,將結(jié)果記錄在分析明細(xì)表中;根據(jù)評(píng)估模型,對(duì)所述分析明細(xì)表中記錄的結(jié)果進(jìn)行評(píng)估??蛇x的,在本發(fā)明一實(shí)施例中,所述參數(shù)包括:目標(biāo)應(yīng)用數(shù)據(jù)庫(kù)的IP、端口、用戶(hù)、密碼、實(shí)例、檢查范圍、程序單元調(diào)度頻率表中的調(diào)度頻率以及操作類(lèi)型??蛇x的,在本發(fā)明一實(shí)施例中,所述確定待分析的SQL語(yǔ)句的步驟包括:根據(jù)所述參數(shù)獲得程序源碼范圍;從所述程序源碼范圍中讀入程序源碼;根據(jù)所述程序源碼對(duì)應(yīng)的程序語(yǔ)言規(guī)則,對(duì)所述程序源碼進(jìn)行解析,獲得SQL語(yǔ)句;在保留識(shí)別SQL語(yǔ)句的必要特征的基礎(chǔ)上,對(duì)所述SQL語(yǔ)句進(jìn)行格式化;根據(jù)格式化后的SQL語(yǔ)句獲得SQL語(yǔ)句的特征ID;根據(jù)SQL語(yǔ)句的特征ID和SQL的位置信息,對(duì)歷史基線表進(jìn)行查詢(xún);如果在所述歷史基線表中沒(méi)有查詢(xún)到相應(yīng)的SQL語(yǔ)句,則相應(yīng)的SQL語(yǔ)句為待分析的SQL語(yǔ)句??蛇x的,在本發(fā)明一實(shí)施例中,所述對(duì)所述待分析的SQL語(yǔ)句進(jìn)行分析的步驟包括:將標(biāo)準(zhǔn)格式化后的待分析SQL語(yǔ)句通過(guò)JDBC提交目標(biāo)應(yīng)用數(shù)據(jù)庫(kù),獲取執(zhí)行計(jì)劃;從所述執(zhí)行計(jì)劃中獲取單次執(zhí)行成本Ci,根據(jù)SQL語(yǔ)句所在的程序單元的調(diào)用頻率表中獲取調(diào)用頻率Qi,根據(jù)單次執(zhí)行成本Ci與調(diào)用頻率Qi確定單位時(shí)間總成本,根據(jù)單位時(shí)間總成本判斷SQL的影響程度;根據(jù)SQL的影響程度定制的基于SQL語(yǔ)句本身特征的檢查規(guī)則,對(duì)待分析的SQL語(yǔ)句進(jìn)行特征模型匹配,按匹配到的特征進(jìn)行檢查診斷;根據(jù)SQL的影響程度定制的基于SQL語(yǔ)句執(zhí)行計(jì)劃特征的檢查規(guī)則,對(duì)所述執(zhí)行計(jì)劃進(jìn)行特征模型匹配,按匹配到的特征進(jìn)行檢查診斷??蛇x的,在本發(fā)明一實(shí)施例中,所述評(píng)估模型用于比較新、舊完整版本程序的性能差異;其中,所述評(píng)估模型的表達(dá)式為:Dall=(Wnew-Wold/Wold)×100%式中,Dall表示新完整版本程序相對(duì)舊完整版本程序整體消耗增加比例;Wnew、Wold:分別是新、舊完整版本性能評(píng)估值??蛇x的,在本發(fā)明一實(shí)施例中,所述評(píng)估模型用于版本程序性能評(píng)估;其中,所述評(píng)估模型的表達(dá)式為:式中,i表示SQL語(yǔ)句的序列數(shù),Ci表示第i個(gè)SQL語(yǔ)句的執(zhí)行成本,從所述分析明細(xì)表中獲??;Qi表示第i個(gè)SQL語(yǔ)句的執(zhí)行頻率,從所述參數(shù)中的程序單元調(diào)度頻率表中獲?。籲表示需評(píng)估的SQL語(yǔ)句的條數(shù)。為實(shí)現(xiàn)上述目的,本發(fā)明還提供了一種數(shù)據(jù)庫(kù)SQL效率檢測(cè)裝置,包括:參數(shù)配置單元,用于配置參數(shù);SQL采集單元,用于根據(jù)所述參數(shù)獲取待檢測(cè)程序的程序源碼,對(duì)所述程序源碼進(jìn)行解析,獲得SQL語(yǔ)句,將所述SQL語(yǔ)句與歷史基線表比對(duì),確定待分析的SQL語(yǔ)句;分析單元,用于對(duì)所述待分析的SQL語(yǔ)句進(jìn)行分析,將結(jié)果記錄在分析明細(xì)表中;評(píng)估單元,用于根據(jù)評(píng)估模型,對(duì)所述分析明細(xì)表中記錄的結(jié)果進(jìn)行評(píng)估??蛇x的,在本發(fā)明一實(shí)施例中,所述參數(shù)配置單元配置的參數(shù)包括:目標(biāo)應(yīng)用數(shù)據(jù)庫(kù)的IP、端口、用戶(hù)、密碼、實(shí)例、檢查范圍、程序單元調(diào)度頻率表中的調(diào)度頻率以及操作類(lèi)型??蛇x的,在本發(fā)明一實(shí)施例中,所述SQL采集單元包括:程序源碼范圍確定模塊,用于根據(jù)所述參數(shù)獲得程序源碼范圍;程序源碼獲取模塊,用于從所述程序源碼范圍中讀入程序源碼;SQL語(yǔ)句確定模塊,用于根據(jù)所述程序源碼對(duì)應(yīng)的程序語(yǔ)言規(guī)則,對(duì)所述程序源碼進(jìn)行解析,獲得SQL語(yǔ)句;格式化模塊,用于在保留識(shí)別SQL語(yǔ)句的必要特征的基礎(chǔ)上,對(duì)所述SQL語(yǔ)句進(jìn)行格式化;特征提取模塊,用于根據(jù)格式化后的SQL語(yǔ)句獲得SQL語(yǔ)句的特征ID;待分析的SQL語(yǔ)句確定模塊,用于根據(jù)SQL語(yǔ)句的特征ID和SQL的位置信息,對(duì)歷史基線表進(jìn)行查詢(xún);如果在所述歷史基線表中沒(méi)有查詢(xún)到相應(yīng)的SQL語(yǔ)句,則相應(yīng)的SQL語(yǔ)句為待分析的SQL語(yǔ)句。可選的,在本發(fā)明一實(shí)施例中,所述分析單元包括:執(zhí)行計(jì)劃獲取模塊,用于將標(biāo)準(zhǔn)格式化后的待分析SQL語(yǔ)句通過(guò)JDBC提交目標(biāo)應(yīng)用數(shù)據(jù)庫(kù),獲取執(zhí)行計(jì)劃;執(zhí)行成本確定模塊,用于從所述執(zhí)行計(jì)劃中獲取單次執(zhí)行成本Ci,根據(jù)SQL語(yǔ)句所在的程序單元的調(diào)用頻率表中獲取調(diào)用頻率Qi,根據(jù)單次執(zhí)行成本Ci與調(diào)用頻率Qi確定單位時(shí)間總成本,根據(jù)單位時(shí)間總成本判斷SQL的影響程度;第一檢查診斷模塊,用于根據(jù)SQL的影響程度定制的基于SQL語(yǔ)句本身特征的檢查規(guī)則,對(duì)待分析的SQL語(yǔ)句進(jìn)行特征模型匹配,按匹配到的特征進(jìn)行檢查診斷;第二檢查診斷模塊,用于根據(jù)SQL的影響程度定制的基于SQL語(yǔ)句執(zhí)行計(jì)劃特征的檢查規(guī)則,對(duì)所述執(zhí)行計(jì)劃進(jìn)行特征模型匹配,按匹配到的特征進(jìn)行檢查診斷??蛇x的,在本發(fā)明一實(shí)施例中,所述評(píng)估單元用于比較新、舊完整版本程序的性能差異;其中,所述評(píng)估單元的評(píng)估模型的表達(dá)式為:Dall=(Wnew-Wold/Wold)×100%式中,Dall表示新完整版本程序相對(duì)舊完整版本程序整體消耗增加比例;Wnew、Wold:分別是新、舊完整版本性能評(píng)估值。可選的,在本發(fā)明一實(shí)施例中,所述評(píng)估單元用于版本程序性能評(píng)估;其中,所述評(píng)估單元的評(píng)估模型的表達(dá)式為:式中,i表示SQL語(yǔ)句的序列數(shù),Ci表示第i個(gè)SQL語(yǔ)句的執(zhí)行成本,從所述分析明細(xì)表中獲?。籕i表示第i個(gè)SQL語(yǔ)句的執(zhí)行頻率,從所述參數(shù)中的程序單元調(diào)度頻率表中獲取;n表示需評(píng)估的SQL語(yǔ)句的條數(shù)。上述技術(shù)方案具有如下有益效果:本技術(shù)方案可以快速有效的覆蓋目標(biāo)范圍,不需要實(shí)際執(zhí)行SQL語(yǔ)句,不影響業(yè)務(wù)數(shù)據(jù),適用于數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程程序的檢測(cè)。并且,本技術(shù)方案能夠基于舊程序的數(shù)據(jù)快速檢查評(píng)估新版本程序的SQL效率情況,提高版本升級(jí)的運(yùn)行安全和性能。附圖說(shuō)明為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1為本發(fā)明提出的一種數(shù)據(jù)庫(kù)SQL效率檢測(cè)方法流程圖;圖2為本發(fā)明提出的一種數(shù)據(jù)庫(kù)SQL效率檢測(cè)裝置框圖;圖3為數(shù)據(jù)庫(kù)SQL效率檢測(cè)裝置中SQL采集單元的功能框圖;圖4為數(shù)據(jù)庫(kù)SQL效率檢測(cè)裝置中分析單元的功能框圖。具體實(shí)施方式下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。本技術(shù)方案的工作原理為:本技術(shù)方案是基于SQL語(yǔ)句執(zhí)行計(jì)劃的特征對(duì)SQL效率問(wèn)題進(jìn)行檢查識(shí)別,該特征包含一些常見(jiàn)的低效的SQL執(zhí)行方式,包含但不限于大表全表掃描,低效的跳躍掃描,笛卡爾聯(lián)合等。本技術(shù)方案基于SQL特征的增量進(jìn)行檢測(cè),其主要的SQL特證包括對(duì)SQL語(yǔ)句進(jìn)行標(biāo)準(zhǔn)格式化后生成的唯一標(biāo)示(SQL特征ID),輔助特證為SQL語(yǔ)句的程序單元位置信息。投產(chǎn)前,基于原有程序版本建立的基于SQL特證的歷史版本基線,投產(chǎn)后通過(guò)新版本程序與歷史版本基線進(jìn)行比對(duì)獲得增量SQL。這里的標(biāo)準(zhǔn)格式化,涉及去除多余注釋、去除冗余空白字符,綁定變量類(lèi)型替換,統(tǒng)一大小寫(xiě)等一系列操作。本技術(shù)方案引入程序單元調(diào)度頻率作為SQL效率影響范圍的重要評(píng)估因素。SQL語(yǔ)句的調(diào)度是以過(guò)程或函數(shù)的程序單元作為單位進(jìn)行調(diào)度,一個(gè)SQL語(yǔ)句的效率問(wèn)題影響范圍評(píng)估模型需要結(jié)合SQL本身的處理效率和程序單元調(diào)度頻率綜合計(jì)算得到。程序單元調(diào)度頻率對(duì)于已有的程序單元(過(guò)程或函數(shù))可以從生產(chǎn)數(shù)據(jù)庫(kù)日常運(yùn)行中進(jìn)行統(tǒng)計(jì)得到,對(duì)于新增的程序單元,需要進(jìn)行結(jié)合業(yè)務(wù)特征進(jìn)行預(yù)估?;谏鲜龉ぷ髟?,本發(fā)明提出一種數(shù)據(jù)庫(kù)SQL效率檢測(cè)方法,如圖1所示。包括:步驟101):配置參數(shù);在本步驟中,參數(shù)包括目標(biāo)應(yīng)用數(shù)據(jù)庫(kù)的IP、端口、用戶(hù)、密碼、實(shí)例、檢查范圍、程序單元調(diào)度頻率以及操作類(lèi)型。其中,操作類(lèi)型的編號(hào)為0,表示建立歷史版本基線;操作類(lèi)型的編號(hào)為1,表示對(duì)當(dāng)前版本進(jìn)行分析評(píng)估。步驟102):根據(jù)所述參數(shù)獲取待檢測(cè)程序的程序源碼,對(duì)所述程序源碼進(jìn)行解析,獲得SQL語(yǔ)句,將所述SQL語(yǔ)句與歷史基線表比對(duì),確定待分析的SQL語(yǔ)句;在本步驟中,具體包括:步驟1:根據(jù)配置的參數(shù)獲取到程序源碼范圍(程序單元),最常見(jiàn)的有存儲(chǔ)過(guò)程包名,存儲(chǔ)過(guò)程名,函數(shù)名等,這里獲取方式可以是從安裝腳本里解析獲取,也可以通過(guò)配置的方式定義需要檢查的源碼單元對(duì)象。步驟2:讀入程序源碼,通??梢酝ㄟ^(guò)版本的安裝腳本或者連到目標(biāo)數(shù)據(jù)庫(kù)獲取。如通過(guò)oracle可通過(guò)user_source視圖進(jìn)行獲?。篠ELECTtextFROMUser_SourcetWHEREt.name='CIDP_PCKG_GEN_QUERY'ANDt.TYPE='PACKAGE'ORDERBYt.line步驟3:根據(jù)源碼對(duì)應(yīng)的程序語(yǔ)言規(guī)則,對(duì)源碼進(jìn)行解析,包括拆分出SQL語(yǔ)句,對(duì)全局變量、局部變量、游標(biāo)變量等的變量、類(lèi)型、作用域范圍的識(shí)別。步驟4:對(duì)得到的SQL語(yǔ)句進(jìn)行格式化,保留識(shí)別SQL語(yǔ)句的必要特征。操作包括,識(shí)別SQL語(yǔ)句的輸入變量,根據(jù)步驟403識(shí)別到的變量類(lèi)型,按相應(yīng)的類(lèi)型對(duì)變量進(jìn)行替換,大小寫(xiě)轉(zhuǎn)換,冗余空白字符消除等等。變量替換涉及如下表1,表1為變量替換規(guī)則表,即將變量替換為變量類(lèi)型對(duì)應(yīng)的綁定變量標(biāo)識(shí)加變量出現(xiàn)順序號(hào),如V1,其中1為變量第一次出現(xiàn)的順序號(hào)。表1步驟5:對(duì)新版本SQL語(yǔ)句與舊版本進(jìn)行比對(duì),生成SQL語(yǔ)句的特征ID,最常見(jiàn)的是通過(guò)MD5方法生成。步驟6:一般程序投產(chǎn)前,需要建立歷史版本的基線,此時(shí)只記錄歷史版本中SQL的特征,獲取執(zhí)行成本,不進(jìn)行具體性能分析,配置中設(shè)置參數(shù)"僅建基線=是"。在本實(shí)施例中,將SQL的特征記錄到一存儲(chǔ)單元的歷史基線表中,信息主要包括SQL語(yǔ)句特征ID、SQL的位置信息(如包名)、執(zhí)行成本、未做任何處理的SQL語(yǔ)句、格式化后的SQL語(yǔ)句等。步驟7:當(dāng)"僅建基線=否",一般是投產(chǎn)后進(jìn)行檢查分析,此時(shí)需要與投產(chǎn)前建立的歷史版本基線進(jìn)行對(duì)比,通過(guò)SQL語(yǔ)句特征ID、SQL的位置信息對(duì)歷史基線表進(jìn)行查詢(xún),如果找到記錄,則認(rèn)為SQL語(yǔ)句為歷史存在語(yǔ)句;否則認(rèn)為是新增或修改的語(yǔ)句,需要進(jìn)行分析。步驟8:將SQL語(yǔ)句信息(主要包括SQL語(yǔ)句特征ID、SQL的位置信息(如包名)、未做任何處理的SQL語(yǔ)句、格式化后的SQL語(yǔ)句等)記錄到存儲(chǔ)單元的待分析表中。在本實(shí)施例中,存儲(chǔ)單元的數(shù)據(jù)庫(kù)表結(jié)構(gòu)至少包括以下部分:A、程序單元調(diào)用頻率表:用于存儲(chǔ)程序單元的調(diào)用頻率,在參數(shù)配置時(shí)產(chǎn)生。B、歷史基線表:用于存儲(chǔ)步驟102第一階段收集到的投產(chǎn)前版本的SQL特征數(shù)據(jù),包括SQL的特征ID,所屬的程序單元、子程序單元等位置信息。C、分析表:用于存儲(chǔ)步驟102確定的待分析的SQL語(yǔ)句,該語(yǔ)句包括SQL的特征ID、所屬的程序單元、子程序單元、標(biāo)準(zhǔn)格式化后的SQL語(yǔ)句。D、分析明細(xì)表:通過(guò)SQL的特征ID與分析表關(guān)聯(lián),用于存儲(chǔ)分析結(jié)果,包括問(wèn)題類(lèi)型、問(wèn)題描述等。E、數(shù)據(jù)增長(zhǎng)情況表:記錄目標(biāo)數(shù)據(jù)庫(kù)中各表數(shù)據(jù)的增長(zhǎng)情況,可以通過(guò)定期從ORACLE統(tǒng)計(jì)視圖采集進(jìn)行比較獲得。步驟103):對(duì)所述待分析的SQL語(yǔ)句進(jìn)行分析,將結(jié)果記錄在分析明細(xì)表中;在本步驟中,具體包括:步驟1’:從存儲(chǔ)單元中的分析表中依次取出已經(jīng)進(jìn)行標(biāo)準(zhǔn)格式化后的待分析SQL語(yǔ)句、SQL所在的程序單元等信息。步驟2’:將SQL語(yǔ)句通過(guò)JDBC提交目標(biāo)應(yīng)用數(shù)據(jù)庫(kù),獲取執(zhí)行計(jì)劃。步驟3’:執(zhí)行成本檢查,從執(zhí)行計(jì)劃中獲取單次執(zhí)行成本Ci,根據(jù)SQL所在的程序單元從程序單元調(diào)用頻率表中獲取調(diào)用頻率Qi,計(jì)算單位時(shí)間總成本COST合計(jì)=Ci×Qi,根據(jù)下表2的對(duì)照關(guān)系,判斷SQL的影響程度。表2步驟4’:根據(jù)SQL的影響程度定制基于SQL語(yǔ)句本身特征的檢查規(guī)則,包括匹配特征和診斷方法兩部分,常見(jiàn)的可通過(guò)正則表達(dá)式對(duì)SQL語(yǔ)句進(jìn)行特征模型匹配,按匹配到的特征進(jìn)行檢查診斷。例如:全表刪除的特征模型正則表達(dá)式:DELETE\s+FROM\s+\w+(\s+\w+){0,1};檢查診斷操作:從統(tǒng)計(jì)視圖user_tables中查詢(xún)表包含的數(shù)據(jù)塊數(shù)量BLOCKS,當(dāng)BLOCKS大于閥值(可通過(guò)主控單元1配置),系統(tǒng)建議改用TRUNCATE的方式進(jìn)行刪除,否則忽略影響。步驟5’:根據(jù)SQL的影響程度定制基于SQL語(yǔ)句執(zhí)行計(jì)劃特征的檢查規(guī)則,包括匹配特征和診斷方法兩部分,此步驟對(duì)執(zhí)行計(jì)劃進(jìn)行特征模型匹配,按匹配到的特征進(jìn)行檢查診斷。例如:全表掃描特征模型:正則表達(dá)式:TABLEACCESSFULL檢查診斷操作:1)、查詢(xún)數(shù)據(jù)增長(zhǎng)情況表,獲取涉及全表掃描的表的數(shù)據(jù)塊數(shù)量及月增長(zhǎng)速率,按照下表3確定影響級(jí)別。表32)、如果1)中結(jié)果非“忽略”級(jí)別,則取全表掃描表對(duì)象的條件字段,依次檢查表對(duì)象的索引是否包含該字段,如果表對(duì)象的所有索引均未包含該字段,則定位原因?yàn)樗饕窗瑮l件字段。3)、依次通過(guò)統(tǒng)計(jì)表檢查條件字段的選擇性,比較不同字段選擇性,即字段取不同值的個(gè)數(shù)的多少,以多者為建議索引字段。步驟6’:更新分析表記錄狀態(tài)為完成,同時(shí)將上述步驟3’、步驟4’、步驟5’的結(jié)果更新到分析明細(xì)表。步驟104):根據(jù)評(píng)估模型,對(duì)所述分析明細(xì)表中記錄的結(jié)果進(jìn)行評(píng)估。在本步驟中,包括兩種評(píng)估方法。其中,第一種方法為:根據(jù)評(píng)估模型,對(duì)所述分析明細(xì)表中記錄的結(jié)果進(jìn)行評(píng)估。所述評(píng)估模型用于比較新、舊完整版本程序的性能差異;其中,所述評(píng)估模型的表達(dá)式為:Dall=(Wnew-Wold/Wold)×100%式中,Dall表示新完整版本程序相對(duì)舊完整版本程序整體消耗增加比例;Wnew、Wold:分別是新、舊完整版本性能評(píng)估值。在這種方法中,可以實(shí)現(xiàn)兩種方式的版本性能差異評(píng)估。場(chǎng)景一:分析比較前后版本完整版本的差異;對(duì)Wold、Wnew的計(jì)算分別涉及數(shù)據(jù)庫(kù)的所有程序單元的所有SQL語(yǔ)句,常用于程序發(fā)生大量修改或者數(shù)據(jù)量變化較大的情形。場(chǎng)景二:分析比較前后版本增量版本的差異;對(duì)Wold、Wnew的計(jì)算僅涉及檢查范圍的程序單元的所有SQL語(yǔ)句,常用于程序少量修改或者數(shù)據(jù)量比較穩(wěn)定的情形。第二種方法為:所述評(píng)估模型用于版本程序性能評(píng)估;其中,所述評(píng)估模型的表達(dá)式為:式中,i表示SQL語(yǔ)句的序列數(shù),Ci表示第i個(gè)SQL語(yǔ)句的執(zhí)行成本,從所述分析明細(xì)表中獲?。籕i表示第i個(gè)SQL語(yǔ)句的執(zhí)行頻率,從所述參數(shù)中的程序單元調(diào)度頻率表中獲取;n表示需評(píng)估的SQL語(yǔ)句的條數(shù)。在本技術(shù)方案中,可以將步驟104評(píng)估的結(jié)果生成文件形式提供給用戶(hù)。比如:將整體評(píng)估結(jié)果和存在問(wèn)題的SQL明細(xì)以文檔形式輸出或輸出到主控單元1的用戶(hù)交互界面。存在問(wèn)題的SQL明細(xì)包括以下基本要素:SQL的位置(程序單元名、子單元名)、未標(biāo)準(zhǔn)化的原始SQL、性能風(fēng)險(xiǎn)等級(jí)、存在問(wèn)題或初步診斷結(jié)果等。如圖2所示,為本發(fā)明提出的一種數(shù)據(jù)庫(kù)SQL效率檢測(cè)裝置的框圖。包括:參數(shù)配置單元201,用于配置參數(shù);在本實(shí)施例中,所述參數(shù)配置單元配置的參數(shù)包括:目標(biāo)應(yīng)用數(shù)據(jù)庫(kù)的IP、端口、用戶(hù)、密碼、實(shí)例、檢查范圍、程序單元調(diào)度頻率表中的調(diào)度頻率以及操作類(lèi)型。SQL采集單元202,用于根據(jù)所述參數(shù)獲取待檢測(cè)程序的程序源碼,對(duì)所述程序源碼進(jìn)行解析,獲得SQL語(yǔ)句,將所述SQL語(yǔ)句與歷史基線表比對(duì),確定待分析的SQL語(yǔ)句;分析單元203,用于對(duì)所述待分析的SQL語(yǔ)句進(jìn)行分析,將結(jié)果記錄在分析明細(xì)表中;評(píng)估單元204,用于根據(jù)評(píng)估模型,對(duì)所述分析明細(xì)表中記錄的結(jié)果進(jìn)行評(píng)估。在本實(shí)施例中,如圖3所示,為檢測(cè)裝置中SQL采集單元的功能框圖。包括:程序源碼范圍確定模塊2021,用于根據(jù)所述參數(shù)獲得程序源碼范圍;程序源碼獲取模塊2022,用于從所述程序源碼范圍中讀入程序源碼;SQL語(yǔ)句確定模塊2023,用于根據(jù)所述程序源碼對(duì)應(yīng)的程序語(yǔ)言規(guī)則,對(duì)所述程序源碼進(jìn)行解析,獲得SQL語(yǔ)句;格式化模塊2024,用于在保留識(shí)別SQL語(yǔ)句的必要特征的基礎(chǔ)上,對(duì)所述SQL語(yǔ)句進(jìn)行格式化;特征提取模塊2025,用于根據(jù)格式化后的SQL語(yǔ)句獲得SQL語(yǔ)句的特征ID;待分析的SQL語(yǔ)句確定模塊2026,用于根據(jù)SQL語(yǔ)句的特征ID和SQL的位置信息,對(duì)歷史基線表進(jìn)行查詢(xún);如果在所述歷史基線表中沒(méi)有查詢(xún)到相應(yīng)的SQL語(yǔ)句,則相應(yīng)的SQL語(yǔ)句為待分析的SQL語(yǔ)句。如圖4所示,為檢測(cè)裝置中分析單元的功能框圖。包括:執(zhí)行計(jì)劃獲取模塊2031,用于將標(biāo)準(zhǔn)格式化后的待分析SQL語(yǔ)句通過(guò)JDBC提交目標(biāo)應(yīng)用數(shù)據(jù)庫(kù),獲取執(zhí)行計(jì)劃;執(zhí)行成本確定模塊2032,用于從所述執(zhí)行計(jì)劃中獲取單次執(zhí)行成本Ci,根據(jù)SQL語(yǔ)句所在的程序單元的調(diào)用頻率表中獲取調(diào)用頻率Qi,根據(jù)單次執(zhí)行成本Ci與調(diào)用頻率Qi確定單位時(shí)間總成本,根據(jù)單位時(shí)間總成本判斷SQL的影響程度;第一檢查診斷模塊2033,用于根據(jù)SQL的影響程度定制的基于SQL語(yǔ)句本身特征的檢查規(guī)則,對(duì)待分析的SQL語(yǔ)句進(jìn)行特征模型匹配,按匹配到的特征進(jìn)行檢查診斷;第二檢查診斷模塊2034,用于根據(jù)SQL的影響程度定制的基于SQL語(yǔ)句執(zhí)行計(jì)劃特征的檢查規(guī)則,對(duì)所述執(zhí)行計(jì)劃進(jìn)行特征模型匹配,按匹配到的特征進(jìn)行檢查診斷。以下是應(yīng)用本發(fā)明的一個(gè)實(shí)施例:版本涉及對(duì)存儲(chǔ)過(guò)程PROC_AI4405等進(jìn)行修改,這里僅以PROC_AI4405作為例子進(jìn)行說(shuō)明。修改前的功能是根據(jù)傳入?yún)?shù)手機(jī)號(hào)碼和業(yè)務(wù)日期,查詢(xún)返回業(yè)務(wù)申請(qǐng)編號(hào)APP_NUMBER。修改后的功能是參數(shù)增加身份證號(hào),如果傳入的手機(jī)號(hào)碼為空,則根據(jù)用戶(hù)身份證號(hào),從用戶(hù)表中查出手機(jī)號(hào)碼,再根據(jù)傳入的手機(jī)號(hào)碼和業(yè)務(wù)日期,查詢(xún)返回業(yè)務(wù)申請(qǐng)編號(hào)APP_NUMBER。修改前存儲(chǔ)過(guò)程源碼如下:修改后存儲(chǔ)過(guò)程源碼如下:應(yīng)用本發(fā)明的方法,針對(duì)此次版本修改進(jìn)行評(píng)估驗(yàn)證,具體步驟如下:1、用戶(hù)確定本次修改范圍,首先維護(hù)檢查范圍為"PROC_AI4405;..."(通??梢杂砂姹竟芾砉ぞ邔?dǎo)出修改清單,這里不贅述)2、投產(chǎn)前,用戶(hù)選擇“創(chuàng)建歷史基線”,提交執(zhí)行。3、連接到目標(biāo)應(yīng)用的數(shù)據(jù)庫(kù),獲取PROC_AI4405的源碼。4、解析出PROC_AI4405各變量的類(lèi)型(oracle存儲(chǔ)過(guò)程不區(qū)分大小寫(xiě)),見(jiàn)下表4。表4變量名稱(chēng)類(lèi)型I_PHONE_NUMBERVARCHAR2I_TRADE_DATEVARCHAR2O_RETCODEVARCHAR2O_APP_NUMBERVARCHAR25、根據(jù)語(yǔ)法識(shí)別到SQL如下語(yǔ)句:SELECTAPP_NUMBERintoO_APP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=I_PHONE_NUMBERandAPP_DATE=I_TRADE_DATE;6、對(duì)SQL進(jìn)行標(biāo)準(zhǔn)格式化1)去除變量賦值部分“intoO_APP_NUMBER”語(yǔ)句轉(zhuǎn)換為如下:SELECTAPP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=I_PHONE_NUMBERandAPP_DATE=I_TRADE_DATE2)轉(zhuǎn)換為大寫(xiě),此處涉及“and”字符串SELECTAPP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=I_PHONE_NUMBERANDAPP_DATE=I_TRADE_DATE3)替換變量為綁定變量格式由上述步驟4,可以知道I_PHONE_NUMBER、I_TRADE_DATE均為對(duì)應(yīng)字符型VARCHAR2,根據(jù)變量替換規(guī)則表進(jìn)行替換,結(jié)果如下SELECTAPP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=:V1ANDAPP_DATE=:V24)對(duì)無(wú)意義的空白字符進(jìn)行格式化,統(tǒng)一任意多個(gè)空白字符為單個(gè)空白字符。處理后語(yǔ)句如下:SELECTAPP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=:V1ANDAPP_DATE=:V27、根據(jù)格式化后的標(biāo)準(zhǔn)語(yǔ)句生成SQL特征ID(SQL_ID),此處使用MD5,8、將結(jié)果存入歷史基線表中,主要信息如下表5。表59、投產(chǎn)后,檢查評(píng)估操作。10、通過(guò)目標(biāo)應(yīng)用的數(shù)據(jù)庫(kù),獲取版本投產(chǎn)后PROC_AI4405的源碼。11、解析出PROC_AI4405各變量的類(lèi)型(oracle存儲(chǔ)過(guò)程不區(qū)分大小寫(xiě)),見(jiàn)下表6。表6變量名稱(chēng)類(lèi)型備注說(shuō)明I_PHONE_NUMBERVARCHAR2I_TRADE_DATEVARCHAR2I_IDENTITY_IDVARCHAR2版本新增的輸入變量O_RETCODEVARCHAR2O_APP_NUMBERVARCHAR2V_PHONE_NUMBERVARCHAR2版本新增的新增過(guò)程變量12、根據(jù)語(yǔ)法識(shí)別到2個(gè)SQL語(yǔ)句,其中語(yǔ)句B與投產(chǎn)前版本在變量使用上有變化,如下:語(yǔ)句A:SELECTphone_numINTOV_PHONE_NUMBERFROMUSER_INFOTWHEREIDENTITY_NUM=I_IDENTITY_ID語(yǔ)句B:SELECTAPP_NUMBERINTOO_APP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=V_PHONE_NUMBERANDAPP_DATE=I_TRADE_DATE13、對(duì)SQL進(jìn)行標(biāo)準(zhǔn)格式化1)去除變量賦值部分,語(yǔ)句轉(zhuǎn)換為如下:語(yǔ)句A:SELECTphone_numFROMUSER_INFOTWHEREIDENTITY_NUM=I_IDENTITY_ID語(yǔ)句B:SELECTAPP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=V_PHONE_NUMBERANDAPP_DATE=I_TRADE_DATE2)轉(zhuǎn)換為大寫(xiě),此處涉及“phone_num”,“and”字符串語(yǔ)句A:SELECTPHONE_NUMFROMUSER_INFOTWHEREIDENTITY_NUM=I_IDENTITY_ID語(yǔ)句B:SELECTAPP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=V_PHONE_NUMBERANDAPP_DATE=I_TRADE_DATE3)替換變量為綁定變量格式由上述步驟4,可以知道V_PHONE_NUMBER、I_TRADE_DATE、I_IDENTITY_ID均為對(duì)應(yīng)字符型VARCHAR2,根據(jù)變量替換規(guī)則表進(jìn)行替換,結(jié)果如下:語(yǔ)句A:SELECTPHONE_NUMFROMUSER_INFOTWHEREIDENTITY_NUM=:V1語(yǔ)句B:SELECTAPP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=:V1ANDAPP_DATE=:V24)對(duì)無(wú)意義的空白字符進(jìn)行格式化,統(tǒng)一任意多個(gè)空白字符為單個(gè)空白字符。處理后語(yǔ)句如下:語(yǔ)句A:SELECTPHONE_NUMFROMUSER_INFOTWHEREIDENTITY_NUM=:V1語(yǔ)句B:SELECTAPP_NUMBERFROMTRADE_APP_INFOTWHERET.PHONE_NUM=:V1ANDAPP_DATE=:V214、根據(jù)格式化后的標(biāo)準(zhǔn)語(yǔ)句生成SQL特征ID,此處使用MD5??梢钥吹酱颂幙梢钥吹秸Z(yǔ)句B雖然跟上個(gè)版本略有變化,但這種變化并不影響執(zhí)行計(jì)劃,切標(biāo)準(zhǔn)格式化后,與上個(gè)版本一致。SQL特征ID:892E43A66B62137B9802D4D930A19458語(yǔ)句B:SQL特征ID:F2B4AA3BFA522D3141E747AABEA0CBA9語(yǔ)句A:15、針對(duì)語(yǔ)句A、B分別執(zhí)行查詢(xún)語(yǔ)句,從歷史基線表中判斷是否存在語(yǔ)句A:SELECTCOUNT(1)FROMHISTORY_LINETWHERET.SQL_ID='892E43A66B62137B9802D4D930A19458'andprogram_unit=’PROC_AI4405’;返回0,表示歷史基線表中不存在,需要進(jìn)入下一步檢查。語(yǔ)句B:SELECTCOUNT(1)FROMHISTORY_LINETWHERET.SQL_ID='F2B4AA3BFA522D3141E747AABEA0CBA9'andprogram_unit=’PROC_AI4405’;返回1,表示歷史基線表中存在此SQL,無(wú)需要進(jìn)一步檢查。16、對(duì)待分析SQL,依次執(zhí)行步驟17、18、19;17、通過(guò)JDBC連接到目標(biāo)應(yīng)用數(shù)據(jù)庫(kù),生成執(zhí)行計(jì)劃,如下:18、獲取總的執(zhí)行成本COST,記為Ci=1961,根據(jù)SQL所在的源程序單元查詢(xún)程序單元調(diào)用頻率表,取得SQL每分鐘的執(zhí)行頻率Qi=1000,COST合計(jì)=Ci×Qi=1961*1000=1961000,參照以下表7獲得影響級(jí)別“嚴(yán)重”。表7登記分析明細(xì)表,內(nèi)容如下表8:表8ID問(wèn)題類(lèi)型問(wèn)題描述語(yǔ)句A分鐘執(zhí)行成本高COST=1961,頻率=1000,達(dá)到“嚴(yán)重”級(jí)別獲取總的執(zhí)行成本COST,遍歷執(zhí)行計(jì)劃匹配特征模型,匹配到“TABLEACCESSFULL”,即全表掃描。從存儲(chǔ)單元的數(shù)據(jù)增長(zhǎng)情況表查詢(xún)表對(duì)象USER_INFO的表的數(shù)據(jù)塊數(shù)量(5000)和增長(zhǎng)速度(15%),依照下表9獲取影響級(jí)別“警告”。表9登記分析明細(xì)表,內(nèi)容如下表10:表1019、更新語(yǔ)句A的分析表狀態(tài)為分析完畢。20、對(duì)所有SQL語(yǔ)句分析完畢之后對(duì)整個(gè)版本進(jìn)行評(píng)估。21、按照版本性能差異評(píng)估方法,計(jì)算出整體評(píng)估值Dall=100%×(Wnew-Wold)/Wold=100%*((50*1000+1961*1000)-50*1000)/(50*1000)=3922%即差異39倍,在本次小樣本的修改中,影響明顯。這里僅為舉例說(shuō)明,樣本比較小,故差異比較大。22、最后輸出分析的結(jié)果。由上述實(shí)施例可知,本技術(shù)方案能夠在版本安裝后、且實(shí)際業(yè)務(wù)上線之前,快速檢查評(píng)估新版本程序的SQL效率情況,提高版本升級(jí)的運(yùn)行安全和性能。以上具體實(shí)施方式,對(duì)本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說(shuō)明,所應(yīng)理解的是,以上僅為本發(fā)明的具體實(shí)施方式而已,并不用于限定本發(fā)明的保護(hù)范圍,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。當(dāng)前第1頁(yè)1 2 3 當(dāng)前第1頁(yè)1 2 3