一種處理結(jié)構(gòu)化查詢語(yǔ)言sql的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明實(shí)施例涉及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,尤其涉及一種處理結(jié)構(gòu)化查詢語(yǔ)言SQL的方法及裝置。
【背景技術(shù)】
[0002]SQL (Structured Query Language,結(jié)構(gòu)化查詢語(yǔ)言)是一種對(duì)數(shù)據(jù)庫(kù)繼續(xù)查詢和程序設(shè)計(jì)語(yǔ)句,用于存儲(chǔ)數(shù)據(jù)以及查詢、更新和管理數(shù)據(jù)庫(kù)關(guān)系。對(duì)于數(shù)據(jù)量較大的數(shù)據(jù)庫(kù),運(yùn)行針對(duì)大范圍數(shù)據(jù)或者大數(shù)據(jù)量進(jìn)行統(tǒng)計(jì)查詢的SQL(Structured Query Language,結(jié)構(gòu)化查詢語(yǔ)言)語(yǔ)句的速度較慢。
[0003]目前,為了提升數(shù)據(jù)庫(kù)運(yùn)行SQL語(yǔ)句的速度,針對(duì)查詢較多、寫(xiě)入較少、定時(shí)寫(xiě)入或者沒(méi)有寫(xiě)入的列表,采用預(yù)先計(jì)算的方法運(yùn)行SQL語(yǔ)句。預(yù)先計(jì)算的方法主要包括:首先,計(jì)算經(jīng)常運(yùn)行的SQL語(yǔ)句的結(jié)果,將結(jié)果存儲(chǔ)到中間結(jié)果表中;然后,再次接收相同的SQL語(yǔ)句時(shí),從中間結(jié)果表取出預(yù)先計(jì)算的結(jié)果。為避免預(yù)計(jì)算結(jié)果數(shù)量過(guò)大,所以一般將這種技術(shù)應(yīng)用在統(tǒng)計(jì)分析的SQL語(yǔ)句上,這類語(yǔ)句常包含count、sum、max和min等聚合函數(shù)。
[0004]但是,預(yù)先計(jì)算的方法只能應(yīng)用于完全相同的SQL語(yǔ)句,并且查詢條件也完全相同,無(wú)法自動(dòng)的處理新加入的SQL語(yǔ)句。
【發(fā)明內(nèi)容】
[0005]本發(fā)明實(shí)施例提供一種運(yùn)行SQL語(yǔ)句的方法及裝置,以實(shí)現(xiàn)提高用戶的檢索效率。
[0006]一方面,本發(fā)明實(shí)施例提供了一種處理結(jié)構(gòu)化查詢語(yǔ)言SQL的方法,包括:
[0007]獲取客戶端發(fā)送的SQL語(yǔ)句;
[0008]解析所述SQL語(yǔ)句,獲得語(yǔ)法分析樹(shù);
[0009]依據(jù)所述語(yǔ)法分析樹(shù)從所述SQL語(yǔ)句中提取規(guī)范的SQL語(yǔ)句;
[0010]判斷所述SQL語(yǔ)句是否符合預(yù)設(shè)的規(guī)則,若符合,則判斷中間結(jié)果表中是否緩存有與所述規(guī)范的SQL語(yǔ)句對(duì)應(yīng)的查詢結(jié)果,若無(wú),則查詢所述規(guī)范SQL語(yǔ)句,獲得查詢結(jié)果;
[0011]將所述查詢結(jié)果緩存到所述中間結(jié)果表中。
[0012]優(yōu)選地,所述規(guī)范的SQL語(yǔ)句為所述語(yǔ)法分析樹(shù)的葉子節(jié)點(diǎn)對(duì)應(yīng)的SQL語(yǔ)句。優(yōu)選地,預(yù)設(shè)的規(guī)則包括以下至少一項(xiàng):
[0013]所述SQL語(yǔ)句拼寫(xiě)正確;
[0014]所述SQL語(yǔ)句為SELECT語(yǔ)句;
[0015]如無(wú)需動(dòng)態(tài)更新緩存,所述SQL語(yǔ)句支持count、max、min、avg和sum類型的聚合函數(shù);
[0016]如需要支持動(dòng)態(tài)更新緩存,所述SQL語(yǔ)句不支持avg類型的聚合函數(shù);
[0017]所述SQL語(yǔ)句不支持的表名列表和黑名單制;
[0018]所述SQL語(yǔ)句不支持包括具有g(shù)roup by和having關(guān)鍵詞的語(yǔ)句;
[0019]所述SQL語(yǔ)句不包括超過(guò)一級(jí)以上子查詢。
[0020]優(yōu)選地,在所述判斷中間結(jié)果表中是否緩存有與所述規(guī)范的SQL語(yǔ)句對(duì)應(yīng)的查詢結(jié)果,若無(wú),則查詢所述規(guī)范SQL語(yǔ)句,獲得查詢結(jié)果,并將所述查詢結(jié)果緩存到所述中間結(jié)果表中之后,還包括:
[0021]按照預(yù)設(shè)的時(shí)間間隔,更新所述中間結(jié)果表。
[0022]優(yōu)選地,所述更新所述中間結(jié)果表包括:
[0023]刪除所述中間結(jié)果表中超過(guò)預(yù)設(shè)時(shí)間未被訪問(wèn)的查詢結(jié)果。
[0024]另一方面,本發(fā)明實(shí)施例提供了一種處理結(jié)構(gòu)化查詢語(yǔ)言SQL的裝置,包括:
[0025]SQL語(yǔ)句獲取模塊,用于獲取客戶端發(fā)送的SQL語(yǔ)句;
[0026]SQL語(yǔ)句解析模塊,用于解析所述SQL語(yǔ)句,獲得語(yǔ)法分析樹(shù);
[0027]規(guī)范的SQL語(yǔ)句提取模塊,用于依據(jù)所述語(yǔ)法分析樹(shù)從所述SQL語(yǔ)句中提取規(guī)范的SQL語(yǔ)句;
[0028]預(yù)設(shè)規(guī)則判斷模塊,用于判斷所述SQL語(yǔ)句是否符合預(yù)設(shè)的規(guī)則;
[0029]SQL語(yǔ)句查詢模塊,用于判斷中間結(jié)果表中是否緩存有與所述規(guī)范的SQL語(yǔ)句對(duì)應(yīng)的查詢結(jié)果,若無(wú),則查詢所述規(guī)范SQL語(yǔ)句,獲得查詢結(jié)果;
[0030]查詢結(jié)果緩存模塊,用于將所述查詢結(jié)果緩存到所述中間結(jié)果表中。
[0031]優(yōu)選地,所述規(guī)范的SQL語(yǔ)句為所述語(yǔ)法分析樹(shù)的葉子節(jié)點(diǎn)對(duì)應(yīng)的SQL語(yǔ)句。優(yōu)選地,預(yù)設(shè)的規(guī)則包括以下至少一項(xiàng):
[0032]所述SQL語(yǔ)句拼寫(xiě)正確;
[0033]所述SQL語(yǔ)句為SELECT語(yǔ)句;
[0034]如無(wú)需動(dòng)態(tài)更新緩存,所述SQL語(yǔ)句支持count、max、min、avg和sum類型的聚合函數(shù);
[0035]如需要支持動(dòng)態(tài)更新緩存,所述SQL語(yǔ)句不支持avg類型的聚合函數(shù);
[0036]所述SQL語(yǔ)句不支持的表名列表和黑名單制;
[0037]所述SQL語(yǔ)句不支持包括具有g(shù)roup by和having關(guān)鍵詞的語(yǔ)句;
[0038]所述SQL語(yǔ)句不包括超過(guò)一級(jí)以上子查詢。
[0039]優(yōu)選地,所述裝置還包括:中間結(jié)果表更新模塊,用于按照預(yù)設(shè)的時(shí)間間隔,更新所述中間結(jié)果表。
[0040]優(yōu)選地,所述中間結(jié)果表更新模塊,具體用于刪除所述中間結(jié)果表中超過(guò)預(yù)設(shè)時(shí)間未被訪問(wèn)的查詢結(jié)果。
[0041]通過(guò)本發(fā)明實(shí)施例提供的一種處理結(jié)構(gòu)化查詢語(yǔ)言SQL的方法及裝置,當(dāng)中間結(jié)果表中未緩存SQL對(duì)應(yīng)的查詢結(jié)果,可以自動(dòng)校驗(yàn)SQL語(yǔ)句是都符合預(yù)設(shè)的規(guī)則,對(duì)符合預(yù)設(shè)規(guī)則的SQL語(yǔ)句進(jìn)行查詢,并將查詢結(jié)果緩存到中間結(jié)果表中。
【附圖說(shuō)明】
[0042]為了更清楚地說(shuō)明本申請(qǐng)實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本申請(qǐng)的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0043]圖1為本發(fā)明實(shí)施例提供的一種處理結(jié)構(gòu)化查詢語(yǔ)言SQL的方法流程示意圖;
[0044]圖2為本發(fā)明實(shí)施例提供的一種語(yǔ)法分析樹(shù)示意圖;
[0045]圖3為本發(fā)明實(shí)施例提供的一種處理結(jié)構(gòu)化查詢語(yǔ)言SQL的方法流程示意圖;
[0046]圖4為本發(fā)明實(shí)施例提供的一種處理結(jié)構(gòu)化查詢語(yǔ)言SQL的裝置結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0047]下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說(shuō)明。可以理解的是,此處所描述的具體實(shí)施例僅僅用于解釋本發(fā)明,而非對(duì)本發(fā)明的限定。另外還需要說(shuō)明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部結(jié)構(gòu)。
[0048]實(shí)施例一
[0049]本發(fā)明實(shí)施例提供的一種處理結(jié)構(gòu)化查詢語(yǔ)言SQL的方法,該方法可適用于對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢的情況下,該方法具體包括:
[0050]步驟SlOl,獲取客戶端發(fā)送的SQL語(yǔ)句。
[0051]在步驟SlOl中,SQL (Structured Query Language,結(jié)構(gòu)化查詢語(yǔ)言)是一種對(duì)數(shù)據(jù)庫(kù)查詢的語(yǔ)句。可以通過(guò)JAVA API (Applicat1n Programming Interface,應(yīng)用程序編程接口)或者Restful WebService API接口獲取客戶端發(fā)送的SQL語(yǔ)句,以對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢。
[0052]步驟S102,解析SQL語(yǔ)句,獲得語(yǔ)法分析樹(shù)。
[0053]在步驟S102中,可以使用內(nèi)部算法對(duì)SQL語(yǔ)句進(jìn)行解析,分析SQL語(yǔ)句的語(yǔ)法,獲得語(yǔ)法分析樹(shù)。
[0054]例如,SQL語(yǔ)句為:【SELECT title FROM starsin Where starname in (SELECTname from moviestarwhere birthday like ‘ 1960’)】解析該 SQL 語(yǔ)句獲得的語(yǔ)法分析樹(shù)形式如圖2所示。
[0055]在圖2中,非終結(jié)符和終結(jié)符包括:〈Attribute>屬性、〈Relat1n〉關(guān)系、〈pattern〉模式和〈Tuple〉元組。語(yǔ)法分析樹(shù)中存在兩個(gè)〈Relat1n〉:starsin (明星范圍)和moviestar (電影明星)。starsin、moviestar是由非終結(jié)符〈Relat1n〉本身定義的。同樣〈Attribute〉也是由本身定義的。starsin的屬性包括title (標(biāo)題)和starname (明星名),moviestar的屬性包括:name (姓名)和birthday (生日),都是通過(guò)所代表的規(guī)則來(lái)定義的語(yǔ)法類,其最終的終結(jié)符所代表的就是數(shù)據(jù)庫(kù)的元數(shù)據(jù)。
[0056]步驟S103,依據(jù)語(yǔ)法分析樹(shù)從SQL語(yǔ)句中提取規(guī)范的SQL語(yǔ)句。
[0057]規(guī)范的SQL語(yǔ)句可以為語(yǔ)法分析樹(shù)的葉子節(jié)點(diǎn)對(duì)應(yīng)的SQL語(yǔ)句。
[0058]不同的SQL語(yǔ)句可能會(huì)具有相同的語(yǔ)法分析樹(shù)的葉子節(jié)點(diǎn),例如,第一 SQL語(yǔ)句為“A = 1,B = 2,查詢A是否大于B”;第二 SQL語(yǔ)句為“A = 2,B = 1,查詢A是否大于B”,這兩個(gè)SQL語(yǔ)句具有相同的查詢結(jié)果,也具有相同的語(yǔ)法分析樹(shù)的葉子節(jié)點(diǎn)。因此,可以解析這兩條語(yǔ)句中的任意一條SQL語(yǔ)句,獲得語(yǔ)法分析樹(shù),將語(yǔ)法分析樹(shù)的葉子節(jié)點(diǎn)作為這兩條語(yǔ)句的規(guī)范的SQL語(yǔ)句。
[0059]步驟S104,判斷所述SQL語(yǔ)句是否符合預(yù)設(shè)的規(guī)則。
[0060]在步驟S104中,判斷SQL語(yǔ)句是否符合預(yù)設(shè)的規(guī)則,若符合,執(zhí)行步驟S105 ;若不符合,則將SQL語(yǔ)句返回至客戶端。
[0061]預(yù)設(shè)的規(guī)則可以包括以下至少一項(xiàng):SQL語(yǔ)句拼寫(xiě)正確;SQL語(yǔ)句為SELECT語(yǔ)句;如無(wú)需動(dòng)態(tài)更新緩存,SQL語(yǔ)句支持count、max、min、avg和sum類型的聚合函數(shù);如需要支持動(dòng)態(tài)更新緩存,SQL語(yǔ)句不支持avg類型的聚合函數(shù);SQL語(yǔ)句不支持的表名列表和黑名單制;SQL語(yǔ)句不支持包括具有g(shù)roup by和having關(guān)鍵詞的語(yǔ)句;SQL語(yǔ)句不包括超過(guò)一級(jí)以上子查詢。
[0062]步驟S105,判斷中間結(jié)果表中是否緩存有與規(guī)范的SQL語(yǔ)句對(duì)應(yīng)的查詢結(jié)果,若有,則將查詢結(jié)果發(fā)送至客戶端;若無(wú),則查詢規(guī)范SQL語(yǔ)句,獲得查詢結(jié)果,并執(zhí)行步驟S106o
[0063]在步驟S105中,為提高查詢速度,中間結(jié)果表可以是內(nèi)存散列表,如果內(nèi)存的使用量在預(yù)設(shè)的容量范圍,例如60%之內(nèi),則將查詢結(jié)果放入內(nèi)存進(jìn)行緩存;若內(nèi)存的使用量超過(guò)60%,則內(nèi)存中保存中間結(jié)果表的索引位置。同時(shí)為了避免一些偶爾調(diào)用的SQL語(yǔ)句的查詢結(jié)果緩存在內(nèi)存中,造成內(nèi)存資源浪費(fèi),可以在預(yù)設(shè)的訪問(wèn)總數(shù)或者訪問(wèn)頻率的閾值,當(dāng)SQL語(yǔ)句的訪問(wèn)總數(shù)或者訪問(wèn)頻率超過(guò)預(yù)設(shè)的訪問(wèn)總數(shù)或者訪問(wèn)頻率的閾值時(shí),在內(nèi)存中緩存該SQL語(yǔ)句的查詢結(jié)果。
[0064]步驟S106,將查詢結(jié)果緩存到中間結(jié)果表中。
[0065]在步驟S106中,如果查詢結(jié)果過(guò)多內(nèi)存無(wú)法存放,則使用二級(jí)緩存結(jié)構(gòu),將查詢結(jié)果緩存到數(shù)據(jù)庫(kù)統(tǒng)計(jì)表的入口地址。
[0066]通