祝君,劉柏fl,余晟雋,宮學(xué)慶,周敏奇
(華東師范大學(xué)數(shù)據(jù)科學(xué)與工程研究院,上海200062)
面向OceanBase的存儲過程設(shè)計(jì)與實(shí)現(xiàn)
祝君,劉柏fl,余晟雋,宮學(xué)慶,周敏奇
(華東師范大學(xué)數(shù)據(jù)科學(xué)與工程研究院,上海200062)
存儲過程是數(shù)據(jù)庫管理系統(tǒng)的一個(gè)重要特性,它是標(biāo)準(zhǔn)結(jié)構(gòu)化查詢語言(Structured Query Language,SQL)的一個(gè)擴(kuò)展.OceanBase是一個(gè)新型的支持海量數(shù)據(jù)處理的分布式數(shù)據(jù)庫系統(tǒng),但現(xiàn)有OceanBase的開源版本不支持存儲過程功能,影響了該系統(tǒng)在企業(yè)和機(jī)構(gòu)中的推廣和應(yīng)用.本文在深度分析存儲過程原理以及OceanBase查詢處理策略的基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了支持PL/SQL(Procedural Language/SQL)的存儲過程機(jī)制.
存儲過程;SQL;OceanBase
隨著大數(shù)據(jù)時(shí)代和互聯(lián)網(wǎng)時(shí)代的到來,信息量呈井噴式爆發(fā),傳統(tǒng)的集中式數(shù)據(jù)庫管理系統(tǒng)難以處理如此巨大的數(shù)據(jù).在集中式系統(tǒng)架構(gòu)下,盡管可以依據(jù)業(yè)務(wù)特點(diǎn)對數(shù)據(jù)庫進(jìn)行拆分,實(shí)現(xiàn)數(shù)據(jù)表的水平切分/垂直切分并存儲到不同的數(shù)據(jù)庫服務(wù)器上,但隨著業(yè)務(wù)和數(shù)據(jù)量不斷增長,需要不斷地增加服務(wù)器以實(shí)現(xiàn)更細(xì)粒度的數(shù)據(jù)表切分,這種方法需要大量的人工維護(hù)成本.因此很多企業(yè)將目光轉(zhuǎn)向了逐漸成熟的分布式數(shù)據(jù)庫系統(tǒng),并利用其良好的可擴(kuò)展性和容錯(cuò)性等來滿足存儲海量數(shù)據(jù)的應(yīng)用需求.近幾年,隨著分布式數(shù)據(jù)庫的快速發(fā)展,各種分布式數(shù)據(jù)庫如雨后春筍般出現(xiàn),如Bigtable[1]、Spanner[2]、VoltDB[3],以及阿里巴巴(Alibaba)的OceanBase[4]等.雖然這些系統(tǒng)多數(shù)擁有存儲和管理海量數(shù)據(jù)的能力,但是在數(shù)據(jù)一致性、事務(wù)處理能力、SQL[5]功能上,同傳統(tǒng)的關(guān)系數(shù)據(jù)庫系統(tǒng)相比還有差距,很難被直接應(yīng)用于銀行業(yè)務(wù)系統(tǒng)等傳統(tǒng)的大型信息系統(tǒng)中,制約了分布式數(shù)據(jù)庫在企業(yè)和機(jī)構(gòu)中的推廣和使用.但是越來越多的企業(yè)開始關(guān)注于增強(qiáng)分布式數(shù)據(jù)系統(tǒng)功能,如增加SQL支持、事務(wù)、二級索引、一致性等.
OceanBase是Alibaba研發(fā)的關(guān)系型分布式數(shù)據(jù)庫,它實(shí)現(xiàn)了關(guān)系數(shù)據(jù)庫的重要特征,也支持SQL查詢;但是和主流的關(guān)系型數(shù)據(jù)庫系統(tǒng)PostgreSQL[6-7]、MySQL[8]等相比較,功能上還存在一些不足的地方,如不支持存儲過程[9]和游標(biāo)等.存儲過程在現(xiàn)代企業(yè)中應(yīng)用十分廣泛,大多數(shù)企業(yè)的業(yè)務(wù)邏輯都采用存儲過程實(shí)現(xiàn),而OceanBase作為關(guān)系型數(shù)據(jù)庫想要在企業(yè)和機(jī)構(gòu)中被廣泛應(yīng)用,就需要支持存儲過程,以B企業(yè)和機(jī)構(gòu)易于將存儲過程所寫的業(yè)務(wù)遷移到OceanBase數(shù)據(jù)庫系統(tǒng).
本文通過深入分析主流的開源數(shù)據(jù)庫管理系統(tǒng)的存儲過程功能,對實(shí)現(xiàn)中的一些關(guān)鍵技術(shù)問題進(jìn)行研究,并結(jié)合OceanBase架構(gòu)和其現(xiàn)有的查詢引擎,提出一種適合OceanBase數(shù)據(jù)庫架構(gòu)的存儲過程設(shè)計(jì)和實(shí)現(xiàn)方案.本文安排如下:第1節(jié)介紹OceanBase架構(gòu)和存儲過程;第2節(jié)介紹OceanBase存儲過程機(jī)制;第3節(jié)介紹PL/SQL[10]引擎架構(gòu);第4節(jié)對OceanBase存儲過程進(jìn)行實(shí)驗(yàn);第5節(jié)總結(jié)全文.
1.1 OceanBase概述
OceanBase整機(jī)架構(gòu)[11]分為4個(gè)模塊:主控服務(wù)器RootServer;更新服務(wù)器Update-Server;基線數(shù)據(jù)服務(wù)器ChunkServer;合并服務(wù)器MergeServer.如圖1所示.
圖1 OceanBase架構(gòu)Fig.1The architecture of OceanBase
在OceanBase中,和客戶端直接連接的是MergeServer.客戶端通過MySQL(關(guān)于數(shù)據(jù)庫管理系統(tǒng))協(xié)議將SQL請求發(fā)送到MergeServer后,MergeServer首先解析MySQL協(xié)議,從中提取出用戶發(fā)送的SQL語句,接著通過MS-SQL模塊,使用Flex與Bison[12]進(jìn)行詞法解析和語法分析[13],生成語法樹[13];然后生成SQL語句的邏輯查詢計(jì)劃和物理查詢計(jì)劃;最后根據(jù)物理查詢計(jì)劃調(diào)用OceanBase內(nèi)部的各種操作符.MergeServer是OceanBase查詢請求的入口,負(fù)責(zé)對收到的SQL進(jìn)行處理和響應(yīng).
1.2 PL/SQL和存儲過程簡介
PL/SQL是Oracle數(shù)據(jù)庫對SQL語句的擴(kuò)展定義并實(shí)現(xiàn)的一種過程化SQL語言(Procedural Language/SQL),也是一種程序語言,在普通SQL語句的使用上增加了編程語言的特點(diǎn).PL/SQL引入多種數(shù)據(jù)類型、變量聲明、條件控制、循環(huán)結(jié)構(gòu)和子程序等過程語言要素來強(qiáng)化SQL語句的過程處理能力.所以PL/SQL就是把數(shù)據(jù)操作和查詢語句組織在PL/SQL代碼的過程性單元中,并通過邏輯判斷、循環(huán)等操作實(shí)現(xiàn)復(fù)雜的功能或者計(jì)算的程序語言.
存儲過程是一段被命名后保存在數(shù)據(jù)庫服務(wù)器端的一段預(yù)先編譯的代碼.上層應(yīng)用給定存儲過程名稱和相應(yīng)參數(shù)后,解釋執(zhí)行預(yù)編譯的代碼,能有效減少上層應(yīng)用與數(shù)據(jù)庫交互的次數(shù)和數(shù)據(jù)傳輸量.
2.1 OceanBase存儲過程架構(gòu)
在OceanBase中為實(shí)現(xiàn)存儲過程,選擇使用PL/SQL作為存儲過程的宿主語言.因?yàn)镻L/SQL最為常用,用戶更習(xí)慣PL/SQL的編程方式.但OceanBase的原有架構(gòu)中, MergeServer只能對SQL語句進(jìn)行解析,不能解析存儲過程使用的PL/SQL語句.所以在原來的MergeServer架構(gòu)[14]中,增加PL/SQL引擎模塊來對存儲過程的PL/SQL語句進(jìn)行解析處理.增加PL/SQL引擎模塊后的MergeServer架構(gòu)如圖2所示.
圖2 MergeServer架構(gòu)圖Fig.2The architecture of MergeServer
增加了PL/SQL引擎模塊后,當(dāng)MergeServer收到存儲過程相關(guān)的PL/SQL語句后,會將收到的PL/SQL交給PL/SQL引擎處理.PL/SQL引擎[15]包括編譯器和解釋器兩個(gè)部分.編譯器負(fù)責(zé)對PL/SQL進(jìn)行編譯.解釋器負(fù)責(zé)解釋執(zhí)行[16]編譯器編譯后的中間代碼.
2.2 存儲過程創(chuàng)建和存儲
2.2.1 存儲過程創(chuàng)建
存儲過程的創(chuàng)建可以說是存儲過程物理計(jì)劃樹[17]的生成過程.物理計(jì)劃樹的生成分為4個(gè)步驟:詞法解析;語法分析;邏輯計(jì)劃生成;物理計(jì)劃生成.存儲過程創(chuàng)建的流程如圖3所示.
當(dāng)存儲過程語句發(fā)送到MergeServer后,PL/SQL引擎對存儲過程代碼進(jìn)行語法詞法解析,判斷是否有語法錯(cuò)誤,如果有錯(cuò)誤,則將予以報(bào)錯(cuò),否則將會生成一棵語法樹.語法樹生成后進(jìn)入到邏輯計(jì)劃生成部分,對存儲過程中的表、字段、屬性、變量的合法性進(jìn)行檢查[17],如果有錯(cuò)誤則提示錯(cuò)誤信息.最后進(jìn)入物理計(jì)劃生成階段,會先判斷存儲過程在系統(tǒng)表里面是否已經(jīng)定義過,如果存在相同名稱的存儲過程則提示用戶,否則將存儲過程源碼存入系統(tǒng)表all procedure里面,并把生成的物理執(zhí)行計(jì)劃存儲在數(shù)據(jù)庫服務(wù)端;然后返回創(chuàng)建成功的提示信息.在創(chuàng)建存儲過程的時(shí)候并不會解釋執(zhí)行生成的物理計(jì)劃,物理計(jì)劃只會在調(diào)用的時(shí)候才會被解釋執(zhí)行.
圖3 存儲過程創(chuàng)建流程圖Fig.3The flowchart of stored procedure creating
2.2.2 存儲過程的存儲
存儲主要分為兩種方式:單源碼方式和源碼+預(yù)編譯方式.單源碼方式是指只在數(shù)據(jù)庫中保存存儲過程的源碼,而后者是在數(shù)據(jù)庫中保存了源碼后,并且也保存了預(yù)編譯生成的執(zhí)行單元.在OceanBase的存儲過程實(shí)現(xiàn)方案中存儲過程的存儲模式,采用和Oracle、PostgreSQL類似的方案,即源碼+中間代碼的存儲方案,不同的是在OceanBase中,中間代碼不是語法樹,而是物理計(jì)劃樹.
在OceanBase中新增一張名為all procedure的系統(tǒng)表,用來保存存儲過程源碼. all procedure表的基本字段如表1所示.
表1 all procedure表的字段Tab.1Schema ofall procedure
在OceanBase中,客戶端連接到MergeServer的時(shí)候,系統(tǒng)會為該連接分配一個(gè)SESSION用來表示這次會話.在SESSION中建立一個(gè)緩存中間代碼的隊(duì)列,為了不過多占用內(nèi)存,中間代碼的緩存采用FIFO(First Input First Output)(先進(jìn)先出隊(duì)列)策略,如果當(dāng)前的SESSION中緩存的中間代碼過多,可將最早進(jìn)入緩存隊(duì)列的對象移除.
2.3 存儲過程的執(zhí)行
調(diào)用存儲過程的語句進(jìn)入到查詢處理器后,首先會通過PL/SQL引擎進(jìn)行詞法、語法解析,判斷是否存在語法錯(cuò)誤.然后根據(jù)解析出來的存儲過程名稱和參數(shù)在緩存隊(duì)列中進(jìn)行查找,當(dāng)函數(shù)簽名和調(diào)用參數(shù)一致時(shí)返回該存儲過程的物理執(zhí)行計(jì)劃樹;如果沒有在緩存隊(duì)列中找到物理執(zhí)行計(jì)劃樹,就到系統(tǒng)表all procedure中查找,查詢到記錄則將查詢到的存儲過程源碼使用PL/SQL引擎重新編譯生成物理計(jì)劃樹,否則提示存儲過程不存在或錯(cuò)誤.最后將物理計(jì)劃樹使用PL/SQL解釋器進(jìn)行解釋執(zhí)行.存儲過程執(zhí)行流程如圖4所示.
圖4 存儲過程執(zhí)行流程圖Fig.4The flowchart of stored procedure execution
存儲過程是沒有返回值的,但是可以通過INOUT和OUT類型的輸出參數(shù)來實(shí)現(xiàn).因此在執(zhí)行存儲過程前將INOUT和OUT類型的參數(shù)拷貝到運(yùn)行時(shí)狀態(tài)棧的最底層中,當(dāng)解釋執(zhí)行結(jié)束過后,將INOUT和OUT類型的參數(shù)拷貝到用戶的變量空間.
3.1 PL/SQL引擎架構(gòu)
在OceanBase的MergeServer中沒有PL/SQL處理引擎,因此不能支持過程化語言.根據(jù)PL/SQL兼有過程式語言和SQL語句的特點(diǎn),在OceanBase PL/SQL引擎設(shè)計(jì)的時(shí)候,為了充分利用原有系統(tǒng)的SQL引擎,把過程式語句和SQL語句分開處理[18].
如圖5所示,在對PL/SQL編譯執(zhí)行的時(shí)候,首先讀取PL/SQL語句塊,進(jìn)行編譯,在編譯的過程中如果是SQL語句,調(diào)用OceanBase的SQL引擎進(jìn)行編譯生成語法樹;如果是過程語句則由PL/SQL引擎來進(jìn)行編譯生成語法樹,然后將兩部分語法樹結(jié)合生成一棵語法樹.在PostgreSQL系統(tǒng)中,PL/pgSQL引擎只生成語法樹作為中間代碼,然后解釋器根據(jù)語法樹解釋執(zhí)行遇到SQL語句時(shí)調(diào)用系統(tǒng)提供的內(nèi)部接口進(jìn)行執(zhí)行.OceanBase PL/SQL引擎將中間代碼的層次從語法樹提升到物理計(jì)劃樹,物理計(jì)劃樹在解釋執(zhí)行的時(shí)候無需再次通過SQL編譯成物理計(jì)劃,提高了存儲過程中SQL語句的執(zhí)行速度.
OceanBase PL/SQL引擎在對PL/SQL代碼編譯后,生成了一種物理計(jì)劃樹形式的中間代碼,這種代碼并不能直接執(zhí)行,需要一個(gè)解釋器來根據(jù)每個(gè)節(jié)點(diǎn)的類型進(jìn)行相應(yīng)的解釋執(zhí)行.據(jù)此可以將OceanBase PL/SQL引擎分為兩部分:編譯器和解釋器.在OceanBase的PL/SQL引擎架構(gòu)中,詞法分析器、語法分析器、邏輯計(jì)劃生成器、物理計(jì)劃生成器是屬于編譯器部分,解釋執(zhí)行器屬于解釋器部分.
3.2 PL/SQL編譯器
PL/SQL的編譯過程實(shí)際上就是語法樹和物理計(jì)劃樹的生成過程.語法樹的生成需要經(jīng)過詞法分析和語法分析兩個(gè)步驟,形成抽象語法樹結(jié)構(gòu)[16].
圖5 PL/SQL引擎架構(gòu)Fig.5The architecture of PL/SQL engine
詞法分析程序是從程序源碼中提取分析標(biāo)識符(常量、數(shù)學(xué)符號、括號、變量名和保留字等),以提供給后續(xù)的語法分析程序使用.語法分析程序的作用是對詞法分析后產(chǎn)生的標(biāo)識符進(jìn)行語法分析,判斷其是否符合語法,形成抽象語法樹結(jié)構(gòu).在實(shí)踐中,語法分析過程中可能包括多個(gè)任務(wù),比如將不同的詞法單元的信息收集到符號表[13]中、進(jìn)行類型檢查和其他類型的語義分析,以及生成中間代碼.圖6所示為IF節(jié)點(diǎn)的語法樹.
圖6 IF語句語法樹結(jié)構(gòu)Fig.6The syntactic tree of IF statement
OceanBase PL/SQL語句在生成了語法樹后,僅僅只能夠判斷PL/SQL的語法是否正確.所以構(gòu)建語法樹后還需要生成邏輯計(jì)劃,而邏輯計(jì)劃需要明確SQL語句中所涉及的表、字段和表達(dá)式等是否有效.PL/SQL語法樹在生成邏輯計(jì)劃和物理計(jì)劃的時(shí)候采用分治法:對于SQL語句則調(diào)用OceanBase的SQL引擎生成對應(yīng)的邏輯計(jì)劃和物理計(jì)劃,否則使用PL/SQL引擎生成邏輯計(jì)劃和物理計(jì)劃.
3.3 PL/SQL解”器
3.3.1 解釋執(zhí)行
OceanBase PL/SQL引擎生成物理計(jì)劃樹表示的中間代碼后,并不能直接執(zhí)行.需要一個(gè)解釋器對生成的中間代碼進(jìn)行解釋執(zhí)行.
在傳統(tǒng)數(shù)據(jù)庫的存儲過程的實(shí)現(xiàn)方案中,會區(qū)別對待控制流程語句和SQL語句,會將SQL語句交給現(xiàn)有的SQL引擎來執(zhí)行,這樣可以降低實(shí)現(xiàn)難度,但同時(shí)這會降低存儲過程的執(zhí)行效率.但是在OceanBase中,由于在生成中間代碼的時(shí)候已經(jīng)將其中的SQL語句生成為物理執(zhí)行計(jì)劃,因此在執(zhí)行SQL語句的時(shí)候無需對SQL再次編譯,這樣做的好處是在執(zhí)行WHILE和LOOP過程語句的時(shí)候減少SQL編譯時(shí)間.
OceanBase PL/SQL解釋器的方案就是遍歷物理計(jì)劃樹,如圖7所示,從物理計(jì)劃樹的根節(jié)點(diǎn)開始,在遇到SQL語句的物理計(jì)劃的時(shí)候就直接交由OceanBase Q有的執(zhí)行引擎執(zhí)行該物理計(jì)劃,而遇到流程控制語句的時(shí)候,根據(jù)節(jié)點(diǎn)類型采用不用的算法進(jìn)行執(zhí)行,在執(zhí)行過程中如果對變量的操作部分由運(yùn)行時(shí)狀態(tài)完成、如果節(jié)點(diǎn)包含Routine Body的話,則繼續(xù)遞歸地去遍歷訪問這些節(jié)點(diǎn)直到結(jié)束.
圖7 PL/SQL解釋器Fig.7The architecture of PL/SQL executor
3.3.2 運(yùn)行時(shí)狀態(tài)
由于解釋器在解釋執(zhí)行存儲過程中需要獲取聲明變量的類型和值,為此需要為解釋器維護(hù)一個(gè)運(yùn)行時(shí)狀態(tài)[13].運(yùn)行時(shí)狀態(tài)包括一個(gè)唯一標(biāo)識符和一個(gè)符號表:唯一標(biāo)識符用來表示是否執(zhí)行中有異常;符號表用來存儲變量信息.在OceanBase中系統(tǒng)變量和用戶變量都存儲在Session里,所以在設(shè)計(jì)運(yùn)行時(shí)狀態(tài)的時(shí)候需要考慮用戶的自定義變量和運(yùn)行時(shí)變量的重名問題.在OceanBase中可以通過給運(yùn)行時(shí)變量名添加前綴的方式來區(qū)別用戶變量.我們的方案是隨機(jī)16位字符作為運(yùn)行時(shí)變量名的前綴,這樣可以盡量防止變量名沖突.
PL/SQL中語句塊是可以相互嵌套的,變量可以在不同的語句塊中聲明,但是在相同域內(nèi)不能重名.為了實(shí)現(xiàn)對變量的作用域控制,符號表的數(shù)據(jù)結(jié)構(gòu)為一個(gè)棧,每一個(gè)棧元素是一個(gè)Hash表,Hash表里通過變量名來獲取或設(shè)置變量的值.每進(jìn)入一個(gè)新的語句塊就增加一個(gè)Hash表入棧,當(dāng)前層次的語句塊可以訪問棧頂?shù)綏5偷乃性氐臅r(shí)候以及當(dāng)一個(gè)語句塊結(jié)束的時(shí)候,棧頂元素出棧.如圖8所示.
圖8 運(yùn)行時(shí)狀態(tài)堆棧Fig.8Runtime stack
當(dāng)定義一個(gè)變量時(shí),搜索方向?yàn)閺漠?dāng)前層開始往棧底搜索.如果在搜索過程中沒有找到同名變量,則可以允許聲明該變量,否則提示變量已聲明.同理在訪問變量和變量賦值的時(shí)候也是按照自頂向下的順序進(jìn)行遍歷查找.
4.1 實(shí)驗(yàn)環(huán)境
實(shí)驗(yàn)中把OceanBase數(shù)據(jù)庫的RootServer、UpdateServer、ChunkServer和MergeServer都部署在同一臺服務(wù)器上,客戶端用來運(yùn)行測試程序.服務(wù)器的配置如下:CPU E5606 2.13 GHz;132 GB內(nèi)存;2TB/7500轉(zhuǎn)硬盤;CentOS release 6.5系統(tǒng).客戶端的配置為:CPU E5-1603 2.80 GHz;32 GB內(nèi)存;1TB/7500轉(zhuǎn)硬盤;Windows7 64位.
4.2 實(shí)驗(yàn)過程
本測試主要采用客戶機(jī)/服務(wù)器模式下,在客戶端使用JDBC調(diào)用存儲過程和完全通過JDBC完成數(shù)據(jù)庫DML語句操作的性能對比.實(shí)驗(yàn)中建立1張TEST表,建表語句為
步驟為,在數(shù)據(jù)庫中建立名為TEST且有1個(gè)參數(shù)為int類型的存儲過程.相應(yīng)的創(chuàng)建語句為
CREATE PROCEDURE TEST(X INT)BEGIN WHILE X>0 THEN SET X=X-1; INSERT INTO TEST VALUES(X,1,'TEST',123.456,'TEST');END WHILE;END;.
分別采用JDBC調(diào)用存儲過程和循環(huán)使用JDBC調(diào)用數(shù)據(jù)庫完成多對TEST表的增刪、改查操作,通過參數(shù)控制存儲過程執(zhí)行的循環(huán)次數(shù).
4.3 實(shí)驗(yàn)結(jié)果分析
通過存儲過程(Stored Procedure)和JDBC(Jave Data Base Connectivity)(Java數(shù)據(jù)庫連接),完成對TEST表從1 000-10 000條記錄的插入、更新、刪除、查詢等操作.所用的時(shí)間如圖9所示,橫軸表示SQL和存儲過程的執(zhí)行次數(shù),縱軸表示執(zhí)行耗時(shí).
圖9 JDBC與存儲過程SQL性能對比Fig.9SQL performance comparison JDBC with stored procedure
由圖9的數(shù)據(jù)可知,使用存儲過程和JDBC執(zhí)行查詢操作的耗時(shí)和執(zhí)行次數(shù)是呈線性增長的,隨著執(zhí)行次數(shù)的增加,執(zhí)行時(shí)間也線性增加.而且存儲過程的執(zhí)行時(shí)間明顯小于JDBC的執(zhí)行時(shí)間,其性能大約是JDBC的3倍.之所以有這樣的結(jié)果,主要是使用存儲過程可以帶來一些優(yōu)勢,例如減少了網(wǎng)絡(luò)上數(shù)據(jù)傳遞的通信量和通信的次數(shù)、提高了事務(wù)執(zhí)行的速度、降低了事務(wù)響應(yīng)應(yīng)時(shí)間、減少了SQL語句編譯的時(shí)間,以及不用每次都對SQL進(jìn)行語法解析、邏輯計(jì)劃生成和物理計(jì)劃生成等.
由于OceanBase發(fā)布的開源版本沒有考慮對存儲過程的支持,影響了其在企業(yè)和機(jī)構(gòu)的推廣使用.存儲過程的實(shí)現(xiàn)取決于數(shù)據(jù)庫系統(tǒng)的架構(gòu)和實(shí)現(xiàn)方案.本文基于OceanBase架構(gòu)的特點(diǎn)及開源數(shù)據(jù)庫存儲過程的實(shí)現(xiàn)方案,設(shè)計(jì)并實(shí)現(xiàn)了OceanBase的存儲過程功能:以增新增語法結(jié)構(gòu)為目標(biāo),增加了PL/SQL解析引擎;選擇編譯流程控制語句及SQL語句的實(shí)現(xiàn)方案,減少了OceanBase因存儲過程額外編譯SQL語句的時(shí)間;在實(shí)現(xiàn)過程中解決了面向過程的流程控制語句與面向集合的SQL語句的統(tǒng)一處理;解釋了執(zhí)行存儲過程時(shí)的狀態(tài)維護(hù)以及運(yùn)行時(shí)變量與用戶變量的區(qū)分等難點(diǎn).
實(shí)驗(yàn)表明,存儲過程能夠減少客戶端與數(shù)據(jù)庫服務(wù)器的通信量,并通過緩存生成的物理計(jì)劃樹提高執(zhí)行性能.但是還有一些不完善的地方,如異常處理機(jī)制和重載存儲過程都還未能實(shí)現(xiàn),在以后的工作中將對這兩個(gè)問題進(jìn)行研究.
[1]CHANG F,DEAN J,GHEMAWAT S,et al.Bigtable:A distributed storage system for structured data [C]//Proceedings of the 7th Symposium on Operating Systems Design and Implementation(OSDI).2006:205-218.
[2]CORBETT J C,DEAN J,EPSTEIN M,et al.Spanner:Google’s globally distributed database[J].ACM Transactions on Computer Systems,2013,31(3):251-264.
[3]STONEBRAKER M,WEISBERG A.The voltDB main memory DBMS[J].IEEE Data Eng Bull,2013,36(2): 21-27.
[4]OceanBase[EB/OL].[2016-03-01].https://github.com/alibaba/oceanbase/.
[5]HURSCH C J,HURSCH J L.SQL:The Structured Query Language[M].[S.l.]:TAB books Inc,1988.
[6]PL/pgSQL[EB/OL].[2016-03-02].http://www.postgresql.org/docs/8.3/static/plpgsql.html.
[7]彭智勇,彭煜瑋.PostgreSQL數(shù)據(jù)庫內(nèi)核分析[M].北京:機(jī)械工業(yè)出版社,2011.
[8]MySQL[EB/OL].[2016-03-02].http://www.mysql.com/.
[9]Stored Procedure[EB/OL].[2016-03-02].http://en.wikipedia.org/wiki/Stored procedure.
[10]URMAN S.Oracle9i PL/SQL Programming[M].北京:機(jī)械工業(yè)出版社,2002.
[11]楊傳輝.大規(guī)模分布式存儲系統(tǒng)原理解析和架構(gòu)實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2013.
[12]LEVINE J,JOHN L.Flex&Bison[M].南京:東南大學(xué)出版社,2010.
[13]AHO A V,SETHI R,ULLMAN J D.Compilers:Principles,techniques,and tools[M].Boston:Addison-Wesley Publishing Company,1986.
[14]陽振坤.OceanBase關(guān)系數(shù)據(jù)庫架構(gòu)[J].華東師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2014(5):141-148+163.
[15]高朝瑞.GKD-Base PL/SQL存儲過程和包的研究與實(shí)現(xiàn)[D].長沙:國防科學(xué)技術(shù)大學(xué),2004.
[16]汪琦.基于解釋器的數(shù)據(jù)庫存儲過程研究[D].武漢:華中科技大學(xué),2007.
[17]GARCIA-MOLINA H,ULLMAN J D,WIDOM J.數(shù)據(jù)庫系統(tǒng)實(shí)現(xiàn)[M].楊冬青,吳愈青,包小源,譯.2版.北京:機(jī)械工業(yè)出版社,2010.
[18]朱濤,周敏奇,張召.面向OceanBase的存儲過程實(shí)現(xiàn)技術(shù)研究[J].華東師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2014(5):281-289.
(責(zé)任編輯:李藝)
Designs and implementations of stored procedure in OceanBase
ZHU Jun,LIU Bai-zhong,YU Sheng-jun,GONG Xue-qing,ZHOU Min-qi
(Institute for Data Science and Engineering,East China Normal University, Shanghai200062,China)
As an extension of standard SQL(Structured Query Language),the stored procedure is an important feature in modern databases.OceanBase is a new type of distributed database system which supports massive data processing,but the open-sourced version OceanBase does not support stored procedure,which influences its adoption in enterprises.In this paper,we analyze the principle of stored procedure and the query processing mechinism of OceanBase in detail.Then,the complete design and implementation of stored procedure which supports PL/SQL are presented.
stored procedure;SQL;OceanBase
TP392
A
10.3969/j.issn.1000-5641.2016.05.016
1000-5641(2016)05-0144-09
2016-05
國家自然科學(xué)基金(61332006);國家863計(jì)劃項(xiàng)目(2015AA015307)
祝君,男,碩士研究生,研究方向?yàn)榉植际綌?shù)據(jù)庫.E-mail:zhujunxxxxx@163.com.
周敏奇,男,副教授,碩士生導(dǎo)師,研究方向?yàn)閮?nèi)存數(shù)據(jù)庫.E-mail:mqzhou@sei.ecnu.edu.cn.