專利名稱:透明網(wǎng)絡(luò)邊緣數(shù)據(jù)高速緩存的制作方法
技術(shù)領(lǐng)域:
本公開涉及分布式網(wǎng)絡(luò)之上的數(shù)據(jù)庫高速緩存。
背景技術(shù):
分布式web應(yīng)用的增殖增加了對(duì)遠(yuǎn)程數(shù)據(jù)庫服務(wù)器的應(yīng)用查詢的頻率。為了改進(jìn)這種查詢的性能并增強(qiáng)數(shù)據(jù)可用性,這種應(yīng)用可使用本地?cái)?shù)據(jù)庫高速緩存。例如,內(nèi)容分布網(wǎng)絡(luò)中的邊緣服務(wù)器可使用鄰近的數(shù)據(jù)庫高速緩存來加速數(shù)據(jù)訪問和在網(wǎng)絡(luò)的邊緣處更快地生成動(dòng)態(tài)web內(nèi)容。
在邊緣服務(wù)器上高速緩存數(shù)據(jù)的典型技術(shù)依賴于(i)整個(gè)數(shù)據(jù)庫的顯性復(fù)制或其在本地機(jī)上的顯性部分;或者(ii)對(duì)先前查詢響應(yīng)的高速緩存和新查詢語句相對(duì)于先前已高速緩存的響應(yīng)的精確匹配。在該復(fù)制方案中,由管理員顯性指定高速緩存的內(nèi)容,該管理員必須確定在該邊緣節(jié)點(diǎn)上將復(fù)制數(shù)據(jù)庫表的哪些部分。一旦指定了高速緩存內(nèi)容,該數(shù)據(jù)或者作為表名或者作為“物化視圖”定義從源服務(wù)器復(fù)制到邊緣高速緩存。
在查詢響應(yīng)高速緩存方案中,動(dòng)態(tài)向高速緩存填充應(yīng)用查詢的響應(yīng)。高速緩存中的數(shù)據(jù)通過查詢響應(yīng)的列表來描述,每個(gè)響應(yīng)標(biāo)志一個(gè)查詢語句,該查詢語句是生成了該響應(yīng)的查詢語句。只有當(dāng)后續(xù)查詢通常通過字符串比較匹配于一個(gè)對(duì)應(yīng)于已高速緩存的響應(yīng)的查詢字符串時(shí),該響應(yīng)才用于答復(fù)該后續(xù)查詢。查詢響應(yīng)高速緩存通過對(duì)數(shù)據(jù)進(jìn)行動(dòng)態(tài)高速緩存而消除對(duì)管理員控制的需要,但在分離的區(qū)域中低效存儲(chǔ)數(shù)據(jù),即每個(gè)查詢響應(yīng)一個(gè)區(qū)域。這導(dǎo)致了高的空間開銷,因?yàn)樵谠S多查詢響應(yīng)中可能復(fù)制相同的基本數(shù)據(jù)。這是因?yàn)椴樵冺憫?yīng)常常重疊,通常包括基礎(chǔ)數(shù)據(jù)庫的重要和普通部分。此外,因?yàn)橐迅咚倬彺娴牟樵冺憫?yīng)僅用于滿足原樣重新提交的相同查詢,而不能用于可能包含在該響應(yīng)中的其他查詢,所以該方案導(dǎo)致了有限的性能收益。例如,假定一個(gè)查找年齡小于30的所有雇員的社會(huì)保險(xiǎn)號(hào)的初始查詢。則SQL語句應(yīng)該是SELECT employee.ssn FROM employee WHEREemployee.age<30假設(shè)對(duì)于此查詢的響應(yīng)已被高速緩存,且高速緩存接收到一個(gè)查找年齡小于25的所有雇員的社會(huì)保險(xiǎn)號(hào)的新查詢,則SQL語句應(yīng)該是SELECT employee.ssn FROM employee WHEREemployee.age<25盡管由于所有年齡小于25歲的雇員也小于30歲,而新查詢的響應(yīng)包括在第一個(gè)查詢的響應(yīng)中,但基于精確匹配的查詢響應(yīng)高速緩存不能從該高速緩存來服務(wù)于該查詢。
總之,顯性管理員定義的數(shù)據(jù)高速緩存需要人工參與,并假定管理員對(duì)于每個(gè)邊緣服務(wù)器上的工作負(fù)荷和資源具有熟悉的了解。查詢響應(yīng)高速緩存消除了管理員開銷,但卻遇到了有限的有效性和高的空間開銷。而且,一致性管理也由于已高速緩存數(shù)據(jù)的表示與源服務(wù)器中的基本數(shù)據(jù)之間的不匹配而變得復(fù)雜。一致性控制一般需要或者當(dāng)任何基本表改變時(shí)使所有的查詢響應(yīng)無效,或者維護(hù)復(fù)雜的依賴圖。
因此,期望具有一種高速緩存,其不需要管理員指定其內(nèi)容,或適應(yīng)根據(jù)工作負(fù)荷方面的變化或根據(jù)該高速緩存所存在的機(jī)器上的資源可用性方面的變化的指定的高速緩存。進(jìn)一步期望該高速緩存在存儲(chǔ)開銷和一致性維持方面是高效的。
發(fā)明內(nèi)容
用于支持根據(jù)本地應(yīng)用執(zhí)行的查詢的數(shù)據(jù)動(dòng)態(tài)高速緩存的計(jì)算機(jī)系統(tǒng)和相應(yīng)方法解決了先有技術(shù)的這些和其他缺點(diǎn)及不利之處。
一種示例性系統(tǒng)包括具有完整數(shù)據(jù)庫的遠(yuǎn)程服務(wù)器;邊緣服務(wù)器上包括完整數(shù)據(jù)庫子集的本地?cái)?shù)據(jù)庫,該邊緣服務(wù)器與遠(yuǎn)程服務(wù)器通信;邊緣服務(wù)器上的本地?cái)?shù)據(jù)庫內(nèi)的共享表,用于高速緩存來自完整數(shù)據(jù)庫的結(jié)果、接收本地生成的數(shù)據(jù)、并在確保本地?cái)?shù)據(jù)庫與遠(yuǎn)程數(shù)據(jù)庫之間的數(shù)據(jù)一致性的同時(shí)根據(jù)可用存儲(chǔ)需求調(diào)整高速緩存的內(nèi)容。
一種示例性裝置包括邊緣數(shù)據(jù)高速緩存,該邊緣數(shù)據(jù)高速緩存包括查詢?cè)u(píng)估器、高速緩存索引、高速緩存資源庫、資源管理器、包含檢查器、查詢解析器、及一致性管理器,所有這些部件與查詢?cè)u(píng)估器信號(hào)通信。
一種示例性的用于本地服務(wù)器滿足針對(duì)至少一個(gè)遠(yuǎn)程服務(wù)器的數(shù)據(jù)庫查詢的相應(yīng)方法包括動(dòng)態(tài)高速緩存該遠(yuǎn)程服務(wù)器的先前數(shù)據(jù)庫查詢的結(jié)果;將本地?cái)?shù)據(jù)庫與本地服務(wù)器相關(guān)聯(lián);將多個(gè)高速緩存結(jié)果存儲(chǔ)在本地?cái)?shù)據(jù)庫的共享表中;以及將多個(gè)高速緩存結(jié)果用于滿足對(duì)于本地服務(wù)器的新數(shù)據(jù)庫查詢中。
根據(jù)下面結(jié)合附圖對(duì)示例性實(shí)施例的描述,本公開的這些和其他方面、特征和優(yōu)點(diǎn)將變得顯而易見。
本公開根據(jù)下列示例性附圖教授一種透明網(wǎng)絡(luò)邊緣數(shù)據(jù)高速緩存,其中圖1示出與源服務(wù)器連接的兩個(gè)邊緣服務(wù)器的示意圖;圖2示出圖1的邊緣服務(wù)器的數(shù)據(jù)高速緩存的方框圖;圖3示出圖2的邊緣服務(wù)器數(shù)據(jù)庫高速緩存中的不同類查詢的樹狀圖;圖4示出圖1的邊緣服務(wù)器的整個(gè)查詢處理的流程圖;圖5示出圖2的數(shù)據(jù)高速緩存所使用的普通模式共享存儲(chǔ)技術(shù)的示意圖;圖6示出在圖1源服務(wù)器中的同一表上的兩個(gè)查詢的數(shù)據(jù)表示例;圖7示出一致性維護(hù)協(xié)議的示意圖;圖8示出考慮了一致性的查詢處理算法的流程圖;圖9示出用于將結(jié)果插入高速緩存的算法的流程圖;圖10示出用于執(zhí)行更新事務(wù)的算法的流程圖;以及圖11示出用于調(diào)整高速緩存占用空間的后臺(tái)高速緩存清除算法的流程圖。
具體實(shí)施例方式
本公開的實(shí)施例提供了一種要由本地機(jī)維護(hù)的允許對(duì)于遠(yuǎn)程服務(wù)器的數(shù)據(jù)庫查詢的動(dòng)態(tài)數(shù)據(jù)庫高速緩存。該高速緩存利用本地?cái)?shù)據(jù)庫引擎維護(hù)先前查詢結(jié)果的部分的但語義一致的“物化視圖”。其被基于應(yīng)用查詢流而動(dòng)態(tài)填充。工作于查詢謂詞的包含檢查器用于確定新查詢的結(jié)果是否包含于已高速緩存的結(jié)果并集中。普通本地表用于在重疊查詢結(jié)果之間共享可能的物理存儲(chǔ)器。通過將插入、刪除和更新從源數(shù)據(jù)庫傳播到它們的已高速緩存本地副本,來維護(hù)數(shù)據(jù)一致性。后臺(tái)清除算法通過驅(qū)除過剩的由一致性協(xié)議傳播的行以及屬于已標(biāo)記要從該高速緩存驅(qū)除的查詢的行,來持續(xù)或周期性刪除普通本地表的內(nèi)容。術(shù)語“查詢響應(yīng)”和“查詢結(jié)果”在本公開中交替使用。
在下面的描述中,下列定義可能有助于理解示例性實(shí)施例的原理和/或操作數(shù)據(jù)庫表由關(guān)系數(shù)據(jù)庫系統(tǒng)定義的關(guān)聯(lián)表。
查詢謂詞查詢中指定的約束條件(例如SQL語句中WHERE子句),其用作選擇在查詢結(jié)果中返回基本表中的哪些行的標(biāo)準(zhǔn)。
查詢結(jié)果對(duì)數(shù)據(jù)庫系統(tǒng)的SQL查詢所返回的響應(yīng)。查詢結(jié)果看起來像具有行和列的表。
查詢結(jié)果集合對(duì)應(yīng)于多個(gè)查詢的多個(gè)結(jié)果集合。
增量一致性數(shù)據(jù)庫高速緩存中的數(shù)據(jù)在給定時(shí)間窗內(nèi)相對(duì)于源數(shù)據(jù)庫中的數(shù)據(jù)保持一致的需求。準(zhǔn)確地,它意指已高速緩存數(shù)據(jù)在當(dāng)前時(shí)刻Tc的狀態(tài)與源數(shù)據(jù)庫在時(shí)刻Tp的過去狀態(tài)一致,其中Tp在預(yù)定的最大時(shí)間窗內(nèi)。
查詢/事務(wù)處理時(shí)戳服務(wù)器生成的單調(diào)遞增且與在源服務(wù)器上執(zhí)行的所有查詢和事務(wù)相關(guān)的唯一數(shù)字。該時(shí)戳反映了事務(wù)或查詢相對(duì)于并發(fā)操作的序列順序。
刷新消息由源服務(wù)器發(fā)送到邊緣高速緩存、反映最近對(duì)源數(shù)據(jù)庫中表的改變(例如插入、更新、刪除語句)的消息。對(duì)基本表的變化可在多個(gè)刷新消息中分批處理,但這些刷新消息以它們所報(bào)告的變化發(fā)生順序進(jìn)行傳播。
立即更新可見性在應(yīng)用成功完成更新后,該同一應(yīng)用查詢必須查看對(duì)數(shù)據(jù)庫更新的結(jié)果的屬性。
單調(diào)狀態(tài)轉(zhuǎn)換由應(yīng)用提交給高速緩存的兩個(gè)連續(xù)查詢將查看及時(shí)前進(jìn)的數(shù)據(jù)庫狀態(tài)的屬性,其中第二個(gè)查詢?cè)诮邮盏降谝粋€(gè)查詢的響應(yīng)之后提交。也就是說,第二個(gè)查詢將查看到比第一個(gè)查詢查看到的狀態(tài)在時(shí)間上是新近的或更近的數(shù)據(jù)庫狀態(tài)。
如圖1中所示,具有“邊緣數(shù)據(jù)高速緩存”的示例性網(wǎng)絡(luò)實(shí)施例由參考標(biāo)號(hào)100統(tǒng)一表示。網(wǎng)絡(luò)100可以是較大規(guī)模應(yīng)用系統(tǒng)的一部分。網(wǎng)絡(luò)100包括連接到執(zhí)行web請(qǐng)求的客戶機(jī)的兩個(gè)邊緣服務(wù)器109和110,這兩個(gè)邊緣服務(wù)器還通過網(wǎng)絡(luò)連接107連接到對(duì)主數(shù)據(jù)庫和web站點(diǎn)提供宿主的源服務(wù)器108。源服務(wù)器108包括數(shù)據(jù)庫101、應(yīng)用服務(wù)器102和web服務(wù)器103。邊緣服務(wù)器109、110每個(gè)都包括應(yīng)用服務(wù)器105和web服務(wù)器106。然而,邊緣服務(wù)器不具有源站點(diǎn)中存儲(chǔ)的整個(gè)數(shù)據(jù)庫的拷貝。而是,它使用新的邊緣數(shù)據(jù)高速緩存104。邊緣服務(wù)器接收到對(duì)動(dòng)態(tài)內(nèi)容的請(qǐng)求,且由邊緣應(yīng)用服務(wù)器105中存在的應(yīng)用部件處理該請(qǐng)求。這些部件發(fā)出數(shù)據(jù)庫查詢,其被邊緣數(shù)據(jù)高速緩存104截取并從本地?cái)?shù)據(jù)庫中對(duì)其進(jìn)行處理,如果可能的話。如果該查詢不能由本地?cái)?shù)據(jù)庫處理,則邊緣數(shù)據(jù)高速緩存104向源數(shù)據(jù)庫101轉(zhuǎn)發(fā)該請(qǐng)求并從那里檢索回結(jié)果。
轉(zhuǎn)到圖2,邊緣數(shù)據(jù)高速緩存由參考標(biāo)號(hào)200統(tǒng)一表示。邊緣數(shù)據(jù)高速緩存200包括與主要部分202連接的Java小服務(wù)程序201。主要部分202包括JDBC接口203,其以信號(hào)通信與查詢解析器205、包含檢查器207、查詢?cè)u(píng)估器204、高速緩存索引206、本地資源庫208、一致性管理器210和資源管理器209連接。高速緩存功能實(shí)現(xiàn)于下列部件中查詢解析器205將SQL串轉(zhuǎn)換為“查詢語句”數(shù)據(jù)結(jié)構(gòu),標(biāo)識(shí)各列的列表的分析樹、目標(biāo)表以及該查詢所訪問的各種子句。具體地,將WHERE子句解析為以AND-OR規(guī)范形式存儲(chǔ)的布爾判斷。這允許包含檢查器對(duì)查詢謂詞對(duì)執(zhí)行等價(jià)和包含操作。
查詢包含檢查器207確定新查詢的結(jié)果是否包括在先前已高速緩存的查詢的結(jié)果中。包含可以被檢查為對(duì)于較早查詢、較早查詢的真子集或多個(gè)較早查詢的并集的真子集的精確匹配。
高速緩存索引206提供包含檢查。當(dāng)查詢謂詞復(fù)雜或已高速緩存查詢的集合太長(zhǎng)時(shí),包含檢查可能在計(jì)算上是高成本的。當(dāng)接收到一個(gè)新的查詢時(shí),不是相對(duì)于所有先前已高速緩存的查詢進(jìn)行檢查,而是僅集中于作用于相同表和列的查詢。該高速緩存索引將已高速緩存的查詢根據(jù)表名和列名組織在多級(jí)哈希表中。
查詢?cè)u(píng)估器204是高速緩存的核心模塊,其包括高速緩存邏輯。它確定訪問是命中還是未命中,及在未命中時(shí)由后端返回的結(jié)果是否應(yīng)當(dāng)插入該高速緩存中。在將未命中的查詢傳遞給后端以預(yù)取數(shù)據(jù)和改進(jìn)高速緩存性能之前,它還可能重寫這些在高速緩存中未命中的查詢。
資源管理器209維護(hù)關(guān)于命中率和響應(yīng)時(shí)間的統(tǒng)計(jì)數(shù)據(jù),并維持高速緩存配置參數(shù)。它可改變配置參數(shù)以適應(yīng)某些工作負(fù)荷,如果所收集到的統(tǒng)計(jì)數(shù)據(jù)指示這樣一個(gè)需要的話。
高速緩存資源庫208存儲(chǔ)結(jié)果。在高速緩存未命中時(shí),查詢結(jié)果按照高速緩存評(píng)估器所確定的存儲(chǔ)于本地?cái)?shù)據(jù)庫表中。本公開的實(shí)施例使用混合物理存儲(chǔ)策略。一些查詢使用每個(gè)查詢結(jié)果一個(gè)表的模式,而其他查詢則通過部分填充后端基本表的本地副本來共享物理存儲(chǔ)器。
一致性管理器210響應(yīng)從后端數(shù)據(jù)庫接收到的刷新消息,對(duì)本地高速緩存的數(shù)據(jù)進(jìn)行更新。
操作中,一個(gè)查詢?cè)醋詰?yīng)用或應(yīng)用部件,諸如Java小服務(wù)程序201。數(shù)據(jù)庫高速緩存202接收到該查詢。具體地,高速緩存203中的JDBC接口適配器負(fù)責(zé)與應(yīng)用接口。該接口適配器是Java JDBC標(biāo)準(zhǔn)定義和所需的一組類的實(shí)現(xiàn)。然后,“查詢語句”被傳遞給查詢?cè)u(píng)估器204。該查詢?cè)u(píng)估器是負(fù)責(zé)決定是本地還是遠(yuǎn)程執(zhí)行該查詢并負(fù)責(zé)控制高速緩存的操作的模塊。在接收到查詢語句時(shí),查詢?cè)u(píng)估器通過調(diào)用查詢解析器205來解析所接收到的語句。該解析器將該語句分類到四類中的一類。該語句的處理依賴于其查詢類別。
現(xiàn)在轉(zhuǎn)到圖3,參考標(biāo)號(hào)300表示一個(gè)查詢樹。查詢樹300示出了不同的查詢類別。高速緩存301接收的查詢被組織為兩類,可包含檢查查詢302和不可包含檢查查詢303。已高速緩存的可包含檢查查詢能滿足任何其結(jié)果能被證明是已高速緩存的查詢結(jié)果的子集的隨后查詢。作用于單個(gè)表或關(guān)聯(lián)多個(gè)表、但不包括group-by子句且不包括合計(jì)運(yùn)算符的查詢作為可包含檢查查詢高速緩存。它們可進(jìn)一步分為兩類全部結(jié)果或簡(jiǎn)單查詢304和部分結(jié)果或Top-N查詢305。
可對(duì)不可包含檢查查詢進(jìn)行高速緩存,但使用SOL串的精確匹配來執(zhí)行匹配。它們進(jìn)一步分為兩類合計(jì)查詢306或復(fù)合查詢307。使用UDF、子查詢或group-by子句的復(fù)合查詢不由包含檢查器處理,其作為精確匹配高速緩存。在其選擇列表中使用諸如MIN、MAX、和AVG的合計(jì)運(yùn)算符合計(jì)數(shù)據(jù)的查詢也可作為精確查詢高速緩存。但是,合計(jì)查詢306可通過在其選擇列表中插入合計(jì)運(yùn)算符而轉(zhuǎn)換為可包含檢查查詢302。當(dāng)所估計(jì)的益處相當(dāng)大時(shí),高速緩存進(jìn)行優(yōu)化。
簡(jiǎn)單查詢的處理如下。簡(jiǎn)單查詢是那些其結(jié)果是基本表的行和列的子集的查詢。因此,簡(jiǎn)單查詢不具有任何“GROUP BY”子句、子查詢、或用戶定義的函數(shù)。它們是非Top-N查詢,其根據(jù)使用基本比較原語的WHERE子句簡(jiǎn)單選擇單個(gè)表或多個(gè)表的關(guān)聯(lián)的一部分。下面給出簡(jiǎn)單查詢的一個(gè)例子SELECT employee.id FROM employee WHEREemployee.age<25如圖4中所示,參考標(biāo)號(hào)400表示高級(jí)處理算法。高級(jí)處理算法400用于處理高速緩存命中或高速緩存未命中。在接收到一個(gè)查詢時(shí),高速緩存索引用于檢索對(duì)于同一表列表和列列表的查詢。然后,在判斷塊410,調(diào)用包含檢查器,以確定此查詢是否包括在這些先前已高速緩存的查詢中。
在高速緩存命中的情況下,在功能塊412,對(duì)本地高速緩存執(zhí)行查詢,并返回結(jié)果。功能塊412還將該查詢發(fā)送給高速緩存資源庫414,功能塊412從該高速緩存資源庫414接收結(jié)果。在高速緩存未命中的情況下,在將該查詢發(fā)送給后端服務(wù)器之前,在功能塊416和418重寫該查詢。進(jìn)行下面的優(yōu)化。首先,擴(kuò)充選擇列表,以包括在WHERE子句、order-by子句和having子句中提及的列。這一擴(kuò)充的目的在于最大化能夠執(zhí)行在該高速緩存中命中的其他查詢的可能性。第二,還在選擇列表中添加主鍵列。高速緩存主鍵列對(duì)于在多個(gè)具有重疊結(jié)果的查詢檢索同一基本表的相同行時(shí)防止重復(fù)行被該高速緩存是需要的。在高速緩存未命中時(shí),由后端返回的結(jié)果通常不被插入到高速緩存中。在判斷塊420處,可使用成熟的基于歷史的算法,以在功能塊422決定那些查詢值得高速緩存。結(jié)果作為輸出被提供,并被發(fā)送到高速緩存資源庫414。
Top-N查詢的處理如下。Top-N查詢從通常根據(jù)order-by子句存儲(chǔ)的結(jié)果集合的開始處獲取指定數(shù)量的行。查詢包含和評(píng)估算法不同于簡(jiǎn)單全部結(jié)果查詢的情況。通過取消Fetch子句,將Top-N查詢轉(zhuǎn)換為簡(jiǎn)單查詢。如上面所解釋的那樣對(duì)這些簡(jiǎn)單查詢執(zhí)行包含。在最后的步驟中,考慮Fetch子句。應(yīng)該注意,雖然基本查詢(沒有Fetch子句)是高速緩存命中,但Fetch子句可使它成為高速緩存未命中。例如,考慮下面的兩個(gè)查詢Q1和Q2Q1SELECT id FROM item WHERE cost<15 ORDER BY costFFNRO 20Q1SELECT id FROM item WHERE cost<5 ORDER BY costFFNRO 20如果這兩個(gè)查詢都不存在FETCH FIRST 20 ROWS ONLY算法(“FFNRO 20”)子句,則第二個(gè)查詢的結(jié)果將包括在第一個(gè)查詢的結(jié)果中,即高速緩存命中。但是,當(dāng)存在該子句時(shí),通過僅僅對(duì)查詢語句的檢查是不保證高速緩存命中的。這樣,對(duì)Top-N查詢的包含檢查處理中的第二步是試圖對(duì)已高速緩存數(shù)據(jù)進(jìn)行本地執(zhí)行。如果檢索到了足夠的行,則認(rèn)為該查詢是一個(gè)高速緩存命中,否則,認(rèn)為它是一個(gè)高速緩存未命中。這種類型的高速緩存未命中稱作“部分命中”,因?yàn)樵诒镜馗咚倬彺嬷袃H發(fā)現(xiàn)了結(jié)果的一部分。
如果包含檢查未發(fā)現(xiàn)任何匹配查詢或結(jié)果集合不具有足夠的行,則將原始查詢QN轉(zhuǎn)換為修改查詢QN’,其中在Fetch子句中的N的值由較大N’的值(N’=N*擴(kuò)充-倍數(shù))。例如,在該試驗(yàn)中的默認(rèn)倍數(shù)是2,請(qǐng)求取兩倍數(shù)量的行。檢索到多于應(yīng)用所請(qǐng)求的行是一個(gè)試探,目的在于減少后一“部分命中”查詢、即通過了包含檢查步驟而未能發(fā)現(xiàn)所需數(shù)量的行的查詢的情況。
合計(jì)查詢的處理如下。合計(jì)查詢?cè)谄溥x擇列表中具有合計(jì)運(yùn)算符(例如,MAX、MIN、AVG、SUM),或者是可包含檢查的??紤]下面的查詢,Q3Q3SELECT MAX(cost)FROM item WHERE id=10對(duì)于命中的匹配以兩個(gè)步驟進(jìn)行。首先,根據(jù)SQL串對(duì)Q3的精確匹配進(jìn)行檢查,并將整個(gè)結(jié)果集合返回給應(yīng)用。接著,如果未發(fā)現(xiàn)精確匹配,則通過移除合計(jì)運(yùn)算符將原始查詢Q3修改為查詢Q4Q4SELECT cost FROM item WHERE id=10如果對(duì)于修改后的查詢Q4發(fā)現(xiàn)了包含匹配,則對(duì)本地高速緩存執(zhí)行原始查詢Q3。本地合計(jì)cost,并將結(jié)果返回給應(yīng)用。在高速緩存未命中時(shí),修改后的查詢Q4在后端執(zhí)行。如果結(jié)果集合大小在閾值內(nèi),則將這些結(jié)果存儲(chǔ)在相應(yīng)的本地表中,并本地執(zhí)行原始查詢。這使得該高速緩存能夠服務(wù)于以后具有不同合計(jì)運(yùn)算符的查詢。如果結(jié)果集合大小出現(xiàn)太長(zhǎng),則原始查詢Q3被發(fā)送給后端,并將結(jié)果存儲(chǔ)在新的精確匹配表中。這允許該高速緩存能夠服務(wù)于任何以后具有嚴(yán)格相同合計(jì)條件的查詢。這一試探目的在于增加高速緩存命中率,而不會(huì)過度增加高速緩存的大小。
復(fù)合查詢因?yàn)閺?fù)合子句(例如,在WHERE子句中用戶定義的函數(shù)或子查詢)或因?yàn)間roup-by子句而是不可包含檢查的。group-by子句生成可僅由具有嚴(yán)格相同的group-by子句和WHERE子句的查詢使用的合計(jì)數(shù)據(jù)。同樣地,包含檢查是不充分的。而是,這種查詢的結(jié)果存儲(chǔ)于分離的結(jié)果表中,由查詢的SQL串索引。對(duì)于這種查詢的包含檢查是基于SQL串的精確匹配的。這一查找過程是非??焖俚?,因?yàn)樗腔诰哂凶鳛殒I的SQL串的哈希表之上的。如果該原樣SQL串提交給高速緩存,則對(duì)相應(yīng)的結(jié)果表執(zhí)行本地查詢,以檢索整個(gè)表(即本地執(zhí)行“SELECT*FROM LOCTAB”)。應(yīng)該注意,這種查詢是成本不高的,在邊緣服務(wù)器上具有最少的處理時(shí)間。
轉(zhuǎn)到圖5,參考標(biāo)號(hào)500表示本地資源庫。本地資源庫500示出查詢結(jié)果怎樣存儲(chǔ)于本地高速緩存資源庫501中。資源庫501被分為兩部分,一個(gè)用于存儲(chǔ)復(fù)合或精確匹配查詢502,而另一個(gè)用于存儲(chǔ)可包含檢查查詢503。精確匹配查詢存儲(chǔ)于分離的表中,其僅用于響應(yīng)其描述與已高速緩存查詢的SQL串匹配的新查詢。例如,查詢Q5 504和Q6 505存儲(chǔ)于分離的表中,而不管它們的結(jié)果是否重疊。
可包含檢查查詢存儲(chǔ)于共享的表中。在同一基本表之上的查詢存儲(chǔ)于該表的同一本地副本中。例如,該圖假定兩個(gè)查詢Q7和Q8從同一表中“SELECT”。由查詢Q7 506檢索到的元組被首先插入到高速緩存中。然后,由第二個(gè)查詢Q8 507獲取的行被插入到同一表中。當(dāng)Q8的結(jié)果被插入時(shí),已有行以新獲取的值進(jìn)行更新。因此,兩個(gè)不同查詢獲取的相同行在該高速緩存中不重復(fù)。因?yàn)樵趯⑺胁樵儼l(fā)送到后端服務(wù)器之前,要重寫它們以獲取主鍵,所以會(huì)發(fā)現(xiàn)相同的行。
現(xiàn)在轉(zhuǎn)到圖6,參考標(biāo)號(hào)600表示高速緩存表結(jié)構(gòu)。高速緩存表結(jié)構(gòu)600示出在同一數(shù)據(jù)表(這里稱作“employee”)之上的兩個(gè)查詢的特定示例,并示出它們的結(jié)果數(shù)據(jù)結(jié)構(gòu)601、602怎樣存儲(chǔ)于邊緣數(shù)據(jù)庫高速緩存中的同一本地表603中。
如圖7中所示,參考標(biāo)號(hào)700表示一致性協(xié)議。一致性協(xié)議700包括邊緣服務(wù)器部分701,其與后端服務(wù)器部分702信號(hào)通信。邊緣服務(wù)器部分701包括DBProxy單元,其與高速緩存資源庫704信號(hào)通信,以插入查詢結(jié)果并執(zhí)行查詢。改變APPLY單元705與高速緩存資源庫704信號(hào)通信,用于刷新表。
后端服務(wù)器部分702包括DBMS單元706,其與DB代理單元703信號(hào)通信,用于接收查詢并提供結(jié)果。DBMS單元706還與另一高速緩存資源庫707信號(hào)通信,用于對(duì)高速緩存資源庫707進(jìn)行寫和讀。高速緩存資源庫707與變化捕獲單元708信號(hào)通信,用于讀取近來寫入的數(shù)據(jù)。變化捕獲單元708又以信號(hào)通信與變化施加單元705連接,用于刷新消息。
這樣,通過訂閱由源服務(wù)器傳播的更新流,確保了數(shù)據(jù)一致性。傳統(tǒng)物化視圖方案通過對(duì)基本數(shù)據(jù)中的變化(“增量”)重新執(zhí)行視圖定義,來更新已高速緩存的視圖。但是,因?yàn)檫吘墧?shù)據(jù)高速緩存高速緩存的潛在的大量查詢(“視圖”),所以其需要更有效的機(jī)制。由于對(duì)已高速緩存的數(shù)據(jù)作為后端表部分填充的副本進(jìn)行維護(hù),所以在源處對(duì)基本表所提交的改變可以簡(jiǎn)單“照原樣”傳播到已高速緩存的版本,而無需重新執(zhí)行這些查詢。將對(duì)基本表的更新、刪除和插入(“UDI”)傳播并施加到邊緣高速緩存的部分填充的副本中。以后將在該高速緩存上執(zhí)行的查詢將從這些新傳播的變化中檢索出任何匹配的元組。這一方案假設(shè)大多數(shù)web環(huán)境特有的緩慢改變數(shù)據(jù)的特點(diǎn),并丟棄潛在的不必要的數(shù)據(jù)傳播,以降低判斷已高速緩存的視圖應(yīng)怎樣更新的處理開銷。但是,當(dāng)一個(gè)表正在經(jīng)受繁重的更新工作負(fù)荷時(shí),高速緩存資源管理器可以在指定時(shí)期內(nèi)禁用本地副本。
每當(dāng)可能時(shí),由邊緣應(yīng)用發(fā)出的只讀查詢可從高速緩存中得到滿足。更新事務(wù)通常被發(fā)送給后端數(shù)據(jù)庫執(zhí)行,而不是首先將它們施加本地高速緩存。因?yàn)檫吘墧?shù)據(jù)高速緩存是為大規(guī)模使用而設(shè)計(jì)的,所以一致性協(xié)議必須盡可能的松散地與源連接。因此,確保高速緩存一致性的責(zé)任盡可能多地落在了邊緣高速緩存上,在該邊緣高速緩存上資源更加自然地分布。后端服務(wù)器應(yīng)該僅負(fù)責(zé)周期性的更新傳播,它是一個(gè)可以卸載到分離過程或機(jī)器上的任務(wù)。盡管提供較強(qiáng)一致性保證可能引起會(huì)限制高速緩存有效性的高成本,現(xiàn)在描述一些諸如立即更新可見性和增量一致性的重要一致性保證怎樣可以得到確保的問題。本公開依賴于數(shù)據(jù)傳播器,其捕獲所有對(duì)源處的表的UDI,并將它們打包在“刷新消息”中轉(zhuǎn)發(fā)給邊緣高速緩存。將數(shù)據(jù)變化傳播給它們的事務(wù)標(biāo)識(shí)符所標(biāo)記的邊緣處,并以事務(wù)提交順序?qū)⑺鼈兪┘拥竭吘壐咚倬彺?。將進(jìn)入的反映在源站點(diǎn)處提交的事務(wù)結(jié)果的UDI流施加到本地已高速緩存的表中。
由于UDI以時(shí)戳順序傳播并施加到高速緩存中。在該部分中所使用的所有時(shí)戳指后端服務(wù)器側(cè)提交時(shí)戳,所以高速緩存中各元組的值必須反映對(duì)應(yīng)于來自源的上一個(gè)傳播消息的時(shí)戳的數(shù)據(jù)庫狀態(tài)。更準(zhǔn)確地,傳播消息的時(shí)戳是包括在該消息中的任何更新事務(wù)中最大的時(shí)戳。因?yàn)楸镜乇砜梢酝ㄟ^傳播消息以及通過在未命中時(shí)的查詢結(jié)果插入進(jìn)行更新,所以在確保增量一致性時(shí)出現(xiàn)了挑戰(zhàn)。
所保證的一致性屬性。高速緩存為應(yīng)用保證幾個(gè)重要的一致性屬性,即增量一致性、單調(diào)轉(zhuǎn)換、和立即更新可見性。高速緩存對(duì)于應(yīng)用來說呈現(xiàn)為真實(shí)后端數(shù)據(jù)庫。但是,其內(nèi)容通常不是與那些存儲(chǔ)在后端數(shù)據(jù)庫中的內(nèi)容同步的。因?yàn)楦咚倬彺嫦驊?yīng)用反映一個(gè)可能不同于當(dāng)前狀態(tài)的狀態(tài),所以其“輸出”一個(gè)數(shù)據(jù)庫的給定狀態(tài)。增量一致性的屬性要求高速緩存當(dāng)前輸出的數(shù)據(jù)庫狀態(tài)始終對(duì)應(yīng)于數(shù)據(jù)庫在以前時(shí)間點(diǎn)時(shí)的過去狀態(tài)。輸出狀態(tài)與實(shí)際狀態(tài)之間的延遲也是受限的。單調(diào)狀態(tài)轉(zhuǎn)換的屬性意味著高速緩存所輸出的數(shù)據(jù)庫狀態(tài)在時(shí)間上僅向前移動(dòng)。立即更新可見性的屬性要求如果應(yīng)用提交一個(gè)更新,并隨后發(fā)出一個(gè)查詢,則該查詢應(yīng)該觀察更新(和所有先前更新)的結(jié)果。
保證增量一致性和單調(diào)轉(zhuǎn)換。假設(shè)高速緩存最初與一分鐘前的數(shù)據(jù)庫狀態(tài)一致。如果一個(gè)在該高速緩存中未命中且在源處執(zhí)行的最新查詢的結(jié)果被插入,則該高速緩存將包括舊數(shù)據(jù)與新數(shù)據(jù)的混合。增量一致性要求已高速緩存的數(shù)據(jù)總是與數(shù)據(jù)庫的單個(gè)過去版本一致。假定一個(gè)查詢?cè)谠刺幵拥貓?zhí)行。當(dāng)一個(gè)查詢未命中且遠(yuǎn)程執(zhí)行時(shí),服務(wù)器返回其在該查詢執(zhí)行時(shí)的最后提交時(shí)戳及結(jié)果。
轉(zhuǎn)到圖8,參考標(biāo)號(hào)800表示查詢處理算法。查詢處理算法800考慮一致性,并包括用于根據(jù)查詢的包含檢查記錄高速緩存命中的功能塊801。功能塊801將控制傳遞給判斷塊802,以進(jìn)行判斷是否出現(xiàn)了高速緩存命中。如果確實(shí)出現(xiàn)了命中,則將控制傳遞給功能塊803,以執(zhí)行共享高速緩存的鎖定、查詢的本地執(zhí)行、及共享高速緩存的解鎖。但是,如果在塊802未出現(xiàn)命中,則將控制傳遞給功能塊804,以遠(yuǎn)程執(zhí)行該查詢、并將控制傳遞給判斷塊805。塊805判斷該遠(yuǎn)程執(zhí)行的查詢是否成功。如果成功,則將控制傳遞給返回塊806,以返回已高速緩存的結(jié)果“rc”。如果未成功,則將控制傳遞給判斷塊807,以判斷該結(jié)果是否僅是部分的。如果是,則將控制傳遞給功能塊808,以獨(dú)占地鎖定該高速緩存、將結(jié)果插入到結(jié)果集合中、傳播來自服務(wù)器的其他信息、并解鎖該高速緩存。功能塊808將控制傳遞給返回塊809,以返回結(jié)果集合“rs”。如果塊807的結(jié)果是假或否,則將控制直接傳遞給返回塊809。
在操作上,在塊807,通過將該查詢的時(shí)戳與從源服務(wù)器接收到的上一個(gè)傳播消息的時(shí)戳cache_ts進(jìn)行比較,來開始結(jié)果插入。應(yīng)該指出,在附圖中,查詢和高速緩存時(shí)戳分別由它們的長(zhǎng)名query_ts(“tq”)和cache_ts(“tc”)來指示,而在別處,由它們的長(zhǎng)或短名來指示。如果query_ts大于cache_ts,則該查詢觀察到了比高速緩存的狀態(tài)更近的狀態(tài)。在這一使用情況下,在塊808,首先插入未命中的結(jié)果,并從源服務(wù)器中抽出任何未決的傳播消息,以將整個(gè)高速緩存快進(jìn)到更后的時(shí)間。最后,將該查詢添加到索引中。但是,如果cache_ts大于query_ts,立即插入未命中的結(jié)果可能將已高速緩存的數(shù)據(jù)恢復(fù)到過去的值,撤銷傳播消息所施加的改變且不能滿足單調(diào)性需求。由于這是一個(gè)罕見的競(jìng)態(tài)條件,所以在這種情況下結(jié)果的插入可能被跳過。這通常僅將對(duì)該查詢的高速緩存延遲到一個(gè)后續(xù)未命中查詢?cè)诓迦虢Y(jié)果時(shí)成功時(shí),并且不會(huì)嚴(yán)重危及高速緩存有效性。應(yīng)該指出,在塊808中,作為propagate_from_server()的副作用,cache_ts可能會(huì)增加。
現(xiàn)在轉(zhuǎn)到圖9,參考標(biāo)號(hào)900表示用于將結(jié)果插入到高速緩存中的算法。循環(huán)塊901執(zhí)行對(duì)于查詢結(jié)果中的每個(gè)元組的循環(huán)。塊901的循環(huán)包括判斷塊902,其用于判斷該元組是否在該高速緩存中。如果該元組在該高速緩存中,則將控制傳遞給功能塊903,以更新該元組。如果該元組不在該高速緩存中,則將控制傳遞給功能塊904,以插入該元組。這樣,在操作中,對(duì)高速緩存的結(jié)果集合插入如下進(jìn)行當(dāng)在高速緩存中插入一個(gè)結(jié)果集合時(shí),在塊903,以新值復(fù)寫已有的行,而在塊904,將非已有行插入到表中。
如圖10所示,參考標(biāo)號(hào)1000表示用于執(zhí)行更新事務(wù)的算法。功能塊1001執(zhí)行對(duì)于結(jié)果“rc”的遠(yuǎn)程查詢,并將控制傳遞給判斷塊1002。如果該查詢成功,則塊1002將控制傳遞給返回塊1003,以返回結(jié)果“rc”。如果該查詢未成功,則塊1002將控制傳遞給功能塊1004,以從服務(wù)器傳播該數(shù)據(jù)。塊1004將控制傳遞給返回塊1005,以返回結(jié)果“rc”。
立即更新可見性是這樣保證的。將邊緣應(yīng)用提交給高速緩存的更新事務(wù)傳送到源數(shù)據(jù)庫(塊1001)。此外,在更新事務(wù)完成之后,可在將更新結(jié)果返回給應(yīng)用(1004)之前,通過從源數(shù)據(jù)庫中抽出它們而快速獲取更新的結(jié)果。
高速緩存空間開銷可通過高速緩存置換來調(diào)整。為了限制空間開銷并優(yōu)化通常是有限的邊緣資源的使用,邊緣數(shù)據(jù)高速緩存依賴于后臺(tái)垃圾收集進(jìn)程,其從高速緩存安全驅(qū)除不用的數(shù)據(jù),同時(shí)保持?jǐn)?shù)據(jù)一致性。具體地,高速緩存置換的目的在于最大化有限數(shù)量可用空間的高速緩存的益處。與傳統(tǒng)文件和存儲(chǔ)頁的置換形成對(duì)比,可在多個(gè)查詢之間共享基本行。
高速緩存置換在本地?cái)?shù)據(jù)庫的使用達(dá)到高水印(“HWM”)值時(shí)觸發(fā)。然后,置換開始,直到空間足夠空閑并達(dá)到低水印(“LWM”)值之下時(shí)為止。在沒有空間在本地表中插入更多行或創(chuàng)建新表時(shí),不會(huì)按照對(duì)于一個(gè)查詢未命中的需要觸發(fā)置換。置換是后臺(tái)進(jìn)程,其可期望與查詢服務(wù)和更新操作并發(fā)進(jìn)行。
轉(zhuǎn)到圖11,參考標(biāo)號(hào)1100表示高速緩存清除算法。算法1100包括功能塊1101,其用于擴(kuò)充表,以添加新列“accessedFlag”。塊1101將控制傳遞給功能塊1102,用于為本地表中的所有行將“accessedFlag”重置為假。塊1102將控制傳遞給功能塊1103,用于確定將保留在高速緩存中的查詢的集合“S”。功能塊1103將控制傳遞給功能塊1104,用于重新執(zhí)行集合“S”中的所有查詢,并將任何所選擇行的“accessedFlag”設(shè)置為真。然后,塊1104將控制傳遞給功能塊1105,用于刪除其“accessedFlag”為假的所有行。
用于高速緩存清除的算法1100稱作組置換。此算法是實(shí)現(xiàn)簡(jiǎn)單的,不會(huì)增加命中、未命中、或更新傳播的開銷。在塊1103,根據(jù)置換策略,標(biāo)記一組“犧牲”查詢,以便從高速緩存中刪除。為了確保屬于“犧牲”查詢的非重疊行被正確標(biāo)記,執(zhí)行下面的步驟。首先,在塊1102,將實(shí)現(xiàn)為在本地表創(chuàng)建期間定義的控制列的已訪問標(biāo)志與所有已高速緩存行關(guān)聯(lián),并被設(shè)為假。然后,在塊1104,在后臺(tái)執(zhí)行非犧牲查詢。這一后臺(tái)執(zhí)行可發(fā)生于擴(kuò)充時(shí)期,以不會(huì)影響前臺(tái)查詢的性能。每當(dāng)查詢執(zhí)行時(shí),為任何所選擇的行將控制列中相應(yīng)的項(xiàng)設(shè)為真。在塊1105,在這一執(zhí)行周期結(jié)束時(shí),任何其控制列(已訪問標(biāo)志)仍然為假的行可被安全刪除。為了在垃圾收集周期已啟動(dòng)執(zhí)行之后防止由高速緩存來命中或由一致性管理器插入或更新的行的刪除,設(shè)置任何已更新或插入到本地表中的行的控制列。
在一種情況下,本公開的實(shí)施例獲得了兩個(gè)有利方面查詢相應(yīng)高速緩存的益處,具體地,簡(jiǎn)易管理和適于在工作負(fù)載或在資源可用性方面的變化的能力;以及基本表復(fù)制的益處,具體地,非冗余數(shù)據(jù)存儲(chǔ)的空間效率,及支持有效的基于更新的一致性協(xié)議的能力。
因此,本公開的一方面在于本地機(jī)用于通過在先前查詢的動(dòng)態(tài)高速緩存結(jié)果中應(yīng)用高速緩存策略,來滿足對(duì)于至少一個(gè)遠(yuǎn)程服務(wù)器的數(shù)據(jù)庫查詢。本公開的實(shí)施例的另一方面在于本地?cái)?shù)據(jù)庫與本地機(jī)相關(guān)聯(lián),并用于在共享表中存儲(chǔ)多個(gè)查詢結(jié)果。本公開的實(shí)施例的又一方面在于通過應(yīng)用作用于查詢謂詞的包含檢查器,將本地存儲(chǔ)的查詢結(jié)果用于滿足新查詢。包含檢查器確保查詢謂詞所定義的新查詢請(qǐng)求的數(shù)據(jù)邏輯上包括在已高速緩存于多個(gè)已高速緩存查詢結(jié)果中的數(shù)據(jù)集合中,其是由先前查詢的謂詞并集所描述的。
本公開的實(shí)施例的另一方面在于可能時(shí)將存儲(chǔ)在邊緣高速緩存中的數(shù)據(jù)組織為在源數(shù)據(jù)庫中定義的表的“部分副本”。從源服務(wù)器接收到的查詢結(jié)果被插入到本地?cái)?shù)據(jù)庫中。將構(gòu)成同一基本表的查詢結(jié)果插入到同一本地高速緩存版本的基本表中。本公開的實(shí)施例的又一方面在于諸如包含子查詢、合計(jì)或用戶定義的函數(shù)的復(fù)合查詢的結(jié)果本地存儲(chǔ)為多個(gè)表,一個(gè)結(jié)果一個(gè)表,其中復(fù)合查詢的結(jié)果不是簡(jiǎn)單的基本表的行和列的子集。
本公開的實(shí)施例的又一方面在于它是透明的,不需要對(duì)應(yīng)用進(jìn)行改變。此外,由于高速緩存邏輯存在于數(shù)據(jù)庫之外,所以它與任何后端或本地?cái)?shù)據(jù)庫是兼容的,且不需要對(duì)數(shù)據(jù)庫服務(wù)器進(jìn)行改變。本公開的實(shí)施例的另一方面在于通過將對(duì)源處的基本表所發(fā)生的改變傳播到邊緣高速緩存,并通過在處理進(jìn)入的查詢時(shí)應(yīng)用明了一致性的算法,來維護(hù)本地高速緩存的數(shù)據(jù)的一致性。本公開的實(shí)施例的又一方面在于高速緩存可通過從本地?cái)?shù)據(jù)庫中犧牲無用查詢結(jié)果,而不危及一致性或正確性,調(diào)整本地使用的空間數(shù)量。
根據(jù)這里的教授,本領(lǐng)域的普通技術(shù)人員可以容易地探知本公開的這些和其他特征和優(yōu)點(diǎn)。應(yīng)該理解,本公開的教授可以各種硬件、軟件、固件、專用處理器或它們的組合的形式來實(shí)現(xiàn)。
本公開的教授可以實(shí)現(xiàn)為例如硬件和軟件的組合。此外,優(yōu)選地,軟件以有形實(shí)現(xiàn)于程序存儲(chǔ)單元上的固件來實(shí)現(xiàn)。該軟件可以上載到包括任何適當(dāng)體系結(jié)構(gòu)的機(jī)器上并由其執(zhí)行。優(yōu)選地,該機(jī)器實(shí)現(xiàn)于具有諸如一個(gè)或多個(gè)中央處理單元(“CPU”)的、隨機(jī)存儲(chǔ)器(“RAM”)、及輸入/輸出(“I/O”)接口的計(jì)算機(jī)平臺(tái)上。該計(jì)算機(jī)還可包括操作系統(tǒng)和微指令代碼。這里所描述的各過程和功能可以是可由硬件執(zhí)行的微指令代碼的一部分、或軟件的一部分、或任何它們的組合。此外,各種諸如附加數(shù)據(jù)存儲(chǔ)部件的其他外圍部件可以與該計(jì)算機(jī)平臺(tái)相連。
應(yīng)該進(jìn)一步理解,因?yàn)楦綀D中所示的某些組成系統(tǒng)部件和方法優(yōu)選以軟件來實(shí)現(xiàn),所以這些系統(tǒng)部件或處理功能塊之間的實(shí)際連接可依本公開被編程的方式而不同。給定這里的教授,本領(lǐng)域的普通技術(shù)人員將能夠設(shè)想本公開的這些和類似的實(shí)現(xiàn)或設(shè)計(jì)。
盡管這里參照附圖對(duì)示例性實(shí)施例進(jìn)行了描述,但應(yīng)該理解,本公開并不限于這些確切的實(shí)施例,本領(lǐng)域的普通技術(shù)人員可以在其中實(shí)現(xiàn)各種變換和修改,而不脫離本公開的范圍和實(shí)質(zhì)。所有這樣的變換和修改都旨在包括在如所附權(quán)利要求中陳述的本公開的范圍內(nèi)。
權(quán)利要求
1.一種邊緣數(shù)據(jù)高速緩存(202),包括查詢?cè)u(píng)估器(204);高速緩存索引(206),其與查詢?cè)u(píng)估器信號(hào)通信;高速緩存資源庫(208),其與查詢?cè)u(píng)估器信號(hào)通信;資源管理器(209),其與查詢?cè)u(píng)估器信號(hào)通信;包含檢查器(207),其與查詢?cè)u(píng)估器信號(hào)通信;查詢解析器(205),其與查詢?cè)u(píng)估器信號(hào)通信;一致性管理器(210),其與查詢?cè)u(píng)估器信號(hào)通信。
2.一種包括如權(quán)利要求1中定義的數(shù)據(jù)高速緩存的邊緣服務(wù)器(200),還包括小服務(wù)程序(210),其與該邊緣數(shù)據(jù)高速緩存信號(hào)通信。
3.一種包括如權(quán)利要求2中定義的邊緣服務(wù)器(109、110)的用于根據(jù)本地應(yīng)用執(zhí)行的查詢動(dòng)態(tài)高速緩存數(shù)據(jù)的系統(tǒng)(100),該系統(tǒng)還包括遠(yuǎn)程服務(wù)器(108),其具有完整的數(shù)據(jù)庫(101);邊緣服務(wù)器上的本地?cái)?shù)據(jù)庫(104),其包括完整數(shù)據(jù)庫的子集,該邊緣服務(wù)器與遠(yuǎn)程服務(wù)器信號(hào)通信;邊緣服務(wù)器上的本地?cái)?shù)據(jù)庫內(nèi)的多個(gè)共享表(503、603),用于高速緩存來自完整數(shù)據(jù)庫的結(jié)果、接收本地生成的數(shù)據(jù)、并在確保本地?cái)?shù)據(jù)庫與遠(yuǎn)程數(shù)據(jù)庫之間的數(shù)據(jù)一致性的同時(shí)根據(jù)可用存儲(chǔ)需求調(diào)整高速緩存的內(nèi)容(208)。
4.一種包括用于根據(jù)本地應(yīng)用執(zhí)行的查詢動(dòng)態(tài)高速緩存數(shù)據(jù)的邊緣服務(wù)器(109)的系統(tǒng)(100),該系統(tǒng)還包括用于動(dòng)態(tài)高速緩存遠(yuǎn)程服務(wù)器的先前數(shù)據(jù)庫查詢的結(jié)果的裝置;用于將本地?cái)?shù)據(jù)庫與本地服務(wù)器相關(guān)聯(lián)的裝置;用于將多個(gè)高速緩存結(jié)果存儲(chǔ)在本地?cái)?shù)據(jù)庫的共享表中的裝置;以及用于將上述多個(gè)高速緩存結(jié)果用于滿足對(duì)本地服務(wù)器的新數(shù)據(jù)庫查詢的裝置。
5.一種機(jī)器可讀的程序存儲(chǔ)裝置,其有形地實(shí)現(xiàn)可由該機(jī)器執(zhí)行以實(shí)現(xiàn)用于根據(jù)本地應(yīng)用執(zhí)行的查詢動(dòng)態(tài)高速緩存數(shù)據(jù)的方法步驟(400)的指令程序,該方法步驟包括動(dòng)態(tài)高速緩存(414)該遠(yuǎn)程服務(wù)器的先前數(shù)據(jù)庫查詢的結(jié)果;將本地?cái)?shù)據(jù)庫與本地服務(wù)器相關(guān)聯(lián)(420);將多個(gè)高速緩存結(jié)果存儲(chǔ)(422)在本地?cái)?shù)據(jù)庫的共享表中;以及將上述多個(gè)高速緩存結(jié)果用于滿足(412)對(duì)于本地服務(wù)器的新數(shù)據(jù)庫查詢中。
6.一種讓本地服務(wù)器滿足針對(duì)至少一個(gè)遠(yuǎn)程服務(wù)器的數(shù)據(jù)庫查詢的方法(400),該方法包括動(dòng)態(tài)高速緩存(414)該遠(yuǎn)程服務(wù)器的先前數(shù)據(jù)庫查詢的結(jié)果;將本地?cái)?shù)據(jù)庫與本地服務(wù)器相關(guān)聯(lián)(420);將多個(gè)高速緩存結(jié)果存儲(chǔ)(422)在本地?cái)?shù)據(jù)庫的共享表中;以及將上述多個(gè)高速緩存結(jié)果用于滿足(412)對(duì)于本地服務(wù)器的新數(shù)據(jù)庫查詢中。
7.權(quán)利要求6的方法,還包括由上述多個(gè)高速緩存結(jié)果和任何其他插入到本地?cái)?shù)據(jù)庫中的數(shù)據(jù)構(gòu)成存儲(chǔ)數(shù)據(jù)(705);以及確保高速緩存數(shù)據(jù)的一致性(708)。
8.權(quán)利要求6的方法,還包括根據(jù)至少一個(gè)調(diào)整標(biāo)準(zhǔn)調(diào)整(1103、1105)上述共享表的內(nèi)容。
9.權(quán)利要求8的方法,其中上述至少一個(gè)調(diào)整標(biāo)準(zhǔn)包括選自以下的標(biāo)準(zhǔn)本地服務(wù)器中的可用空間;查詢的存儲(chǔ)需求;查詢的執(zhí)行成本;本地與遠(yuǎn)程服務(wù)器之間的網(wǎng)絡(luò)性能;本地與遠(yuǎn)程服務(wù)器上的負(fù)荷;已高速緩存查詢的訪問率;及這些的任何組合。
10.權(quán)利要求6的方法,其中使用的步驟包括加速對(duì)上述至少一個(gè)遠(yuǎn)程服務(wù)器的查詢。
11.權(quán)利要求6的方法,其中存儲(chǔ)的步驟包括將在單個(gè)數(shù)據(jù)庫表之上的簡(jiǎn)單(304)和Top-N(305)查詢的結(jié)果插入到共享基本表中;將關(guān)聯(lián)查詢的結(jié)果保存在共享關(guān)聯(lián)表中;構(gòu)成包括所有共享基本表和共享關(guān)聯(lián)表的共享表資源庫;將復(fù)合查詢的結(jié)果存儲(chǔ)在分離表中,每個(gè)查詢結(jié)果一個(gè)表;以及根據(jù)上述多個(gè)分離表構(gòu)成精確匹配資源庫。
12.權(quán)利要求11的方法,其中插入的步驟包括只要在首先接收到對(duì)于基本表的簡(jiǎn)單查詢時(shí),就在高速緩存中創(chuàng)建單個(gè)本地表,以對(duì)應(yīng)于源服務(wù)器中的基本表;將上述簡(jiǎn)單查詢的結(jié)果插入到上述本地表中;以及將所有后續(xù)簡(jiǎn)單查詢的結(jié)果插入到該本地表的基本表中。
13.權(quán)利要求11的方法,其中保存的步驟包括在高速緩存中創(chuàng)建本地關(guān)聯(lián)表,以對(duì)應(yīng)于關(guān)聯(lián)查詢中的每個(gè)關(guān)聯(lián)條件和表列表;以及將所有后續(xù)在同一表列表之上并且具有相同關(guān)聯(lián)條件的關(guān)聯(lián)查詢的結(jié)果插入到本地關(guān)聯(lián)表中。
14.權(quán)利要求6的方法,其中使用的步驟包括下面中的至少一個(gè)如果新查詢?yōu)閺?fù)合查詢,則在精確匹配資源庫中搜索對(duì)于新查詢的響應(yīng);以及如果新查詢不是復(fù)合查詢,則從共享表資源庫的數(shù)據(jù)中子選擇對(duì)于新查詢的響應(yīng)。
15.權(quán)利要求14的方法,其中搜索的步驟包括如果在精確匹配資源庫中發(fā)現(xiàn)上述新查詢的SQL串,則將高速緩存中對(duì)應(yīng)于該SQL串的查詢結(jié)果返回給應(yīng)用;如果在精確匹配資源庫中未發(fā)現(xiàn)上述新查詢的SQL串,則將新查詢發(fā)送給源服務(wù)器;如果在精確匹配資源庫中未發(fā)現(xiàn)上述新查詢的SQL串,則將所接收到的查詢結(jié)果插入到精確匹配資源庫中;以及如果在精確匹配資源庫中未發(fā)現(xiàn)上述新查詢的SQL串,則將高速緩存中的查詢結(jié)果與該新查詢的SQL串相關(guān)聯(lián)。
16.權(quán)利要求14的方法,其中子選擇的步驟包括利用包含檢查器試圖證實(shí)上述新查詢的結(jié)果集合的結(jié)果包含在已高速緩存查詢結(jié)果的并集中;如果上述試圖證實(shí)的步驟成功完成,則以本地表名替代該新查詢中提及的表;如果上述試圖證實(shí)的步驟成功完成,則在共享表資源庫之上評(píng)估該新查詢;以及如果該查詢是Top-N查詢,則計(jì)數(shù)從本地高速緩存中接收到的行數(shù),如果該行數(shù)未超過應(yīng)用所請(qǐng)求的行數(shù),則通過重寫該新查詢并生成重寫的查詢、將重寫的查詢發(fā)送給源服務(wù)器并將從源服務(wù)器接收到的結(jié)果存儲(chǔ)在共享表資源庫中、將重寫查詢的謂詞添加到共享表資源庫的索引中、在該共享表資源庫之上評(píng)估該新查詢、及將評(píng)估步驟的結(jié)果返回給應(yīng)用來進(jìn)行處理。
17.權(quán)利要求12的方法,其中試圖的步驟包括下面的至少一個(gè)發(fā)現(xiàn)滿足這樣的條件的匹配已高速緩存查詢,其中的條件為新查詢的選擇列表中的列的列表包括在匹配查詢的選擇列表中的列的列表中、新查詢的謂詞邏輯上意味著匹配查詢的謂詞、及新查詢的各子句中提及的所有列包括在匹配查詢的選擇列表中;以及發(fā)現(xiàn)滿足這樣的條件的匹配已高速緩存查詢的集合,其中的條件為新查詢的選擇列表中的列的列表包括在每一個(gè)匹配查詢的選擇列表中的列的列表中、當(dāng)所有的謂詞由邏輯或運(yùn)算符連接時(shí)新查詢的謂詞邏輯上意味著所有匹配查詢謂詞的邏輯和所構(gòu)成的謂詞、及新查詢的各子句中提及的所有列包括在每一個(gè)匹配查詢的選擇列表中。
18.權(quán)利要求16的方法,其中重寫的步驟包括步驟將已訪問表的主鍵添加到上述查詢的選擇列表中;如果資源管理器估計(jì)所得到的結(jié)果集合不太長(zhǎng)或不值得高速緩存,則從上述選擇列表中去掉合計(jì)運(yùn)算符;以及擴(kuò)充該查詢所請(qǐng)求的行數(shù)(N),以檢索更多行。
19.權(quán)利要求7的方法,其中確保的步驟包括保證應(yīng)用所指定的一組一致性需求中的至少一個(gè),該組一致性需求包括增量一致性、立即更新可見性、及單調(diào)狀態(tài)轉(zhuǎn)換。
20.權(quán)利要求6的方法,進(jìn)一步包括確保先前查詢的結(jié)果的增量一致性,其包括步驟向數(shù)據(jù)高速緩存訂閱由源服務(wù)器傳播并且包括對(duì)后端表施加的更新、刪除和插入的刷新消息;只要當(dāng)接收到刷新消息時(shí),就將該更新、刪除和插入施加到共享表資源庫中的本地高速緩存的表;使在改變過的刷新消息中提及的任何精確匹配資源庫中的任何共享關(guān)聯(lián)表無效;將等于其結(jié)果包括在刷新消息中的任何事務(wù)的最大時(shí)戳的刷新消息時(shí)戳與該刷新消息相關(guān)聯(lián);將等于最后施加到高速緩存的刷新消息的時(shí)戳的已高速緩存設(shè)置時(shí)戳與先前查詢的結(jié)果相關(guān)聯(lián);將新查詢時(shí)戳與新查詢相關(guān)聯(lián);將新查詢時(shí)戳與高速緩存的設(shè)置時(shí)戳相比較;以及如果新查詢時(shí)戳超過了已高速緩存的設(shè)置時(shí)戳,則插入對(duì)該新查詢的響應(yīng);以及如果該新查詢時(shí)戳超過了已高速緩存的設(shè)置時(shí)戳,則從數(shù)據(jù)庫服務(wù)器中檢索未決的刷新消息。
21.權(quán)利要求6的方法,進(jìn)一步包括確保立即更新可見性,其包括步驟將邊緣數(shù)據(jù)高速緩存接收的更新事務(wù)路由到源服務(wù)器;在從源服務(wù)器接收到更新完成通知之后,在以完成狀態(tài)響應(yīng)應(yīng)用之前,從源服務(wù)器抽出刷新消息;以及在上述路由和抽出步驟在處理中時(shí),確保該應(yīng)用未對(duì)已高速緩存的數(shù)據(jù)進(jìn)行訪問。
22.權(quán)利要求8的方法,其中調(diào)整的步驟包括根據(jù)存儲(chǔ)空間管理策略發(fā)起共享表清除。
23.權(quán)利要求15的方法,其中上述共享表清除包括根據(jù)共享表在每一表中構(gòu)成控制列;將控制列中的各項(xiàng)設(shè)為假;識(shí)別要在共享表中進(jìn)行維護(hù)的良好查詢;標(biāo)記上述控制列中所有對(duì)應(yīng)于屬于對(duì)上述良好查詢的響應(yīng)的行的項(xiàng);以及刪除共享表中其控制列項(xiàng)仍然為假的任何行。
24.一種用于確保從數(shù)據(jù)庫服務(wù)器檢索到的一組查詢結(jié)果的增量一致性的方法(800),該方法包括步驟向數(shù)據(jù)高速緩存訂閱由源服務(wù)器傳播并且包括施加到后端表(707)的更新、刪除和插入的刷新消息(708、705);只要當(dāng)接收到刷新消息時(shí),就將該更新、刪除和插入施加到本地高速緩存的表(704);將等于其結(jié)果包括在刷新消息中的任何事務(wù)的最大時(shí)戳的時(shí)戳與該刷新消息相關(guān)聯(lián);將等于最后施加到高速緩存的刷新消息的時(shí)戳的設(shè)置時(shí)戳與先前查詢的結(jié)果相關(guān)聯(lián);將新查詢時(shí)戳與新查詢相關(guān)聯(lián);將該新查詢時(shí)戳與上述設(shè)置時(shí)戳進(jìn)行比較;以及如果該新查詢時(shí)戳超過了該設(shè)置時(shí)戳,則插入對(duì)該新查詢的響應(yīng);以及如果該新查詢時(shí)戳超過了該設(shè)置時(shí)戳,則從數(shù)據(jù)庫服務(wù)器中檢索未決的刷新消息。
25.權(quán)利要求4的包括用于確保從數(shù)據(jù)庫服務(wù)器檢索到的一組查詢結(jié)果的增量一致性的邊緣服務(wù)器的系統(tǒng),該系統(tǒng)還包括用于向數(shù)據(jù)高速緩存訂閱由源服務(wù)器傳播并且包括施加到后端表的更新、刪除和插入的刷新消息的裝置;用于只要當(dāng)接收到刷新消息時(shí),就將該更新、刪除和插入施加到本地高速緩存的表的裝置;用于將等于其結(jié)果包括在刷新消息中的任何事務(wù)的最大時(shí)戳的時(shí)戳與該刷新消息相關(guān)聯(lián)的裝置;用于將等于最后施加到高速緩存的刷新消息的時(shí)戳的設(shè)置時(shí)戳與先前查詢的結(jié)果相關(guān)聯(lián)的裝置;用于將新查詢時(shí)戳與新查詢相關(guān)聯(lián)的裝置;用于將該新查詢時(shí)戳與上述設(shè)置時(shí)戳進(jìn)行比較的裝置;以及用于如果該新查詢時(shí)戳超過了該設(shè)置時(shí)戳,則插入對(duì)該新查詢的響應(yīng)的裝置;以及用于如果該新查詢時(shí)戳超過了該設(shè)置時(shí)戳,則從數(shù)據(jù)庫服務(wù)器中檢索未決的刷新消息的裝置。
26.權(quán)利要求5的用于確保從數(shù)據(jù)庫服務(wù)器檢索到的一組查詢結(jié)果的增量一致性的程序存儲(chǔ)裝置,該方法步驟包括向數(shù)據(jù)高速緩存訂閱由源服務(wù)器傳播并且包括施加到后端表的更新、刪除和插入的刷新消息;只要當(dāng)接收到刷新消息時(shí),就將該更新、刪除和插入施加到本地高速緩存的表;將等于其結(jié)果包括在刷新消息中的任何事務(wù)的最大時(shí)戳的時(shí)戳與刷新消息相關(guān)聯(lián);將等于最后施加到高速緩存的刷新消息的時(shí)戳的設(shè)置時(shí)戳與先前查詢的結(jié)果相關(guān)聯(lián);將新查詢時(shí)戳與新查詢相關(guān)聯(lián);將該新查詢時(shí)戳與上述設(shè)置時(shí)戳進(jìn)行比較;以及如果該新查詢時(shí)戳超過了該設(shè)置時(shí)戳,則插入對(duì)該新查詢的響應(yīng);以及如果該新查詢時(shí)戳超過了該設(shè)置時(shí)戳,則在數(shù)據(jù)庫服務(wù)器中檢索未決的刷新消息。
全文摘要
本發(fā)明提供了一種用于根據(jù)本地應(yīng)用所執(zhí)行的查詢動(dòng)態(tài)高速緩存數(shù)據(jù)的系統(tǒng)(100)、裝置(200)和方法(300),其中該系統(tǒng)包括遠(yuǎn)程服務(wù)器(108)、邊緣服務(wù)器(109)上的本地?cái)?shù)據(jù)庫(104);該裝置包括邊緣數(shù)據(jù)高速緩存(202),該邊緣數(shù)據(jù)高速緩存包括查詢?cè)u(píng)估器(204)、高速緩存索引(206)、高速緩存資源庫(208)、資源管理器(209)、包含檢查器(207)、查詢解析器(205)、及一致性管理器(210),所有這些部件與查詢?cè)u(píng)估器信號(hào)通信;該方法用于動(dòng)態(tài)高速緩存該遠(yuǎn)程服務(wù)器的先前數(shù)據(jù)庫查詢的結(jié)果(412)、將本地?cái)?shù)據(jù)庫與本地服務(wù)器相關(guān)聯(lián)、將多個(gè)高速緩存結(jié)果存儲(chǔ)在本地?cái)?shù)據(jù)庫的共享表(503)中、以及將多個(gè)高速緩存結(jié)果用于滿足對(duì)于本地服務(wù)器的新數(shù)據(jù)庫查詢(410)中。
文檔編號(hào)G06F15/16GK1708757SQ200380102370
公開日2005年12月14日 申請(qǐng)日期2003年10月14日 優(yōu)先權(quán)日2002年12月23日
發(fā)明者卡利爾·S.·阿米瑞, 斯瑞拉姆·派德馬納伯翰, 樸商賢, 萊紐·泰瓦瑞 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司