HIST_ACTIVE_SESS_HISTORY(數(shù)據(jù)庫活動(dòng)歷史會(huì)話視圖)
[0055] DBA_HIST_SNAPSHOT(數(shù)據(jù)庫歷史快照視圖)
[0057]DBA_HIST_SQLSTAT(數(shù)據(jù)庫SQL歷史狀態(tài)視圖)
[0059] DBA_HIST_SYS_TME_MODEL(數(shù)據(jù)庫歷史情況統(tǒng)計(jì)視圖)
[0060]
[0061] 以上四個(gè)視圖中均由INSTANCE_NUMBER數(shù)據(jù)標(biāo)示在數(shù)據(jù)庫中的節(jié)點(diǎn),以下計(jì)算遍 歷各節(jié)點(diǎn)n(n為自然數(shù)),取每個(gè)節(jié)點(diǎn)的中間值mn,并對(duì)所所節(jié)點(diǎn)的中間值mn取平均值得到 預(yù)設(shè)頻次閥值f。
[0062] 第n個(gè)節(jié)點(diǎn)中間值叫的計(jì)算方法如下:
[0063] 1?從DBA_HIST_ACTIVE_SESS_HISTORY中獲取EVENT= "Cursor:PinS〃的所有 SQL_ID和SAMPLEJ1ME。一個(gè)由于頻繁執(zhí)行SQL共享解析時(shí)產(chǎn)生的競(jìng)爭(zhēng)。當(dāng)一個(gè)會(huì)話嘗試 以共享模式來獲得一個(gè)游標(biāo)時(shí),需要修改相應(yīng)的Mutex結(jié)構(gòu)的引用計(jì)數(shù),或者增加該計(jì)數(shù), 或者減少。修改引用技術(shù)的原子操作很快,但是在頻繁解析的情況下,仍然產(chǎn)生了競(jìng)爭(zhēng)和等 待,由此就產(chǎn)生了Cursor:pinS的等待。
[0064] 2?篩選DBA_HIST_SNAPSHOT,條件為SAMPLEJ1ME在BEGIN_INTERVAL_TME和 END_INTERVAL_HME之間,且SQL_ID相等,得到SNAP_ID。
[0065] 3?根據(jù)SNAP_ID和SQL_ID,得到DBA_HIST_SQLSTAT的EXECUTION_DELTA。
[0066] 4?根據(jù)SNAP_ID,指定STAT_NAME="DBtime",得到DBA_HIST_SYS_TME_MODEL 的VALUE,DBtime包括CPU時(shí)間、CPU隊(duì)列時(shí)間、I/O時(shí)間和其他一系列非空閑等待時(shí)間。 [0067] 預(yù)設(shè)頻次閥值f計(jì)算公式如下:
[0068] mn=DBA_HIST_SQLSTAT.EXECUTION_DELTA/(DBA_HIST_SNAPSHOT.END_INTERVAL_ TIME-DBA_HIST_SNAPSHOT.BEGIN_INTERVAL_TIME);
[0069] wn=DBA_HIST_SYS_TIME_MODEL.VALUE;
[0070]
o
[0071] 本發(fā)明具體SQL頻次調(diào)整流程示例如下:
[0072] 1)本發(fā)明可由中間層發(fā)起頻次采集請(qǐng)求,對(duì)數(shù)據(jù)庫服務(wù)端中各SQL的執(zhí)行頻次進(jìn) 行采集和監(jiān)控。
[0073] 2)數(shù)據(jù)庫服務(wù)端響應(yīng)請(qǐng)求,列出非系統(tǒng)內(nèi)部SQL,即前端業(yè)務(wù)SQL。
[0074] 3)以其中一條SQL為例,標(biāo)記該SQL為A。SQL語句如下:
[0076] 通過技術(shù)方案中各項(xiàng)指標(biāo)及公式計(jì)算出頻次freq=f\。
[0077] 4)如果SQLA的頻次大于0,更新至中間層數(shù)據(jù)結(jié)構(gòu)中;如果頻次等于0,則回 收通道。本例中SQL為一個(gè)通道Cl,還未劃分新通道,數(shù)據(jù)結(jié)構(gòu)填充數(shù)據(jù)如下:
[0078]
[0079] 本發(fā)明的具體SQL頻次調(diào)整流程示例如下:
[0080] 1)由客戶端發(fā)起,當(dāng)辦理業(yè)務(wù)時(shí),初始化數(shù)據(jù)源,并發(fā)送業(yè)務(wù)辦理SQL至中間層。
[0081] 2)中間層監(jiān)聽客戶端請(qǐng)求,捕獲到業(yè)務(wù)辦理SQL。SQL文本如下:
[0083] 3)按照技術(shù)方案所說明,對(duì)SQL中謂詞條件進(jìn)行規(guī)整化處理,如下:
[0085] 通過散列及編碼。生成規(guī)整后SQL_IDdrs7x8pt48bcg。
[0086] 4)查找中間層數(shù)據(jù)結(jié)構(gòu),SQL_ID為drs7x8pt48bcg。發(fā)現(xiàn)存在一個(gè)通道q,該通 道SQL執(zhí)行頻次為,大于閥值f;
[0088] 創(chuàng)建新通道c2,將SQL修改為:
[0090] 并重新生成新通道SQLIDrts6a43f49b3a,并更新數(shù)據(jù)結(jié)構(gòu):
[0091]
[0092] 5)將通道c2SQL轉(zhuǎn)發(fā)至數(shù)據(jù)庫服務(wù)端,并執(zhí)行,將執(zhí)行結(jié)果返回客戶端。
[0093] 6)在頻次采集流程中將繼續(xù)對(duì)通道(:2中SQL頻次進(jìn)行監(jiān)控,更新中間層數(shù)據(jù)結(jié) 構(gòu)。
[0094] 雖然本發(fā)明已以較佳實(shí)施例揭示如上,然其并非用以限定本發(fā)明,任何本領(lǐng)域技 術(shù)人員,在不脫離本發(fā)明的精神和范圍內(nèi),當(dāng)可作些許的修改和完善,因此本發(fā)明的保護(hù)范 圍當(dāng)以權(quán)利要求書所界定的為準(zhǔn)。
【主權(quán)項(xiàng)】
1. 一種s化語句執(zhí)行頻次動(dòng)態(tài)調(diào)整方法,其特征在于,包括如下步驟: a)監(jiān)聽客戶端的發(fā)送請(qǐng)求,獲取操作數(shù)據(jù)庫的S化語句; b) 對(duì)獲取的S化語句進(jìn)行解析,將S化中謂詞條件進(jìn)行規(guī)整化處理,統(tǒng)一綁定變量,并 為統(tǒng)一規(guī)整化處理后S化語句分配新的SQL_ID; C)在數(shù)據(jù)庫服務(wù)端定期采集各規(guī)整后S化語句的執(zhí)行頻次; d)如果存在執(zhí)行頻次超過預(yù)設(shè)頻次閥值的S化語句,產(chǎn)生新的S化語句替換原有SQL語句,重復(fù)步驟b),并將規(guī)整化處理后的新S化轉(zhuǎn)發(fā)至數(shù)據(jù)庫服務(wù)端運(yùn)行。2. 如權(quán)利要求1所述的S化語句執(zhí)行頻次動(dòng)態(tài)調(diào)整方法,其特征在于,所述步驟b) 從ORACLE數(shù)據(jù)庫中查詢系統(tǒng)統(tǒng)計(jì)信息表視圖DBA_TAB_COL_STATISTICS,采集字段NUM_ DISTINCT獲取S化中設(shè)及謂詞的唯一值,如果S化中設(shè)及謂詞的唯一值低于預(yù)設(shè)閥值,則不 進(jìn)行規(guī)整化處理。3.如權(quán)利要求1所述的S化語句執(zhí)行頻次動(dòng)態(tài)調(diào)整方法,其特征在于,所述步驟b)將 S化中謂詞按如下方式統(tǒng)一綁定變量:未使用綁定變量的SQL使用依次遞增變量代碼代替 常量;已使用綁定變量的SQL使用依次遞增變量代碼代替原綁定變量。4.如權(quán)利要求1所述的S化語句執(zhí)行頻次動(dòng)態(tài)調(diào)整方法,其特征在于,所述步驟b)按 如下方式對(duì)統(tǒng)一規(guī)整化處理后S化語句分配新的SQL_ID;對(duì)S化語句通過md5方式進(jìn)行散 列,再對(duì)散列結(jié)果進(jìn)行base32編碼,每五位轉(zhuǎn)換為一個(gè)Base32編碼,轉(zhuǎn)換后的Base32編 碼即為該S化語句對(duì)應(yīng)的SQL_ID。5. 如權(quán)利要求1所述的S化語句執(zhí)行頻次動(dòng)態(tài)調(diào)整方法,其特征在于,所述步驟C)中 S化語句的執(zhí)行頻次化eq采集計(jì)算如下; freq = EXECUTIONS/(LAST_ACTIVE_TIME-LAST_LOAD_TIME)*24*60 ; EXECUTIONS為該S化語句的執(zhí)行次數(shù),LAST_ACTIVE_TIME為最后活動(dòng)時(shí)間,LAST_ L0AD_TIME為最后載入時(shí)間。6. 如權(quán)利要求1所述的S化語句執(zhí)行頻次動(dòng)態(tài)調(diào)整方法,其特征在于,所述步驟b)中 預(yù)設(shè)頻次閥值的設(shè)置如下;遍歷數(shù)據(jù)庫中的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)取所有前端業(yè)務(wù)對(duì)應(yīng)的S化語 句的執(zhí)行頻次中間值,最后取所有節(jié)點(diǎn)的執(zhí)行頻次中間值的平均值作為預(yù)設(shè)頻次閥值f。7. 如權(quán)利要求6所述的S化語句執(zhí)行頻次動(dòng)態(tài)調(diào)整方法,其特征在于,所述步驟b)第 n個(gè)節(jié)點(diǎn)的執(zhí)行頻次中間值m。的計(jì)算方法如下: bl)從數(shù)據(jù)庫活動(dòng)歷史會(huì)話視圖中獲取EVENT="化rsor:Pin S"的所有SQL_ID和樣 例時(shí)間SAMPLE_TIME ; b2)篩選數(shù)據(jù)庫歷史快照視圖,條件為樣例時(shí)間SAMPLE_TIME在快照開始時(shí)間BEGIN_ INTERVAL_TIME和快照結(jié)束時(shí)間END_INTERVAL_TIME之間,且SQL_ID相等,得到SNAP_ID ; b3)根據(jù)SNAP_ID和SQL_ID,得到數(shù)據(jù)庫S化歷史狀態(tài)視圖中的執(zhí)行次數(shù)EXECUTION_呢LTA ; b4)根據(jù)SNAP_ID,指定STAT_NAME="DBtime",得到數(shù)據(jù)庫歷史情況統(tǒng)計(jì)視圖中的 統(tǒng)計(jì)值VALUE。8. 如權(quán)利要求7所述的S化語句執(zhí)行頻次動(dòng)態(tài)調(diào)整方法,其特征在于,所述預(yù)設(shè)頻次閥 值f計(jì)算公式如下:mn=DBA_HIST_SQLSTAT.EXECUTION-DELTA/(DBA_HIST_SMPSHOT.END-INTERVAL-TIME-DBA_HIST_SNAPS冊(cè)T.邸GIN_INTERVAL_TIME); 訊。=DBA_HIST_SYS_TIME_MWEL.VALUE; 其中,DBA_HIST_ACTIVE_SESS_HISTORY為數(shù)據(jù)庫活動(dòng)歷史會(huì)話視圖,DBA_HIST_SNAILS冊(cè)T為數(shù)據(jù)庫歷史快照視圖,DBA_HIST_SQLSTAT為數(shù)據(jù)庫S化歷史狀態(tài)視圖,DBA_ HIST_SYS_TIME_M孤化為數(shù)據(jù)庫歷史情況統(tǒng)計(jì)視圖。
【專利摘要】本發(fā)明公開了一種SQL語句執(zhí)行頻次動(dòng)態(tài)調(diào)整方法,包括如下步驟:a)監(jiān)聽客戶端的發(fā)送請(qǐng)求,獲取操作數(shù)據(jù)庫的SQL語句;b)對(duì)獲取的SQL語句進(jìn)行解析和規(guī)整化處理,統(tǒng)一綁定變量;c)在數(shù)據(jù)庫服務(wù)端定期采集各規(guī)整后SQL語句的執(zhí)行頻次;d)如果存在執(zhí)行頻次超過預(yù)設(shè)頻次閥值的SQL語句,產(chǎn)生新的SQL語句重復(fù)步驟b),并將規(guī)整后的新SQL轉(zhuǎn)發(fā)至數(shù)據(jù)庫服務(wù)端運(yùn)行。本發(fā)明無需關(guān)注開發(fā)階段的綁定變量使用,無需修改代碼,通過在中間層自動(dòng)規(guī)整SQL,統(tǒng)一使用綁定變量,并定期采集數(shù)據(jù)值的分布情況,對(duì)SQL是否使用綁定變量進(jìn)行動(dòng)態(tài)調(diào)整,從而動(dòng)態(tài)調(diào)整通道,以適應(yīng)SQL頻次波動(dòng)情況,提升數(shù)據(jù)庫處理性能。
【IPC分類】G06F17/30
【公開號(hào)】CN104933190
【申請(qǐng)?zhí)枴緾N201510402260
【發(fā)明人】程永新, 宋輝, 孫田
【申請(qǐng)人】上海新炬網(wǎng)絡(luò)信息技術(shù)有限公司
【公開日】2015年9月23日
【申請(qǐng)日】2015年7月10日