專利名稱:一種數(shù)據(jù)庫系統(tǒng)及分布式sql語句執(zhí)行計(jì)劃重用方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)庫系統(tǒng)領(lǐng)域,特別是涉及了 一種數(shù)據(jù)庫系統(tǒng)及分 布式結(jié)構(gòu)化查詢語言(Structured Query Language, SQL)語句扭^亍計(jì)劃 重用方法。
背景技術(shù):
在數(shù)據(jù)庫界,最為普遍接受的語法標(biāo)準(zhǔn)是SQL92,即ansi x3.135-1992中"數(shù)據(jù)庫語言SQL"—節(jié)所規(guī)定的語法標(biāo)準(zhǔn),該標(biāo)準(zhǔn)規(guī) 定了數(shù)據(jù)庫用戶操作數(shù)據(jù)庫服務(wù)器的接口標(biāo)準(zhǔn),它是一種純文本接 口,這就意味著在任何支持SQL92標(biāo)準(zhǔn)的數(shù)據(jù)庫中, 一定會(huì)存在 將客戶端發(fā)來的SQL語句文本串轉(zhuǎn)換為內(nèi)部可執(zhí)行數(shù)據(jù)結(jié)構(gòu)和代碼 的過程,這種轉(zhuǎn)換后的內(nèi)部數(shù)據(jù)結(jié)構(gòu)和代碼在數(shù)據(jù)庫界通稱為"執(zhí)行 計(jì)劃",這種轉(zhuǎn)換過程通稱為"硬解析"。
由于SQL語法本身的可擴(kuò)展、可連接、可嵌套等特性, 一個(gè)SQL 語句可能復(fù)雜到匪夷所思的程度,SQL語法解析器要做到通用和兼 容,必須各種語句都要支持,所以硬解析是極其復(fù)雜和耗時(shí)的過程, 若每個(gè)SQL語句執(zhí)行時(shí)都硬解析一次,那么數(shù)據(jù)庫的性能必定是極 其低下的。因此,為了提高性能,任何商用數(shù)據(jù)庫都會(huì)有執(zhí)行計(jì)劃重 用功能,即相同語句僅在第一次執(zhí)行時(shí)進(jìn)行硬解析,解析完成后SQL 語句及其執(zhí)行計(jì)劃被緩存下來,再次執(zhí)行相同語句時(shí),通過對(duì)SQL 語句進(jìn)行hash運(yùn)算匹配到上次的4丸行計(jì)劃,就可以重用執(zhí)行計(jì)劃, 省去了大量的硬解析4喿作。
可以看出,對(duì)SQL語句進(jìn)行hash運(yùn)算的過程十分關(guān)鍵,該運(yùn)算 的速度和結(jié)果離散度直接決定了執(zhí)行計(jì)劃重用的速度。如圖l所示, 在傳統(tǒng)的數(shù)據(jù)庫中,SQL語句匹配的過程都是在數(shù)據(jù)庫服務(wù)端進(jìn)行 的,客戶端僅負(fù)責(zé)發(fā)送語句和接收結(jié)果;而服務(wù)端不僅需要對(duì)所有接 收到的SQL語句進(jìn)行hash運(yùn)算,并且還要對(duì)第一次執(zhí)行的SQL語句
5進(jìn)行硬解析并存儲(chǔ),當(dāng)服務(wù)端連接的客戶端非常多、執(zhí)行語句非常頻
繁時(shí),hash匹配運(yùn)算對(duì)服務(wù)端也將產(chǎn)生巨大的壓力,離散度越高的 hash算法會(huì)導(dǎo)致服務(wù)端的中央處理器(CPU)負(fù)荷越高,這個(gè)問題在 內(nèi)存數(shù)據(jù)庫中體現(xiàn)得尤其明顯,因?yàn)閮?nèi)存數(shù)據(jù)庫幾乎沒有I/O的負(fù)擔(dān), 所以瓶頸一定是體現(xiàn)在CPU密集型操作上,而hash運(yùn)算就是一種典 型的CPU密集型操作。
這種完全集中于服務(wù)端的SQL匹配模式有以下弊端
1、 所有hash運(yùn)算壓力完全放在服務(wù)端,客戶端除了發(fā)送語句和 接收結(jié)果外什么都不做,造成等待結(jié)果期間客戶端計(jì)算能力的閑置和 浪費(fèi);
2、 全部在服務(wù)端進(jìn)行CPU密集型的hash運(yùn)算將造成服務(wù)端的 性能瓶頸,不利于客戶端數(shù)量的擴(kuò)展,也影響了后續(xù)其余處理步驟的 效率。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是,提供一種數(shù)據(jù)庫系統(tǒng)及分布式 SQL語句執(zhí)行計(jì)劃重用方法,本發(fā)明減輕了數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),也 提高了數(shù)據(jù)庫系統(tǒng)的計(jì)算能力使用率。
本發(fā)明公開了 一種數(shù)據(jù)庫系統(tǒng),包括客戶端服務(wù)器和數(shù)據(jù)庫服務(wù) 器,所述
客戶端服務(wù)器用于在啟動(dòng)時(shí)創(chuàng)建hash表,用于對(duì)用戶發(fā)送的SQL 語句進(jìn)行hash運(yùn)算,以及根據(jù)得到的hash表下標(biāo)值從所述hash表中 查找相應(yīng)SQL語句在服務(wù)端的執(zhí)行計(jì)劃緩存數(shù)組的下標(biāo)值,并在查 找到時(shí),讀取所述下標(biāo)值,并將所述SQL語句與所述下標(biāo)值發(fā)送給 所述數(shù)據(jù)庫服務(wù)器;在未查找到時(shí)將僅所述SQL語句發(fā)送給所述數(shù) 據(jù)庫服務(wù)器;
數(shù)據(jù)庫服務(wù)器用于在啟動(dòng)時(shí)創(chuàng)建執(zhí)行計(jì)劃緩存數(shù)組,用于解析并 判斷所述客戶端服務(wù)器發(fā)送來的請(qǐng)求包中是否攜帶有合法有效的下 標(biāo)值,并在解析結(jié)果中存在合法有效的下標(biāo)值時(shí),通過所述下標(biāo)值查 找相應(yīng)的執(zhí)行計(jì)劃并使用所述執(zhí)行計(jì)劃執(zhí)行,將執(zhí)行結(jié)果返回給所述客戶端服務(wù)器;在解析結(jié)果中不存在下標(biāo)值或者下標(biāo)值非法/失效時(shí), 硬解析所述請(qǐng)求包攜帶的SQL語句,并在所述執(zhí)行計(jì)劃緩存數(shù)組中 為其分配空閑節(jié)點(diǎn),將硬解析得到的執(zhí)行計(jì)劃和所述SQL語句存入 所述節(jié)點(diǎn),記錄所述節(jié)點(diǎn)的下標(biāo)值,使用得到的執(zhí)行計(jì)劃執(zhí)行,將執(zhí) 行結(jié)果和所述記錄的下標(biāo)值返回給所述客戶端服務(wù)器。
所述客戶端服務(wù)器還用于解析所述數(shù)據(jù)庫服務(wù)器返回的響應(yīng)包, 將執(zhí)行結(jié)果返回給用戶,用于判斷所述響應(yīng)包中是否攜帶有下標(biāo)值; 在響應(yīng)包攜帶有下標(biāo)值時(shí),判斷本地hash表中是否存在當(dāng)前SQL語 句,若存在,則將其對(duì)應(yīng)的下標(biāo)值更新成當(dāng)前解析得到的下標(biāo)值;若 不存在,則將當(dāng)前SQL語句和解析得到的下標(biāo)值存入本地hash表中。
本發(fā)明還在所述數(shù)據(jù)庫系統(tǒng)的基礎(chǔ)上公開了一種分布式SQL語 句執(zhí)行計(jì)劃重用方法,所述方法包括
客戶端接收到用戶的SQL語句后,對(duì)其進(jìn)行hash運(yùn)算,根據(jù)得 到的hash表下標(biāo)值在本地hash表中查找所述SQL語句,找到后讀取 所述SQL語句在服務(wù)端執(zhí)行計(jì)劃緩存數(shù)組中的下標(biāo)值,將所述SQL 語句和所述下標(biāo)值發(fā)送給服務(wù)端;
服務(wù)端接收到客戶端的請(qǐng)求包后,解析所述請(qǐng)求包,根據(jù)得到的 SQL語句和執(zhí)行計(jì)劃緩存數(shù)組下標(biāo)值,找到相應(yīng)的執(zhí)行計(jì)劃并使用所 述執(zhí)行計(jì)劃執(zhí)行,執(zhí)行結(jié)束后將結(jié)果返回給所述客戶端。
若所述客戶端在本地hash表中沒有查找到所述SQL語句,則僅 將所述SQL語句發(fā)送給所述服務(wù)端。
若所述服務(wù)端從接收到的請(qǐng)求包中沒有攜帶下標(biāo)值或者攜帶的 下標(biāo)值非法/失效,則執(zhí)行如下操作
步驟a:硬解析所述SQL語句,得到執(zhí)行計(jì)劃;
步驟b:在執(zhí)行計(jì)劃緩存數(shù)組中為所述SQL語句分配一個(gè)空閑節(jié) 點(diǎn),將所述SQL語句及其執(zhí)行計(jì)劃存入所述節(jié)點(diǎn),并記錄所述節(jié)點(diǎn) 的下標(biāo)值;
步驟c:使用所述執(zhí)行計(jì)劃執(zhí)行,得到執(zhí)行結(jié)果; 步驟d:將執(zhí)行結(jié)果和記錄的下標(biāo)值返回給所述客戶端。 所述客戶端接收到服務(wù)端返回的響應(yīng)包后,執(zhí)行如下步驟 步驟A:解析并判斷所述響應(yīng)包中是否攜帶有下標(biāo)值,若是,則執(zhí)行步驟B;否則,執(zhí)行步驟C;
步驟B:根據(jù)hash表下標(biāo)值查找本地hash表中是否存在當(dāng)前SQL 語句,若是,則將其對(duì)應(yīng)的執(zhí)行計(jì)劃緩存數(shù)組下標(biāo)值更新成解析得到 的下標(biāo)值;否則,根據(jù)所述hash表下標(biāo)值將當(dāng)前SQL語句和解析得 到的下標(biāo)值存入本地hash表中;
步驟C:將執(zhí)行結(jié)果返回給用戶。
所述方法還包括
所述客戶端在啟動(dòng)時(shí)創(chuàng)建hash表;
所述服務(wù)端在啟動(dòng)時(shí)創(chuàng)建執(zhí)行計(jì)劃緩存數(shù)組。
所述hash表的記錄數(shù)大于等于本客戶端上可執(zhí)行的SQL語句種 類數(shù),且每條記錄都具有一個(gè)沖突鏈表;
所述執(zhí)行計(jì)劃緩存數(shù)組的節(jié)點(diǎn)數(shù)大于等于數(shù)據(jù)庫系統(tǒng)的SQL語 句種類數(shù),且每個(gè)節(jié)點(diǎn)都具有指針。
所述客戶端將hash表下標(biāo)值相同的SQL語句及其執(zhí)行計(jì)劃緩存 數(shù)組下標(biāo)值存儲(chǔ)在所述hash表下標(biāo)值對(duì)應(yīng)記錄的沖突鏈表的不同節(jié) 點(diǎn)巾。
所述服務(wù)端硬解析得到SQL語句的執(zhí)行計(jì)劃后,將所述SQL語 句及其執(zhí)行計(jì)劃存入預(yù)先申請(qǐng)的結(jié)構(gòu)體中,并使得為該SQL語句分 配的執(zhí)行計(jì)劃緩存數(shù)組的節(jié)點(diǎn)的指針指向所述結(jié)構(gòu)體;
所述客戶端通過遍歷所述hash表記錄的沖突鏈表來查找其中是 否存在當(dāng)前SQL語句。
本發(fā)明將對(duì)SQL語句進(jìn)行hash運(yùn)算的過程分散到所有客戶端, 從而將運(yùn)算負(fù)荷平均分布到整個(gè)數(shù)據(jù)庫系統(tǒng)中所有成員機(jī)器,不僅大 大減輕了數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),極大地提高了數(shù)據(jù)庫服務(wù)器的處理能 力,也提高了整個(gè)數(shù)據(jù)庫系統(tǒng)的計(jì)算能力使用率。
圖l是傳統(tǒng)的執(zhí)行計(jì)劃重用方法示意圖2是本發(fā)明所述系統(tǒng)示意圖3是本發(fā)明所述方法總體流程示意圖4是本發(fā)明所述方法實(shí)施例一流程示意圖。
8
具體實(shí)施例方式
以下結(jié)合附圖和優(yōu)選實(shí)施例,對(duì)本發(fā)明做進(jìn)一步詳細(xì)說明。
如圖2所示,是本發(fā)明所述數(shù)據(jù)庫系統(tǒng)示意圖,包括客戶端服務(wù) 器和數(shù)據(jù)庫服務(wù)器,客戶端服務(wù)器與數(shù)據(jù)庫服務(wù)器直接以TCP/IP協(xié)
議通信,客戶端服務(wù)器與數(shù)據(jù)庫服務(wù)器之間的關(guān)系可以是一對(duì)多、多
對(duì)一或者多對(duì)多,本實(shí)施例采用多對(duì)一模式,即包括N個(gè)客戶端服
務(wù)器和一個(gè)數(shù)據(jù)庫服務(wù)器的模式,其中
客戶端服務(wù)器用于在啟動(dòng)時(shí)創(chuàng)建記錄數(shù)大于等于本客戶端上可
執(zhí)行的SQL語句種類數(shù)的hash表;用于對(duì)用戶發(fā)送的SQL語句進(jìn)行
hash運(yùn)算,以及根據(jù)得到的hash表下標(biāo)值從hash表中查找相應(yīng)SQL
語句在服務(wù)端的執(zhí)行計(jì)劃緩存數(shù)組的下標(biāo)值,并在查找到時(shí),讀取所
述下標(biāo)值,并將所述SQL語句與所述下標(biāo)值發(fā)送給數(shù)據(jù)庫服務(wù)器;
在未查找到時(shí)將僅所述SQL語句發(fā)送給數(shù)據(jù)庫服務(wù)器;還用于解析
數(shù)據(jù)庫服務(wù)器返回的響應(yīng)包,將執(zhí)行結(jié)果返回給用戶,用于判斷響應(yīng)
包中是否攜帶有下標(biāo)值;在響應(yīng)包攜帶有下標(biāo)值時(shí),判斷本地hash表中是否存在當(dāng)前SQL語句,若存在,則將其對(duì)應(yīng)的下標(biāo)值更新成
當(dāng)前解析得到的下標(biāo)值;若不存在,則將當(dāng)前SQL語句和解析得到
的下標(biāo)值存入本地hash表中。
數(shù)據(jù)庫服務(wù)器用于在啟動(dòng)時(shí)創(chuàng)建節(jié)點(diǎn)數(shù)大于等于數(shù)據(jù)庫系統(tǒng)的
SQL語句種類數(shù)的執(zhí)行計(jì)劃緩存數(shù)組,用于解析并判斷所述客戶端服 務(wù)器發(fā)送來的請(qǐng)求包中是否攜帶有合法有效的下標(biāo)值,并在解析結(jié)果 中存在合法有效的下標(biāo)值時(shí),通過所述下標(biāo)值查找相應(yīng)的執(zhí)行計(jì)劃并 使用所述執(zhí)行計(jì)劃執(zhí)行,將執(zhí)行結(jié)果返回給客戶端服務(wù)器;在解析結(jié) 果中不存在下標(biāo)值或者下標(biāo)值非法/失效時(shí),硬解析所述請(qǐng)求包攜帶 的SQL語句,并在所述執(zhí)行計(jì)劃緩存數(shù)組中為其分配空閑節(jié)點(diǎn),將 硬解析得到的執(zhí)行計(jì)劃和所述SQL語句存入所述節(jié)點(diǎn),記錄所述節(jié) 點(diǎn)的下標(biāo)值,使用得到的執(zhí)行計(jì)劃執(zhí)行,將執(zhí)行結(jié)果和所述記錄的下 標(biāo)值返回給客戶端服務(wù)器。
如圖3所示,是本發(fā)明優(yōu)選實(shí)施例中hash表和執(zhí)行計(jì)劃緩存凄史 組的結(jié)構(gòu)示意圖,本實(shí)施例中,
客戶端啟動(dòng)時(shí)創(chuàng)建的hash表的記錄數(shù)為M,每條記錄都具有一個(gè)沖突鏈表,本實(shí)施例中,假設(shè)記錄M-1的沖突鏈表中存儲(chǔ)有兩個(gè)
SQL語句及其下標(biāo)值,其余的都為空,客戶端將hash運(yùn)算得到的hash 表下標(biāo)值相同的SQL語句及其在數(shù)據(jù)庫服務(wù)器的執(zhí)行計(jì)劃緩存數(shù)組 的下標(biāo)值存儲(chǔ)在運(yùn)算得到的hash表下標(biāo)值記錄的沖突鏈表的不同節(jié) 點(diǎn)中;當(dāng)需要查找時(shí),則根據(jù)所述運(yùn)算得到的hash表下標(biāo)值定位到 相應(yīng)的記錄,然后再遍歷該記錄的沖突鏈表即可。
數(shù)據(jù)庫服務(wù)器啟動(dòng)時(shí)創(chuàng)建的執(zhí)行計(jì)劃緩存數(shù)組的節(jié)點(diǎn)數(shù)為n,每
個(gè)節(jié)點(diǎn)都具有voi^指針,數(shù)據(jù)庫服務(wù)器硬解析SQL語句后,將得到 的執(zhí)行計(jì)劃和SQL語句先存入一個(gè)預(yù)先申請(qǐng)的結(jié)構(gòu)體中,然后使得 為該SQL語句分配的數(shù)組節(jié)點(diǎn)的指針指向所述結(jié)構(gòu)體。
如圖4所示,是本發(fā)明所述方法的實(shí)施例流程示意圖,本實(shí)施例
中,假設(shè)客戶端和服務(wù)器端都已啟動(dòng),即客戶端已創(chuàng)建了一個(gè)通常意 義上的hash表(hash表在計(jì)算機(jī)業(yè)界有通用的定義和現(xiàn)成的代碼, 本發(fā)明中不再詳細(xì)敘述),表名為hashjab, hash—tab的最大記錄數(shù)為 n; hash—tab的每條記錄都含有一個(gè)沖突鏈表,hash表下標(biāo)值相同的 SQL語句及其執(zhí)行計(jì)劃緩存數(shù)組下標(biāo)值被存放在此鏈表的一個(gè)節(jié)點(diǎn) 中;服務(wù)端也已創(chuàng)建了一個(gè)長(zhǎng)度為max—saved—plans的數(shù)組,數(shù)組名 為array—server; 具體包括如下步驟
步驟401:客戶端收到一個(gè)SQL語句,設(shè)長(zhǎng)度為SQLJen;
步驟402:對(duì)所述SQL語句進(jìn)行hash運(yùn)算,得到hash值hash—val, 用hash—val對(duì)n取模,得到hash_tab下標(biāo)值hash—tab—foot,并定位到 hash—tab的hash—tab—foot的沖突鏈表頭節(jié)點(diǎn)head—node;
這里的hash算法的應(yīng)適用于長(zhǎng)度不定的字符串處理并且適應(yīng)于 本機(jī)CPU處理能力。
步驟403:從head—node開始遍歷沖突鏈表,將本次待執(zhí)行的SQL 語句和存儲(chǔ)在每一個(gè)節(jié)點(diǎn)的SQL語句進(jìn)行比較;
步驟404:判斷是否找到,若找到,則執(zhí)行步驟405;否則,執(zhí) 行步驟406;
本步驟中,若該SQL語句是第一次執(zhí)行,則找不到,否則,可 以找到;步驟405:取出其中存儲(chǔ)的下標(biāo)值achieved—node—foot,將SQL 語句和achieved_node—foot打包發(fā)送給"良務(wù)端,并等待服務(wù)端返回響 應(yīng)包;
步驟406:將SQL語句打包發(fā)送給服務(wù)端,并等待服務(wù)端返回響 應(yīng)包;
步驟407:服務(wù)端收到客戶端的請(qǐng)求包;
步驟408:解析并判斷是否攜帶了下標(biāo)值,若是,則執(zhí)行步驟409; 否則,執(zhí)行步驟410;
步驟409:判斷解析得到的下標(biāo)值achieved_node—foot是否合法 有效,若是,則執(zhí)行步驟412;否則,執(zhí)行步驟410;
步驟410:對(duì)解析得到的SQL語句進(jìn)行硬解析,得到執(zhí)行計(jì)劃 exe_plan;
硬解析的算法可以采用通用的flex和yyac配合的方式實(shí)現(xiàn)。
步驟411 : 從array—server中分配 一 個(gè)空閑節(jié)點(diǎn),設(shè)為 achieved一node, 其下才示j直為achieved—node—foot; 一奪所述SQL "i吾句禾口 得到的執(zhí)行計(jì)劃存入預(yù)先申請(qǐng)的結(jié)構(gòu)體中,并使得achieved—node執(zhí) 行該結(jié)構(gòu)體,記錄achieved—node下標(biāo)值achieved—node—foot;
步驟412:使用exejlan執(zhí)行,得到執(zhí)行結(jié)果;
步驟413:將才丸行結(jié)果和achieved—node—foot打包返回癥會(huì)客戶端;
步驟414: #4居下才示<直achieved—node—foot才戈到array—server的 achieved—node—foot節(jié)點(diǎn),讀耳又只寸應(yīng)的4丸4亍i十戈寸exe_plan;
步驟415:使用讀取的exejlan執(zhí)行,得到執(zhí)行結(jié)果;
步驟416:將執(zhí)行結(jié)果返回給客戶端;
步驟417:客戶端接收到服務(wù)端的響應(yīng)包;
步驟418:解析并判斷響應(yīng)包中是否攜帶有下標(biāo)值,若是,則執(zhí) 行步驟419;否則,執(zhí)行步驟420;
步驟419:判斷hash—tab的hash—tab—foot的沖突鏈表中是否存在 當(dāng)前SQL語句,若是,則執(zhí)行步驟420;否則,執(zhí)行步驟421;
本步驟與步驟403采用的方法相同,都是通過遍歷所述沖突鏈 表,用當(dāng)前SQL語句和存儲(chǔ)在所述沖突鏈表的每一個(gè)節(jié)點(diǎn)的SQL語句進(jìn)行比較,若找到相同的,則存在;否則,不存在。
步驟420:將該SQL語句對(duì)應(yīng)的下標(biāo)值更新成解析出的下標(biāo)值 achieved—node—foot,執(zhí)行步驟422;
步驟421:將當(dāng)前SQL語句和achieved—node—foot存入hash—tab 的hash—tab—foot記錄的沖突《連表中;
步驟422:將解析出的執(zhí)行結(jié)果返回給用戶。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明, 凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改,等同替換,改進(jìn)等, 均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1、一種數(shù)據(jù)庫系統(tǒng),包括客戶端服務(wù)器和數(shù)據(jù)庫服務(wù)器,其特征在于,所述客戶端服務(wù)器用于在啟動(dòng)時(shí)創(chuàng)建hash表,用于對(duì)用戶發(fā)送的結(jié)構(gòu)化查詢語言SQL語句進(jìn)行hash運(yùn)算,以及根據(jù)得到的hash表下標(biāo)值從所述hash表中查找相應(yīng)SQL語句在服務(wù)端的執(zhí)行計(jì)劃緩存數(shù)組的下標(biāo)值,并在查找到時(shí),讀取所述下標(biāo)值,并將所述SQL語句與所述下標(biāo)值發(fā)送給所述數(shù)據(jù)庫服務(wù)器;在未查找到時(shí)將僅所述SQL語句發(fā)送給所述數(shù)據(jù)庫服務(wù)器;數(shù)據(jù)庫服務(wù)器用于在啟動(dòng)時(shí)創(chuàng)建執(zhí)行計(jì)劃緩存數(shù)組,用于解析并判斷所述客戶端服務(wù)器發(fā)送來的請(qǐng)求包中是否攜帶有合法有效的下標(biāo)值,并在解析結(jié)果中存在合法有效的下標(biāo)值時(shí),通過所述下標(biāo)值查找相應(yīng)的執(zhí)行計(jì)劃并使用所述執(zhí)行計(jì)劃執(zhí)行,將執(zhí)行結(jié)果返回給所述客戶端服務(wù)器;在解析結(jié)果中不存在下標(biāo)值或者下標(biāo)值非法/失效時(shí),硬解析所述請(qǐng)求包攜帶的SQL語句,并在所述執(zhí)行計(jì)劃緩存數(shù)組中為其分配空閑節(jié)點(diǎn),將硬解析得到的執(zhí)行計(jì)劃和所述SQL語句存入所述節(jié)點(diǎn),記錄所述節(jié)點(diǎn)的下標(biāo)值,使用得到的執(zhí)行計(jì)劃執(zhí)行,將執(zhí)行結(jié)果和所述記錄的下標(biāo)值返回給所述客戶端服務(wù)器。
2、如權(quán)利要求1所述的數(shù)據(jù)庫系統(tǒng),其特征在于,將執(zhí)行結(jié)果返回給用戶,用于判斷所述響應(yīng)包中是否攜帶有下標(biāo)值; 在響應(yīng)包攜帶有下標(biāo)值時(shí),判斷本地hash表中是否存在當(dāng)前SQL語 句,若存在,則將其對(duì)應(yīng)的下標(biāo)值更新成當(dāng)前解析得到的下標(biāo)值;若 不存在,則將當(dāng)前SQL語句和解析得到的下標(biāo)值存入本地hash表中。
3、 一種分布式SQL語句執(zhí)行計(jì)劃重用方法,其特征在于, 客戶端接收到用戶的SQL語句后,對(duì)其進(jìn)行hash運(yùn)算,根據(jù)得 到的hash表下標(biāo)值在本地hash表中查找所述SQL語句,找到后讀取 所述SQL語句在服務(wù)端執(zhí)行計(jì)劃緩存數(shù)組中的下標(biāo)值,將所述SQL 語句和所述下標(biāo)值發(fā)送給服務(wù)端;服務(wù)端接收到客戶端的請(qǐng)求包后,解析所述請(qǐng)求包,根據(jù)得到的SQL語句和執(zhí)行計(jì)劃緩存數(shù)組下標(biāo)值,找到相應(yīng)的執(zhí)行計(jì)劃并使用所述執(zhí)行計(jì)劃執(zhí)行,執(zhí)行結(jié)束后將結(jié)果返回給所述客戶端。
4、 如權(quán)利要求3所述的分布式SQL語句執(zhí)行計(jì)劃重用方法,其 特征在于,若所述客戶端在本地hash表中沒有查找到所述SQL語句, 則僅將所述SQL語句發(fā)送給所述服務(wù)端。
5、 如權(quán)利要求3所述的分布式SQL語句執(zhí)行計(jì)劃重用方法,其 特征在于,若所述服務(wù)端從接收到的請(qǐng)求包中沒有攜帶下標(biāo)值或者攜 帶的下標(biāo)值非法/失效,則執(zhí)行如下操作步驟a:硬解析所述SQL語句,得到執(zhí)行計(jì)劃;步驟b:在執(zhí)行計(jì)劃緩存數(shù)組中為所述SQL語句分配一個(gè)空閑節(jié)點(diǎn),將所述SQL語句及其執(zhí)行計(jì)劃存入所述節(jié)點(diǎn),并記錄所述節(jié)點(diǎn)的下標(biāo)值;步驟c:使用所述執(zhí)行計(jì)劃執(zhí)行,得到執(zhí)行結(jié)果;步驟d:將執(zhí)行結(jié)果和記錄的下標(biāo)值返回給所述客戶端。
6、 如權(quán)利要求3或5所述的分布式SQL語句執(zhí)行計(jì)劃重用方法, 其特征在于,所述客戶端接收到服務(wù)端返回的響應(yīng)包后,執(zhí)行如下步 驟步驟A:解析并判斷所述響應(yīng)包中是否攜帶有下標(biāo)值,若是,則 執(zhí)行步驟B;否則,執(zhí)行步驟C;步驟B:根據(jù)hash表下標(biāo)值查找本地hash表中是否存在當(dāng)前SQL 語句,若是,則將其對(duì)應(yīng)的執(zhí)行計(jì)劃緩存數(shù)組下標(biāo)值更新成解析得到 的下標(biāo)值;否則,根據(jù)所述hash表下標(biāo)值將當(dāng)前SQL語句和解析得 到的下標(biāo)值存入本地hash表中;步驟C:將執(zhí)行結(jié)果返回給用戶。
7、 如權(quán)利要求3所述的分布式SQL語句執(zhí)行計(jì)劃重用方法,其 特征在于,所述方法還包括所述客戶端在啟動(dòng)時(shí)創(chuàng)建hash表;所述服務(wù)端在啟動(dòng)時(shí)創(chuàng)建執(zhí)行計(jì)劃緩存數(shù)組。
8、 如權(quán)利要求7所述的分布式SQL語句執(zhí)行計(jì)劃重用方法,其 特征在于,所述hash表的記錄數(shù)大于等于本客戶端上可執(zhí)行的SQL 語句種類數(shù),且每條記錄都具有一個(gè)沖突鏈表;所述執(zhí)行計(jì)劃緩存數(shù)組的節(jié)點(diǎn)數(shù)大于等于數(shù)據(jù)庫系統(tǒng)的SQL語 句種類數(shù),且每個(gè)節(jié)點(diǎn)都具有一個(gè)指針。
9、 如權(quán)利要求8所述的分布式SQL語句執(zhí)行計(jì)劃重用方法,其 特征在于,所述客戶端將hash表下標(biāo)值相同的SQL語句及其執(zhí)行計(jì) 劃緩存數(shù)組下標(biāo)值存儲(chǔ)在所述hash表下標(biāo)值對(duì)應(yīng)記錄的沖突鏈表的 不同節(jié)點(diǎn)中。
10、 如權(quán)利要求3或8所述的分布式SQL語句l丸行計(jì)劃重用方 法,其特征在于,所述服務(wù)端硬解析得到SQL語句的執(zhí)行計(jì)劃后, 將所述SQL語句及其執(zhí)行計(jì)劃存入預(yù)先申請(qǐng)的結(jié)構(gòu)體中,并使得為 該SQL語句分配的執(zhí)行計(jì)劃緩存數(shù)組的節(jié)點(diǎn)的指針指向所述結(jié)構(gòu)體;所述客戶端通過遍歷所述hash表記錄的沖突鏈表來查找其中是 否存在當(dāng)前SQL語句。
全文摘要
本發(fā)明涉及一種數(shù)據(jù)庫系統(tǒng)及分布式SQL語句執(zhí)行計(jì)劃重用方法,所述系統(tǒng)包括客戶端服務(wù)器和數(shù)據(jù)庫服務(wù)器;所述方法為客戶端接收到用戶的SQL語句后,對(duì)其進(jìn)行hash運(yùn)算,根據(jù)得到的hash表下標(biāo)值在本地hash表中查找所述SQL語句,找到后讀取所述SQL語句在服務(wù)端執(zhí)行計(jì)劃緩存數(shù)組中的下標(biāo)值,將所述SQL語句和所述下標(biāo)值發(fā)送給服務(wù)端;服務(wù)端接收到客戶端的請(qǐng)求包后,解析所述請(qǐng)求包,根據(jù)得到的SQL語句和執(zhí)行計(jì)劃緩存數(shù)組下標(biāo)值,找到相應(yīng)的執(zhí)行計(jì)劃并使用所述執(zhí)行計(jì)劃執(zhí)行,執(zhí)行結(jié)束后將結(jié)果返回給所述客戶端。本發(fā)明減輕了數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān),也提高了數(shù)據(jù)庫系統(tǒng)的計(jì)算能力使用率。
文檔編號(hào)G06F17/30GK101567006SQ20091010777
公開日2009年10月28日 申請(qǐng)日期2009年5月25日 優(yōu)先權(quán)日2009年5月25日
發(fā)明者丁奇鵬 申請(qǐng)人:中興通訊股份有限公司