亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        面向OceanBase的存儲(chǔ)過(guò)程設(shè)計(jì)與實(shí)現(xiàn)

        2016-11-29 09:34:32祝君劉柏fl余晟雋宮學(xué)慶周敏奇
        關(guān)鍵詞:引擎數(shù)據(jù)庫(kù)物理

        祝君,劉柏fl,余晟雋,宮學(xué)慶,周敏奇

        (華東師范大學(xué)數(shù)據(jù)科學(xué)與工程研究院,上海200062)

        面向OceanBase的存儲(chǔ)過(guò)程設(shè)計(jì)與實(shí)現(xiàn)

        祝君,劉柏fl,余晟雋,宮學(xué)慶,周敏奇

        (華東師范大學(xué)數(shù)據(jù)科學(xué)與工程研究院,上海200062)

        存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)管理系統(tǒng)的一個(gè)重要特性,它是標(biāo)準(zhǔn)結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language,SQL)的一個(gè)擴(kuò)展.OceanBase是一個(gè)新型的支持海量數(shù)據(jù)處理的分布式數(shù)據(jù)庫(kù)系統(tǒng),但現(xiàn)有OceanBase的開源版本不支持存儲(chǔ)過(guò)程功能,影響了該系統(tǒng)在企業(yè)和機(jī)構(gòu)中的推廣和應(yīng)用.本文在深度分析存儲(chǔ)過(guò)程原理以及OceanBase查詢處理策略的基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了支持PL/SQL(Procedural Language/SQL)的存儲(chǔ)過(guò)程機(jī)制.

        存儲(chǔ)過(guò)程;SQL;OceanBase

        0 引言

        隨著大數(shù)據(jù)時(shí)代和互聯(lián)網(wǎng)時(shí)代的到來(lái),信息量呈井噴式爆發(fā),傳統(tǒng)的集中式數(shù)據(jù)庫(kù)管理系統(tǒng)難以處理如此巨大的數(shù)據(jù).在集中式系統(tǒng)架構(gòu)下,盡管可以依據(jù)業(yè)務(wù)特點(diǎn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行拆分,實(shí)現(xiàn)數(shù)據(jù)表的水平切分/垂直切分并存儲(chǔ)到不同的數(shù)據(jù)庫(kù)服務(wù)器上,但隨著業(yè)務(wù)和數(shù)據(jù)量不斷增長(zhǎng),需要不斷地增加服務(wù)器以實(shí)現(xiàn)更細(xì)粒度的數(shù)據(jù)表切分,這種方法需要大量的人工維護(hù)成本.因此很多企業(yè)將目光轉(zhuǎn)向了逐漸成熟的分布式數(shù)據(jù)庫(kù)系統(tǒng),并利用其良好的可擴(kuò)展性和容錯(cuò)性等來(lái)滿足存儲(chǔ)海量數(shù)據(jù)的應(yīng)用需求.近幾年,隨著分布式數(shù)據(jù)庫(kù)的快速發(fā)展,各種分布式數(shù)據(jù)庫(kù)如雨后春筍般出現(xiàn),如Bigtable[1]、Spanner[2]、VoltDB[3],以及阿里巴巴(Alibaba)的OceanBase[4]等.雖然這些系統(tǒng)多數(shù)擁有存儲(chǔ)和管理海量數(shù)據(jù)的能力,但是在數(shù)據(jù)一致性、事務(wù)處理能力、SQL[5]功能上,同傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)相比還有差距,很難被直接應(yīng)用于銀行業(yè)務(wù)系統(tǒng)等傳統(tǒng)的大型信息系統(tǒng)中,制約了分布式數(shù)據(jù)庫(kù)在企業(yè)和機(jī)構(gòu)中的推廣和使用.但是越來(lái)越多的企業(yè)開始關(guān)注于增強(qiáng)分布式數(shù)據(jù)系統(tǒng)功能,如增加SQL支持、事務(wù)、二級(jí)索引、一致性等.

        OceanBase是Alibaba研發(fā)的關(guān)系型分布式數(shù)據(jù)庫(kù),它實(shí)現(xiàn)了關(guān)系數(shù)據(jù)庫(kù)的重要特征,也支持SQL查詢;但是和主流的關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)PostgreSQL[6-7]、MySQL[8]等相比較,功能上還存在一些不足的地方,如不支持存儲(chǔ)過(guò)程[9]和游標(biāo)等.存儲(chǔ)過(guò)程在現(xiàn)代企業(yè)中應(yīng)用十分廣泛,大多數(shù)企業(yè)的業(yè)務(wù)邏輯都采用存儲(chǔ)過(guò)程實(shí)現(xiàn),而OceanBase作為關(guān)系型數(shù)據(jù)庫(kù)想要在企業(yè)和機(jī)構(gòu)中被廣泛應(yīng)用,就需要支持存儲(chǔ)過(guò)程,以B企業(yè)和機(jī)構(gòu)易于將存儲(chǔ)過(guò)程所寫的業(yè)務(wù)遷移到OceanBase數(shù)據(jù)庫(kù)系統(tǒng).

        本文通過(guò)深入分析主流的開源數(shù)據(jù)庫(kù)管理系統(tǒng)的存儲(chǔ)過(guò)程功能,對(duì)實(shí)現(xiàn)中的一些關(guān)鍵技術(shù)問題進(jìn)行研究,并結(jié)合OceanBase架構(gòu)和其現(xiàn)有的查詢引擎,提出一種適合OceanBase數(shù)據(jù)庫(kù)架構(gòu)的存儲(chǔ)過(guò)程設(shè)計(jì)和實(shí)現(xiàn)方案.本文安排如下:第1節(jié)介紹OceanBase架構(gòu)和存儲(chǔ)過(guò)程;第2節(jié)介紹OceanBase存儲(chǔ)過(guò)程機(jī)制;第3節(jié)介紹PL/SQL[10]引擎架構(gòu);第4節(jié)對(duì)OceanBase存儲(chǔ)過(guò)程進(jìn)行實(shí)驗(yàn);第5節(jié)總結(jié)全文.

        1 背景

        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.客戶端通過(guò)MySQL(關(guān)于數(shù)據(jù)庫(kù)管理系統(tǒng))協(xié)議將SQL請(qǐng)求發(fā)送到MergeServer后,MergeServer首先解析MySQL協(xié)議,從中提取出用戶發(fā)送的SQL語(yǔ)句,接著通過(guò)MS-SQL模塊,使用Flex與Bison[12]進(jìn)行詞法解析和語(yǔ)法分析[13],生成語(yǔ)法樹[13];然后生成SQL語(yǔ)句的邏輯查詢計(jì)劃和物理查詢計(jì)劃;最后根據(jù)物理查詢計(jì)劃調(diào)用OceanBase內(nèi)部的各種操作符.MergeServer是OceanBase查詢請(qǐng)求的入口,負(fù)責(zé)對(duì)收到的SQL進(jìn)行處理和響應(yīng).

        1.2 PL/SQL和存儲(chǔ)過(guò)程簡(jiǎn)介

        PL/SQL是Oracle數(shù)據(jù)庫(kù)對(duì)SQL語(yǔ)句的擴(kuò)展定義并實(shí)現(xiàn)的一種過(guò)程化SQL語(yǔ)言(Procedural Language/SQL),也是一種程序語(yǔ)言,在普通SQL語(yǔ)句的使用上增加了編程語(yǔ)言的特點(diǎn).PL/SQL引入多種數(shù)據(jù)類型、變量聲明、條件控制、循環(huán)結(jié)構(gòu)和子程序等過(guò)程語(yǔ)言要素來(lái)強(qiáng)化SQL語(yǔ)句的過(guò)程處理能力.所以PL/SQL就是把數(shù)據(jù)操作和查詢語(yǔ)句組織在PL/SQL代碼的過(guò)程性單元中,并通過(guò)邏輯判斷、循環(huán)等操作實(shí)現(xiàn)復(fù)雜的功能或者計(jì)算的程序語(yǔ)言.

        存儲(chǔ)過(guò)程是一段被命名后保存在數(shù)據(jù)庫(kù)服務(wù)器端的一段預(yù)先編譯的代碼.上層應(yīng)用給定存儲(chǔ)過(guò)程名稱和相應(yīng)參數(shù)后,解釋執(zhí)行預(yù)編譯的代碼,能有效減少上層應(yīng)用與數(shù)據(jù)庫(kù)交互的次數(shù)和數(shù)據(jù)傳輸量.

        2 OceanBase存儲(chǔ)過(guò)程機(jī)制設(shè)計(jì)

        2.1 OceanBase存儲(chǔ)過(guò)程架構(gòu)

        在OceanBase中為實(shí)現(xiàn)存儲(chǔ)過(guò)程,選擇使用PL/SQL作為存儲(chǔ)過(guò)程的宿主語(yǔ)言.因?yàn)镻L/SQL最為常用,用戶更習(xí)慣PL/SQL的編程方式.但OceanBase的原有架構(gòu)中, MergeServer只能對(duì)SQL語(yǔ)句進(jìn)行解析,不能解析存儲(chǔ)過(guò)程使用的PL/SQL語(yǔ)句.所以在原來(lái)的MergeServer架構(gòu)[14]中,增加PL/SQL引擎模塊來(lái)對(duì)存儲(chǔ)過(guò)程的PL/SQL語(yǔ)句進(jìn)行解析處理.增加PL/SQL引擎模塊后的MergeServer架構(gòu)如圖2所示.

        圖2 MergeServer架構(gòu)圖Fig.2The architecture of MergeServer

        增加了PL/SQL引擎模塊后,當(dāng)MergeServer收到存儲(chǔ)過(guò)程相關(guān)的PL/SQL語(yǔ)句后,會(huì)將收到的PL/SQL交給PL/SQL引擎處理.PL/SQL引擎[15]包括編譯器和解釋器兩個(gè)部分.編譯器負(fù)責(zé)對(duì)PL/SQL進(jìn)行編譯.解釋器負(fù)責(zé)解釋執(zhí)行[16]編譯器編譯后的中間代碼.

        2.2 存儲(chǔ)過(guò)程創(chuàng)建和存儲(chǔ)

        2.2.1 存儲(chǔ)過(guò)程創(chuàng)建

        存儲(chǔ)過(guò)程的創(chuàng)建可以說(shuō)是存儲(chǔ)過(guò)程物理計(jì)劃樹[17]的生成過(guò)程.物理計(jì)劃樹的生成分為4個(gè)步驟:詞法解析;語(yǔ)法分析;邏輯計(jì)劃生成;物理計(jì)劃生成.存儲(chǔ)過(guò)程創(chuàng)建的流程如圖3所示.

        當(dāng)存儲(chǔ)過(guò)程語(yǔ)句發(fā)送到MergeServer后,PL/SQL引擎對(duì)存儲(chǔ)過(guò)程代碼進(jìn)行語(yǔ)法詞法解析,判斷是否有語(yǔ)法錯(cuò)誤,如果有錯(cuò)誤,則將予以報(bào)錯(cuò),否則將會(huì)生成一棵語(yǔ)法樹.語(yǔ)法樹生成后進(jìn)入到邏輯計(jì)劃生成部分,對(duì)存儲(chǔ)過(guò)程中的表、字段、屬性、變量的合法性進(jìn)行檢查[17],如果有錯(cuò)誤則提示錯(cuò)誤信息.最后進(jìn)入物理計(jì)劃生成階段,會(huì)先判斷存儲(chǔ)過(guò)程在系統(tǒng)表里面是否已經(jīng)定義過(guò),如果存在相同名稱的存儲(chǔ)過(guò)程則提示用戶,否則將存儲(chǔ)過(guò)程源碼存入系統(tǒng)表all procedure里面,并把生成的物理執(zhí)行計(jì)劃存儲(chǔ)在數(shù)據(jù)庫(kù)服務(wù)端;然后返回創(chuàng)建成功的提示信息.在創(chuàng)建存儲(chǔ)過(guò)程的時(shí)候并不會(huì)解釋執(zhí)行生成的物理計(jì)劃,物理計(jì)劃只會(huì)在調(diào)用的時(shí)候才會(huì)被解釋執(zhí)行.

        圖3 存儲(chǔ)過(guò)程創(chuàng)建流程圖Fig.3The flowchart of stored procedure creating

        2.2.2 存儲(chǔ)過(guò)程的存儲(chǔ)

        存儲(chǔ)主要分為兩種方式:單源碼方式和源碼+預(yù)編譯方式.單源碼方式是指只在數(shù)據(jù)庫(kù)中保存存儲(chǔ)過(guò)程的源碼,而后者是在數(shù)據(jù)庫(kù)中保存了源碼后,并且也保存了預(yù)編譯生成的執(zhí)行單元.在OceanBase的存儲(chǔ)過(guò)程實(shí)現(xiàn)方案中存儲(chǔ)過(guò)程的存儲(chǔ)模式,采用和Oracle、PostgreSQL類似的方案,即源碼+中間代碼的存儲(chǔ)方案,不同的是在OceanBase中,中間代碼不是語(yǔ)法樹,而是物理計(jì)劃樹.

        在OceanBase中新增一張名為all procedure的系統(tǒng)表,用來(lái)保存存儲(chǔ)過(guò)程源碼. all procedure表的基本字段如表1所示.

        表1 all procedure表的字段Tab.1Schema ofall procedure

        在OceanBase中,客戶端連接到MergeServer的時(shí)候,系統(tǒng)會(huì)為該連接分配一個(gè)SESSION用來(lái)表示這次會(huì)話.在SESSION中建立一個(gè)緩存中間代碼的隊(duì)列,為了不過(guò)多占用內(nèi)存,中間代碼的緩存采用FIFO(First Input First Output)(先進(jìn)先出隊(duì)列)策略,如果當(dāng)前的SESSION中緩存的中間代碼過(guò)多,可將最早進(jìn)入緩存隊(duì)列的對(duì)象移除.

        2.3 存儲(chǔ)過(guò)程的執(zhí)行

        調(diào)用存儲(chǔ)過(guò)程的語(yǔ)句進(jìn)入到查詢處理器后,首先會(huì)通過(guò)PL/SQL引擎進(jìn)行詞法、語(yǔ)法解析,判斷是否存在語(yǔ)法錯(cuò)誤.然后根據(jù)解析出來(lái)的存儲(chǔ)過(guò)程名稱和參數(shù)在緩存隊(duì)列中進(jìn)行查找,當(dāng)函數(shù)簽名和調(diào)用參數(shù)一致時(shí)返回該存儲(chǔ)過(guò)程的物理執(zhí)行計(jì)劃樹;如果沒有在緩存隊(duì)列中找到物理執(zhí)行計(jì)劃樹,就到系統(tǒng)表all procedure中查找,查詢到記錄則將查詢到的存儲(chǔ)過(guò)程源碼使用PL/SQL引擎重新編譯生成物理計(jì)劃樹,否則提示存儲(chǔ)過(guò)程不存在或錯(cuò)誤.最后將物理計(jì)劃樹使用PL/SQL解釋器進(jìn)行解釋執(zhí)行.存儲(chǔ)過(guò)程執(zhí)行流程如圖4所示.

        圖4 存儲(chǔ)過(guò)程執(zhí)行流程圖Fig.4The flowchart of stored procedure execution

        存儲(chǔ)過(guò)程是沒有返回值的,但是可以通過(guò)INOUT和OUT類型的輸出參數(shù)來(lái)實(shí)現(xiàn).因此在執(zhí)行存儲(chǔ)過(guò)程前將INOUT和OUT類型的參數(shù)拷貝到運(yùn)行時(shí)狀態(tài)棧的最底層中,當(dāng)解釋執(zhí)行結(jié)束過(guò)后,將INOUT和OUT類型的參數(shù)拷貝到用戶的變量空間.

        3 OceanBase PL/SQL引擎設(shè)計(jì)與實(shí)現(xiàn)

        3.1 PL/SQL引擎架構(gòu)

        在OceanBase的MergeServer中沒有PL/SQL處理引擎,因此不能支持過(guò)程化語(yǔ)言.根據(jù)PL/SQL兼有過(guò)程式語(yǔ)言和SQL語(yǔ)句的特點(diǎn),在OceanBase PL/SQL引擎設(shè)計(jì)的時(shí)候,為了充分利用原有系統(tǒng)的SQL引擎,把過(guò)程式語(yǔ)句和SQL語(yǔ)句分開處理[18].

        如圖5所示,在對(duì)PL/SQL編譯執(zhí)行的時(shí)候,首先讀取PL/SQL語(yǔ)句塊,進(jìn)行編譯,在編譯的過(guò)程中如果是SQL語(yǔ)句,調(diào)用OceanBase的SQL引擎進(jìn)行編譯生成語(yǔ)法樹;如果是過(guò)程語(yǔ)句則由PL/SQL引擎來(lái)進(jìn)行編譯生成語(yǔ)法樹,然后將兩部分語(yǔ)法樹結(jié)合生成一棵語(yǔ)法樹.在PostgreSQL系統(tǒng)中,PL/pgSQL引擎只生成語(yǔ)法樹作為中間代碼,然后解釋器根據(jù)語(yǔ)法樹解釋執(zhí)行遇到SQL語(yǔ)句時(shí)調(diào)用系統(tǒng)提供的內(nèi)部接口進(jìn)行執(zhí)行.OceanBase PL/SQL引擎將中間代碼的層次從語(yǔ)法樹提升到物理計(jì)劃樹,物理計(jì)劃樹在解釋執(zhí)行的時(shí)候無(wú)需再次通過(guò)SQL編譯成物理計(jì)劃,提高了存儲(chǔ)過(guò)程中SQL語(yǔ)句的執(zhí)行速度.

        OceanBase PL/SQL引擎在對(duì)PL/SQL代碼編譯后,生成了一種物理計(jì)劃樹形式的中間代碼,這種代碼并不能直接執(zhí)行,需要一個(gè)解釋器來(lái)根據(jù)每個(gè)節(jié)點(diǎn)的類型進(jìn)行相應(yīng)的解釋執(zhí)行.據(jù)此可以將OceanBase PL/SQL引擎分為兩部分:編譯器和解釋器.在OceanBase的PL/SQL引擎架構(gòu)中,詞法分析器、語(yǔ)法分析器、邏輯計(jì)劃生成器、物理計(jì)劃生成器是屬于編譯器部分,解釋執(zhí)行器屬于解釋器部分.

        3.2 PL/SQL編譯器

        PL/SQL的編譯過(guò)程實(shí)際上就是語(yǔ)法樹和物理計(jì)劃樹的生成過(guò)程.語(yǔ)法樹的生成需要經(jīng)過(guò)詞法分析和語(yǔ)法分析兩個(gè)步驟,形成抽象語(yǔ)法樹結(jié)構(gòu)[16].

        圖5 PL/SQL引擎架構(gòu)Fig.5The architecture of PL/SQL engine

        詞法分析程序是從程序源碼中提取分析標(biāo)識(shí)符(常量、數(shù)學(xué)符號(hào)、括號(hào)、變量名和保留字等),以提供給后續(xù)的語(yǔ)法分析程序使用.語(yǔ)法分析程序的作用是對(duì)詞法分析后產(chǎn)生的標(biāo)識(shí)符進(jìn)行語(yǔ)法分析,判斷其是否符合語(yǔ)法,形成抽象語(yǔ)法樹結(jié)構(gòu).在實(shí)踐中,語(yǔ)法分析過(guò)程中可能包括多個(gè)任務(wù),比如將不同的詞法單元的信息收集到符號(hào)表[13]中、進(jìn)行類型檢查和其他類型的語(yǔ)義分析,以及生成中間代碼.圖6所示為IF節(jié)點(diǎn)的語(yǔ)法樹.

        圖6 IF語(yǔ)句語(yǔ)法樹結(jié)構(gòu)Fig.6The syntactic tree of IF statement

        OceanBase PL/SQL語(yǔ)句在生成了語(yǔ)法樹后,僅僅只能夠判斷PL/SQL的語(yǔ)法是否正確.所以構(gòu)建語(yǔ)法樹后還需要生成邏輯計(jì)劃,而邏輯計(jì)劃需要明確SQL語(yǔ)句中所涉及的表、字段和表達(dá)式等是否有效.PL/SQL語(yǔ)法樹在生成邏輯計(jì)劃和物理計(jì)劃的時(shí)候采用分治法:對(duì)于SQL語(yǔ)句則調(diào)用OceanBase的SQL引擎生成對(duì)應(yīng)的邏輯計(jì)劃和物理計(jì)劃,否則使用PL/SQL引擎生成邏輯計(jì)劃和物理計(jì)劃.

        3.3 PL/SQL解”器

        3.3.1 解釋執(zhí)行

        OceanBase PL/SQL引擎生成物理計(jì)劃樹表示的中間代碼后,并不能直接執(zhí)行.需要一個(gè)解釋器對(duì)生成的中間代碼進(jìn)行解釋執(zhí)行.

        在傳統(tǒng)數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程的實(shí)現(xiàn)方案中,會(huì)區(qū)別對(duì)待控制流程語(yǔ)句和SQL語(yǔ)句,會(huì)將SQL語(yǔ)句交給現(xiàn)有的SQL引擎來(lái)執(zhí)行,這樣可以降低實(shí)現(xiàn)難度,但同時(shí)這會(huì)降低存儲(chǔ)過(guò)程的執(zhí)行效率.但是在OceanBase中,由于在生成中間代碼的時(shí)候已經(jīng)將其中的SQL語(yǔ)句生成為物理執(zhí)行計(jì)劃,因此在執(zhí)行SQL語(yǔ)句的時(shí)候無(wú)需對(duì)SQL再次編譯,這樣做的好處是在執(zhí)行WHILE和LOOP過(guò)程語(yǔ)句的時(shí)候減少SQL編譯時(shí)間.

        OceanBase PL/SQL解釋器的方案就是遍歷物理計(jì)劃樹,如圖7所示,從物理計(jì)劃樹的根節(jié)點(diǎn)開始,在遇到SQL語(yǔ)句的物理計(jì)劃的時(shí)候就直接交由OceanBase Q有的執(zhí)行引擎執(zhí)行該物理計(jì)劃,而遇到流程控制語(yǔ)句的時(shí)候,根據(jù)節(jié)點(diǎn)類型采用不用的算法進(jìn)行執(zhí)行,在執(zhí)行過(guò)程中如果對(duì)變量的操作部分由運(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í)行存儲(chǔ)過(guò)程中需要獲取聲明變量的類型和值,為此需要為解釋器維護(hù)一個(gè)運(yùn)行時(shí)狀態(tài)[13].運(yùn)行時(shí)狀態(tài)包括一個(gè)唯一標(biāo)識(shí)符和一個(gè)符號(hào)表:唯一標(biāo)識(shí)符用來(lái)表示是否執(zhí)行中有異常;符號(hào)表用來(lái)存儲(chǔ)變量信息.在OceanBase中系統(tǒng)變量和用戶變量都存儲(chǔ)在Session里,所以在設(shè)計(jì)運(yùn)行時(shí)狀態(tài)的時(shí)候需要考慮用戶的自定義變量和運(yùn)行時(shí)變量的重名問題.在OceanBase中可以通過(guò)給運(yùn)行時(shí)變量名添加前綴的方式來(lái)區(qū)別用戶變量.我們的方案是隨機(jī)16位字符作為運(yùn)行時(shí)變量名的前綴,這樣可以盡量防止變量名沖突.

        PL/SQL中語(yǔ)句塊是可以相互嵌套的,變量可以在不同的語(yǔ)句塊中聲明,但是在相同域內(nèi)不能重名.為了實(shí)現(xiàn)對(duì)變量的作用域控制,符號(hào)表的數(shù)據(jù)結(jié)構(gòu)為一個(gè)棧,每一個(gè)棧元素是一個(gè)Hash表,Hash表里通過(guò)變量名來(lái)獲取或設(shè)置變量的值.每進(jìn)入一個(gè)新的語(yǔ)句塊就增加一個(gè)Hash表入棧,當(dāng)前層次的語(yǔ)句塊可以訪問棧頂?shù)綏5偷乃性氐臅r(shí)候以及當(dāng)一個(gè)語(yǔ)句塊結(jié)束的時(shí)候,棧頂元素出棧.如圖8所示.

        圖8 運(yùn)行時(shí)狀態(tài)堆棧Fig.8Runtime stack

        當(dāng)定義一個(gè)變量時(shí),搜索方向?yàn)閺漠?dāng)前層開始往棧底搜索.如果在搜索過(guò)程中沒有找到同名變量,則可以允許聲明該變量,否則提示變量已聲明.同理在訪問變量和變量賦值的時(shí)候也是按照自頂向下的順序進(jìn)行遍歷查找.

        4 實(shí)驗(yàn)

        4.1 實(shí)驗(yàn)環(huán)境

        實(shí)驗(yàn)中把OceanBase數(shù)據(jù)庫(kù)的RootServer、UpdateServer、ChunkServer和MergeServer都部署在同一臺(tái)服務(wù)器上,客戶端用來(lái)運(yùn)行測(cè)試程序.服務(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)過(guò)程

        本測(cè)試主要采用客戶機(jī)/服務(wù)器模式下,在客戶端使用JDBC調(diào)用存儲(chǔ)過(guò)程和完全通過(guò)JDBC完成數(shù)據(jù)庫(kù)DML語(yǔ)句操作的性能對(duì)比.實(shí)驗(yàn)中建立1張TEST表,建表語(yǔ)句為

        步驟為,在數(shù)據(jù)庫(kù)中建立名為TEST且有1個(gè)參數(shù)為int類型的存儲(chǔ)過(guò)程.相應(yīng)的創(chuàng)建語(yǔ)句為

        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)用存儲(chǔ)過(guò)程和循環(huán)使用JDBC調(diào)用數(shù)據(jù)庫(kù)完成多對(duì)TEST表的增刪、改查操作,通過(guò)參數(shù)控制存儲(chǔ)過(guò)程執(zhí)行的循環(huán)次數(shù).

        4.3 實(shí)驗(yàn)結(jié)果分析

        通過(guò)存儲(chǔ)過(guò)程(Stored Procedure)和JDBC(Jave Data Base Connectivity)(Java數(shù)據(jù)庫(kù)連接),完成對(duì)TEST表從1 000-10 000條記錄的插入、更新、刪除、查詢等操作.所用的時(shí)間如圖9所示,橫軸表示SQL和存儲(chǔ)過(guò)程的執(zhí)行次數(shù),縱軸表示執(zhí)行耗時(shí).

        圖9 JDBC與存儲(chǔ)過(guò)程SQL性能對(duì)比Fig.9SQL performance comparison JDBC with stored procedure

        由圖9的數(shù)據(jù)可知,使用存儲(chǔ)過(guò)程和JDBC執(zhí)行查詢操作的耗時(shí)和執(zhí)行次數(shù)是呈線性增長(zhǎng)的,隨著執(zhí)行次數(shù)的增加,執(zhí)行時(shí)間也線性增加.而且存儲(chǔ)過(guò)程的執(zhí)行時(shí)間明顯小于JDBC的執(zhí)行時(shí)間,其性能大約是JDBC的3倍.之所以有這樣的結(jié)果,主要是使用存儲(chǔ)過(guò)程可以帶來(lái)一些優(yōu)勢(shì),例如減少了網(wǎng)絡(luò)上數(shù)據(jù)傳遞的通信量和通信的次數(shù)、提高了事務(wù)執(zhí)行的速度、降低了事務(wù)響應(yīng)應(yīng)時(shí)間、減少了SQL語(yǔ)句編譯的時(shí)間,以及不用每次都對(duì)SQL進(jìn)行語(yǔ)法解析、邏輯計(jì)劃生成和物理計(jì)劃生成等.

        5 總結(jié)與展望

        由于OceanBase發(fā)布的開源版本沒有考慮對(duì)存儲(chǔ)過(guò)程的支持,影響了其在企業(yè)和機(jī)構(gòu)的推廣使用.存儲(chǔ)過(guò)程的實(shí)現(xiàn)取決于數(shù)據(jù)庫(kù)系統(tǒng)的架構(gòu)和實(shí)現(xiàn)方案.本文基于OceanBase架構(gòu)的特點(diǎn)及開源數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程的實(shí)現(xiàn)方案,設(shè)計(jì)并實(shí)現(xiàn)了OceanBase的存儲(chǔ)過(guò)程功能:以增新增語(yǔ)法結(jié)構(gòu)為目標(biāo),增加了PL/SQL解析引擎;選擇編譯流程控制語(yǔ)句及SQL語(yǔ)句的實(shí)現(xiàn)方案,減少了OceanBase因存儲(chǔ)過(guò)程額外編譯SQL語(yǔ)句的時(shí)間;在實(shí)現(xiàn)過(guò)程中解決了面向過(guò)程的流程控制語(yǔ)句與面向集合的SQL語(yǔ)句的統(tǒng)一處理;解釋了執(zhí)行存儲(chǔ)過(guò)程時(shí)的狀態(tài)維護(hù)以及運(yùn)行時(shí)變量與用戶變量的區(qū)分等難點(diǎn).

        實(shí)驗(yàn)表明,存儲(chǔ)過(guò)程能夠減少客戶端與數(shù)據(jù)庫(kù)服務(wù)器的通信量,并通過(guò)緩存生成的物理計(jì)劃樹提高執(zhí)行性能.但是還有一些不完善的地方,如異常處理機(jī)制和重載存儲(chǔ)過(guò)程都還未能實(shí)現(xiàn),在以后的工作中將對(duì)這兩個(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ù)庫(kù)內(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ī)模分布式存儲(chǔ)系統(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]陽(yáng)振坤.OceanBase關(guān)系數(shù)據(jù)庫(kù)架構(gòu)[J].華東師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2014(5):141-148+163.

        [15]高朝瑞.GKD-Base PL/SQL存儲(chǔ)過(guò)程和包的研究與實(shí)現(xiàn)[D].長(zhǎng)沙:國(guó)防科學(xué)技術(shù)大學(xué),2004.

        [16]汪琦.基于解釋器的數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程研究[D].武漢:華中科技大學(xué),2007.

        [17]GARCIA-MOLINA H,ULLMAN J D,WIDOM J.數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)[M].楊冬青,吳愈青,包小源,譯.2版.北京:機(jī)械工業(yè)出版社,2010.

        [18]朱濤,周敏奇,張召.面向OceanBase的存儲(chǔ)過(guò)程實(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

        國(guó)家自然科學(xué)基金(61332006);國(guó)家863計(jì)劃項(xiàng)目(2015AA015307)

        祝君,男,碩士研究生,研究方向?yàn)榉植际綌?shù)據(jù)庫(kù).E-mail:zhujunxxxxx@163.com.

        周敏奇,男,副教授,碩士生導(dǎo)師,研究方向?yàn)閮?nèi)存數(shù)據(jù)庫(kù).E-mail:mqzhou@sei.ecnu.edu.cn.

        猜你喜歡
        引擎數(shù)據(jù)庫(kù)物理
        只因是物理
        井岡教育(2022年2期)2022-10-14 03:11:44
        處處留心皆物理
        藍(lán)谷: “涉藍(lán)”新引擎
        商周刊(2017年22期)2017-11-09 05:08:31
        三腳插頭上的物理知識(shí)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        無(wú)形的引擎
        河南電力(2015年5期)2015-06-08 06:01:46
        我不是教物理的
        中學(xué)生(2015年2期)2015-03-01 03:43:33
        国产婷婷成人久久av免费| 91人妻无码成人精品一区91| 亚洲AV小说在线观看| 亚洲精品大全中文字幕| 婷婷色综合视频在线观看| 欧美成人片一区二区三区| 精品无码久久久久久久久粉色 | 久久久久久人妻一区二区三区 | 亚洲色婷婷一区二区三区| 国产亚洲亚洲精品777| 91精品啪在线观看国产18| 黄页国产精品一区二区免费| 国产偷国产偷亚洲综合av| 国产盗摄xxxx视频xxxx| 麻豆高清免费国产一区| 一区二区韩国福利网站| 中文无字幕一本码专区| 亚洲熟女精品中文字幕| 国产96在线 | 欧美| 国产午夜激情视频自拍| 99久久精品人妻一区| 成人精品一区二区三区电影| 拍摄av现场失控高潮数次| 欧美日韩亚洲国产千人斩| 在线视频日韩精品三区| 亚洲天堂丰满人妻av| 中文字幕一区二区三区人妻少妇| 日韩欧美第一区二区三区| 久久中文字幕av一区二区不卡 | 女人让男人桶爽30分钟| 亚洲天堂资源网| 亚洲第一页在线免费观看| 少妇被又大又粗又爽毛片久久黑人 | 中文字幕久久久久久精| 18禁黄无遮挡免费网站| 日本一级二级三级不卡| 国产白袜脚足j棉袜在线观看| 99国产小视频| 国内揄拍国内精品久久| 女人高潮内射99精品| 国产又黄又大又粗的视频|