一種sql語句執(zhí)行頻次動態(tài)調(diào)整方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種數(shù)據(jù)庫優(yōu)化處理方法,尤其涉及一種SQL語句執(zhí)行頻次動態(tài)調(diào)整 方法。
【背景技術(shù)】
[0002] 在數(shù)據(jù)庫系統(tǒng)運行過程中,經(jīng)常出現(xiàn)以下兩種情況:
[0003] 1、SQL語句未使用綁定變量,每一個謂詞的唯一值都有可能在查詢時產(chǎn)生不同的 SQL語句,多個謂詞甚至產(chǎn)生笛卡爾積,導(dǎo)致同一個查詢功能點產(chǎn)生數(shù)量極多的SQL語句, 每個SQL的執(zhí)行頻次非常低,在數(shù)據(jù)庫中重復(fù)解析,極大地增加了數(shù)據(jù)庫負(fù)擔(dān),并產(chǎn)生內(nèi)存 碎片問題。
[0004] 2、SQL語句使用了綁定變量,但是由于前臺業(yè)務(wù)操作頻繁,導(dǎo)致某一個SQL執(zhí)行頻 次過高,會話嘗試以共享模式來獲得一個游標(biāo)時,需要修改相應(yīng)的Mutex結(jié)構(gòu)的引用計數(shù), 產(chǎn)生了競爭和非空閑等待,影響了SQL的執(zhí)行時間。
[0005] 目前業(yè)界一般采用以下方法進(jìn)行避免:
[0006] 1、開發(fā)SQL時統(tǒng)一使用綁定變量,除謂詞的值存在分布不均勻,且唯一值個數(shù)較 小,需要每一個值對應(yīng)不同的SQL,以穩(wěn)定執(zhí)行計劃。
[0007] 2、SQL使用綁定變量后,評估SQL的執(zhí)行頻次,如果頻次較高,通過添加hint的方 式,將同一個SQL的文本變?yōu)椴煌?,使之在解析時成為不同的SQL。
[0008] 目前的方式存在以下不足:
[0009] 1、開發(fā)人員對數(shù)據(jù)庫專業(yè)知識了解不夠深入,版本上線管控難以完全到位,現(xiàn)在 普遍各數(shù)據(jù)庫系統(tǒng)中仍存在較多未使用綁定變量情況,但是改造工作涉及到代碼變更,存 在風(fēng)險。
[0010] 2、謂詞值的分布情況會隨著數(shù)據(jù)增長而改變,設(shè)計時考慮的不適用于改變后的情 況。
[0011] 3、SQL頻次會隨著業(yè)務(wù)增長而改變,設(shè)計時拆分SQL涉及到代碼變更,無法動態(tài)調(diào) 整。
【發(fā)明內(nèi)容】
[0012] 本發(fā)明所要解決的技術(shù)問題是提供一種SQL語句執(zhí)行頻次動態(tài)調(diào)整方法,能夠?qū)?SQL是否使用綁定變量進(jìn)行動態(tài)調(diào)整,并動態(tài)調(diào)整通道,以適應(yīng)SQL頻次波動情況,提升數(shù) 據(jù)庫處理性能。
[0013] 本發(fā)明為解決上述技術(shù)問題而采用的技術(shù)方案是提供一種SQL語句執(zhí)行頻次動 態(tài)調(diào)整方法,包括如下步驟:a)監(jiān)聽客戶端的發(fā)送請求,獲取操作數(shù)據(jù)庫的SQL語句;b)對 獲取的SQL語句進(jìn)行解析,將SQL中謂詞條件進(jìn)行規(guī)整化處理,統(tǒng)一綁定變量,并為統(tǒng)一規(guī) 整化處理后SQL語句分配新的SQL_ID;c)在數(shù)據(jù)庫服務(wù)端定期采集各規(guī)整后SQL語句的執(zhí) 行頻次;d)如果存在執(zhí)行頻次超過預(yù)設(shè)頻次閥值的SQL語句,產(chǎn)生新的SQL語句替換原有 SQL語句,重復(fù)步驟b),并將規(guī)整化處理后的新SQL轉(zhuǎn)發(fā)至數(shù)據(jù)庫服務(wù)端運行。
[0014] 上述的SQL語句執(zhí)行頻次動態(tài)調(diào)整方法,其中,所述步驟b)從ORACLE數(shù)據(jù)庫中查 詢系統(tǒng)統(tǒng)計信息表視圖DBA_TAB_COL_STATISTICS,采集字段NUM_DISTINCT獲取SQL中涉 及謂詞的唯一值,如果SQL中涉及謂詞的唯一值低于預(yù)設(shè)閥值,則不進(jìn)行規(guī)整化處理。
[0015] 上述的SQL語句執(zhí)行頻次動態(tài)調(diào)整方法,其中,所述步驟b)將SQL中謂詞按如下 方式統(tǒng)一綁定變量:未使用綁定變量的SQL,使用依次遞增變量代碼代替常量;已使用綁定 變量的SQL,使用依次遞增變量代碼代替原綁定變量。
[0016] 上述的SQL語句執(zhí)行頻次動態(tài)調(diào)整方法,其中,所述步驟b)按如下方式對統(tǒng)一規(guī) 整化處理后SQL語句分配新的SQL_ID:對SQL語句通過md5方式進(jìn)行散列,再對散列結(jié)果 進(jìn)行base32編碼,每五位轉(zhuǎn)換為一個Base32編碼,轉(zhuǎn)換后的Base32編碼即為該SQL語句 對應(yīng)的SQL_ID。
[0017] 上述的SQL語句執(zhí)行頻次動態(tài)調(diào)整方法,其中,所述步驟c)中SQL語句的執(zhí)行頻 次freq采集計算如下:freq=EXECUTI0NSALAST_ACTIVE_TME-LAST_L0AD_TME)*24*60 ; EXECUTIONS為該SQL語句的執(zhí)行次數(shù),LAST_ACTIVE_HME為最后活動時間,LAST_L0AD_ TME為最后載入時間。
[0018] 上述的SQL語句執(zhí)行頻次動態(tài)調(diào)整方法,其中,所述步驟b)中預(yù)設(shè)頻次閥值的設(shè) 置如下:遍歷數(shù)據(jù)庫中的節(jié)點,每個節(jié)點取所有前端業(yè)務(wù)對應(yīng)的SQL語句的執(zhí)行頻次中間 值,最后取所有節(jié)點的執(zhí)行頻次中間值的平均值作為預(yù)設(shè)頻次閥值f。
[0019] 上述的SQL語句執(zhí)行頻次動態(tài)調(diào)整方法,其中,所述步驟b)第n個節(jié)點的執(zhí)行頻 次中間值!!^的計算方法如下:bl)從數(shù)據(jù)庫活動歷史會話視圖中獲取EVENT= 〃Cursor:Pin S〃的所有SQL_ID和樣例時間SAMPLEJ1ME;b2)篩選數(shù)據(jù)庫歷史快照視圖,條件為樣例時 間SAMPLEJ1ME在快照開始時間BEGIN_INTERVAL_HME和快照結(jié)束時間END_INTERVAL_ TME之間,且SQL_ID相等,得到SNAP_ID;b3)根據(jù)SNAP_ID和SQL_ID,得到數(shù)據(jù)庫SQL 歷史狀態(tài)視圖中的執(zhí)行次數(shù)EXECUTION_DELTA;b4)根據(jù)SNAP_ID,指定STAT_NAME=〃DB time",得到數(shù)據(jù)庫歷史情況統(tǒng)計視圖中的統(tǒng)計值VALUE。
[0020] 上述的SQL語句執(zhí)行頻次動態(tài)調(diào)整方法,其中,所述預(yù)設(shè)頻次閥值f計算公式如 下:
[0021]
[0022] mn=DBA_HIST_SQLSTAT.EXECUTION_DELTA/(DBA_HIST_SNAPSHOT.END_INTERVAL_ TIME-DBA_HIST_SNAPSHOT.BEGIN_INTERVAL_TIME);
[0023] wn=DBA_HIST_SYS_TME_MODEL.VALUE;其中,DBA_HIST_ACTIVE_SESS_HISTORY 為數(shù)據(jù)庫活動歷史會話視圖,DBA_HIST_SNAPSH0T為數(shù)據(jù)庫歷史快照視圖,DBA_HIST_ SQLSTAT為數(shù)據(jù)庫SQL歷史狀態(tài)視圖,DBA_HIST_SYS_HME_MODEL為數(shù)據(jù)庫歷史情況統(tǒng)計視 圖。
[0024] 本發(fā)明對比現(xiàn)有技術(shù)有如下的有益效果:本發(fā)明提供的SQL語句執(zhí)行頻次動態(tài)調(diào) 整方法,無需關(guān)注開發(fā)階段的綁定變量使用,無需修改代碼,通過在中間層自動規(guī)整SQL,統(tǒng) 一使用綁定變量,并定期采集數(shù)據(jù)值的分布情況,對SQL是否使用綁定變量進(jìn)行動態(tài)調(diào)整, 從而動態(tài)調(diào)整通道,以適應(yīng)SQL頻次波動情況,提升數(shù)據(jù)庫處理性能。
【附圖說明】
[0025] 圖1為本發(fā)明使用的數(shù)據(jù)庫架構(gòu)示意圖;
[0026] 圖2為本發(fā)明SQL語句執(zhí)行頻次采集流程圖;
[0027] 圖3為本發(fā)明SQL語句執(zhí)行頻次動態(tài)調(diào)整流程圖。
【具體實施方式】
[0028] 下面結(jié)合附圖和實施例對本發(fā)明作進(jìn)一步的描述。
[0029] 圖1為本發(fā)明使用的數(shù)據(jù)庫架構(gòu)示意圖。
[0030] 請參見圖1,本發(fā)明在客戶端與數(shù)據(jù)庫端連接之間設(shè)計中間層,在數(shù)據(jù)庫端采集數(shù) 據(jù)庫及相關(guān)SQL運行信息,進(jìn)行計算并存儲在中間層中,當(dāng)中間層接收客戶端請求后,根據(jù) 采集信息決定處理方式,并轉(zhuǎn)發(fā)至數(shù)據(jù)庫端。
[0031] 請繼續(xù)參見圖2和圖3,本發(fā)明提供的SQL語句執(zhí)行頻次動態(tài)調(diào)整方法,包括如下 步驟:
[0032] S1、監(jiān)聽
[0033] 接收客戶端發(fā)送請求,獲取操作數(shù)據(jù)庫的SQL語句。
[0034] S2、SQL預(yù)處理
[0035] 通過對SQL文本進(jìn)行解析,將SQL中謂詞條件進(jìn)行規(guī)整化處理:
[0036] 1)未使用綁定變量的SQL,使用:1,: 2, : 3等依次遞增變量代碼代替常量。
[0037] 2)已使用綁定變量的SQL,使用:1,: 2, : 3等依次遞增變量代碼代替原綁定變量。
[0038] 為保證執(zhí)行計劃穩(wěn)定,SQL中涉及謂詞的唯一值低于閥值時,該謂詞條件不進(jìn) 行規(guī)整化處理。唯一值個數(shù)從ORACLE數(shù)據(jù)庫中查詢系統(tǒng)統(tǒng)計信息表視圖DBA_TAB_C0L_ STATISTICS,采集字段為NUM_DISTINCT。
[0039] S3、SQL整合
[0040] 對于已規(guī)整化SQL文本,通過md5方式進(jìn)行散列,再對散列結(jié)果進(jìn)行base32編碼, 每五位轉(zhuǎn)換為一個Base32的編碼,編碼即為SQL文本對應(yīng)的SQL_ID。
[0041] S4、通道處理
[0042] 依據(jù)規(guī)整后的SQL在實際數(shù)據(jù)庫中執(zhí)行頻次,當(dāng)超過預(yù)設(shè)頻次閥值f后,啟用新通 道,產(chǎn)生新的SQL替換原有SQL。創(chuàng)建數(shù)據(jù)結(jié)構(gòu)存儲各SQL通道信息。
[0043]
[0044] S5、頻次監(jiān)控
[0045] 每間隔10分鐘,在數(shù)據(jù)庫服務(wù)端采集各規(guī)整后SQL的執(zhí)行頻次。從ORACLE數(shù)據(jù) 庫中查詢系統(tǒng)視圖V$SQL_AREA,采集字段如下:
[0048] 其中SQL_ID的執(zhí)行頻次(每分鐘)計算公式為:
[0049] freq=EXECUTIONS/(LAST_ACTIVE_TIME-LAST_LOAD_TIME)*24*60
[0050] S6、轉(zhuǎn)發(fā)
[0051] 將經(jīng)過規(guī)整,通道處理后的新SQL轉(zhuǎn)發(fā)至數(shù)據(jù)庫服務(wù)端運行,并接收結(jié)果數(shù)據(jù)集 和執(zhí)行結(jié)構(gòu),反饋客戶端。
[0052] 其中閥值f的計算依據(jù)為數(shù)據(jù)庫中如下系統(tǒng)視圖中數(shù)據(jù):
[0053] DBA_