專利名稱:用于查詢數(shù)據(jù)流的系統(tǒng)和方法
用于查詢數(shù)據(jù)流的系統(tǒng)和方法
背景技術(shù):
Live-BI (商務(wù)智能)是其中動態(tài)收集的數(shù)據(jù)和靜態(tài)存儲的數(shù)據(jù)被相結(jié)合地使用的數(shù)據(jù)密集型和知識豐富型計算鏈。動態(tài)收集的數(shù)據(jù)通常包括流式數(shù)據(jù),諸如交通數(shù)據(jù),例如繼續(xù)前進(jìn)和離開高速公路的車輛的數(shù)目。靜態(tài)存儲的數(shù)據(jù)可能是歷史的。在Live-BI中,動態(tài)數(shù)據(jù)和靜態(tài)數(shù)據(jù)對于在歷史上下文內(nèi)分析動態(tài)數(shù)據(jù)是有用的。動態(tài)數(shù)據(jù)可以經(jīng)由數(shù)據(jù)流管理系統(tǒng)來提供。數(shù)據(jù)流管理系統(tǒng)通常是只讀的。進(jìn)一步地,數(shù)據(jù)流管理系統(tǒng)可以不提供事務(wù),并且僅進(jìn)行正確性的非正式保證。在沒有事務(wù)的情況下,主動地查詢流式數(shù)據(jù)是不可能的。通常,歷史數(shù)據(jù)駐留在數(shù)據(jù)倉儲環(huán)境中。在數(shù)據(jù)倉儲環(huán)境中,歷史數(shù)據(jù)在通過提取、轉(zhuǎn)換以及加載(ETL)過程被加載之后可以被查詢。當(dāng)今,用于分析數(shù)據(jù)流和數(shù)據(jù)倉庫的平臺可能是分開的。這個分開方法可以被用來避免讀取/寫入沖突。由于數(shù)據(jù)存取和數(shù)據(jù)傳送中的開銷,這個分離是可伸縮性和效率的瓶頸。
在以下具體描述中并且參考附圖描述了特定實施例,在圖中:
圖1是根據(jù)本發(fā)明的示例實施例的用于查詢數(shù)據(jù)流的系統(tǒng)的框 圖2是示出了根據(jù)本發(fā)明的示例實施例的數(shù)據(jù)流的連續(xù)查詢的數(shù)據(jù)流程 圖3是示出了根據(jù)本發(fā)明的示例實施例的數(shù)據(jù)流的連續(xù)查詢的性能的圖形;
圖4是示出了根據(jù)本發(fā)明的示例實施例的數(shù)據(jù)流的連續(xù)查詢的性能的圖形;
圖5是根據(jù)本發(fā)明的示例實施例的適于查詢數(shù)據(jù)流的系統(tǒng)的框圖;以及圖6是示出了根據(jù)本發(fā)明的示例實施例的存儲適于查詢數(shù)據(jù)流的代碼的非暫時性、機(jī)器可讀介質(zhì)的框圖。
具體實施例方式在對查詢樹的操作符(除掃描操作符之外)被逐個元組應(yīng)用于數(shù)據(jù)的意義上,查詢處理可以被認(rèn)為與流式操作類似。然而,查詢被定義在整個數(shù)據(jù)集上。相比之下,針對數(shù)據(jù)流的查詢可以被定義在未綁定數(shù)據(jù)集的單個元組或一大塊元組或滑動窗口上。由于這些差異,大多數(shù)現(xiàn)有的流處理系統(tǒng)(例如CQUTelegraphCQ以及系統(tǒng)S)從頭建立。同樣地,它們未能利用現(xiàn)有的DBMS技術(shù)來管理歷史數(shù)據(jù)、事務(wù)、恢復(fù)、工作負(fù)荷等。因此,隨著流處理系統(tǒng)進(jìn)化,越來越多的此類數(shù)據(jù)管理功能性必須被重新開發(fā)。然而,可以使用在流式數(shù)據(jù)和歷史數(shù)據(jù)兩者上支持分析的統(tǒng)一平臺。這個平臺可能是用于查詢數(shù)據(jù)流的系統(tǒng)的一部分。圖1是根據(jù)本發(fā)明的實施例的用于查詢數(shù)據(jù)流的系統(tǒng)100的框圖。系統(tǒng)100可以包括耦合到網(wǎng)絡(luò)110的源102、數(shù)據(jù)庫管理系統(tǒng)(DBMS) 104以及客戶端106。源102可以將數(shù)據(jù)流提供給DBMS 104。DBMS 104還可以編譯并且執(zhí)行從客戶端106提交的查詢。該查詢可以基于DBMS 104中的歷史數(shù)據(jù)或來自一個或多個源102的數(shù)據(jù)流來生成結(jié)果。DBMS 104可以包括基于連續(xù)查詢的、面向流處理的事務(wù)模型。在這個模型中,連續(xù)存留可以與連續(xù)查詢集成在一起。換句話說,連續(xù)查詢可以將它的結(jié)果連續(xù)地存留在單個查詢實例中。連續(xù)查詢和連續(xù)存留的集成可以提供挑戰(zhàn)。例如,數(shù)據(jù)流可能是未綁定的數(shù)據(jù)源。換句話說,數(shù)據(jù)流可以不具有正常地終止查詢的“數(shù)據(jù)結(jié)束”條件。同樣地,針對數(shù)據(jù)流的查詢可能不能夠結(jié)束。通常,查詢在事務(wù)內(nèi)運(yùn)行。一旦查詢完成,事務(wù)就提交該查詢的結(jié)果。如果查詢未完成,則事務(wù)不提交結(jié)果。同樣地,結(jié)果可能不可被客戶端106獲得。同樣,由查詢所存儲的任何數(shù)據(jù)不可以用于其他事務(wù)查看或者更新。用于處理數(shù)據(jù)元素的流的兩個典型的方法包括每元素處理和基于窗口的處理。每元素處理可以由每元組查詢處理來表征。基于窗口的處理可以通過對在按時間或其他條件劃分的窗口期間正接收到的數(shù)據(jù)塊(多個流元素)應(yīng)用相同的查詢來表征。前者是當(dāng)窗口大小限于單個元組時的后者的特殊情況。進(jìn)一步地,當(dāng)查詢僅包括簡單的選擇/投影/聯(lián)接操作符(沒有聚合操作符)時,逐個元組地對流應(yīng)用該查詢的一個實例或者對數(shù)據(jù)塊應(yīng)用該查詢的多個實例可以產(chǎn)生相同的結(jié)果序列。用于處理無限流數(shù)據(jù)的連續(xù)運(yùn)行事務(wù)可能從來不提交。因此,這樣的事務(wù)可能從來不使它的結(jié)果可被其他應(yīng)用訪問。進(jìn)一步地,重做、撤消或一般而言,長期存在的事務(wù)的ACID屬性,即使不是無止境的,對于DBMS 104來說也可能難以支持。在數(shù)據(jù)庫系統(tǒng)中,正確性標(biāo)準(zhǔn)通常按事務(wù)的ACID屬性來定義。換句話說,數(shù)據(jù)庫操作可以被分組成原子事務(wù)。DBMS可以保證應(yīng)用的事務(wù)被以相當(dāng)于某串行排序的方式來執(zhí)行。然而,在數(shù)據(jù)流管理系統(tǒng)中,代替關(guān)注于操作串行化,焦點(diǎn)是面向數(shù)據(jù)的。數(shù)據(jù)流管理系統(tǒng)可以提供關(guān)于數(shù)據(jù)進(jìn)入到數(shù)據(jù)流管理系統(tǒng)、在數(shù)據(jù)流管理系統(tǒng)內(nèi)以及從數(shù)據(jù)流管理系統(tǒng)中出來的移動的保證。在本發(fā)明的一個實施例中,數(shù)據(jù)庫中的事務(wù)邊界可以與數(shù)據(jù)流中的窗口邊界相關(guān)聯(lián)。數(shù)據(jù)流的窗口可以為DSMS中的用于數(shù)據(jù)流(data flow)的基本單位。例如,時間的窗口可以被用作隔離的單位。進(jìn)一步地,窗口可以表示用于存檔數(shù)據(jù)流的持久性、以及針對數(shù)據(jù)流的查詢的輸出流的單位。在這樣的實施例中,連續(xù)查詢可以在單個事務(wù)內(nèi)周期性地提交結(jié)果。通過周期性地提交結(jié)果,即使連續(xù)查詢事務(wù)仍然正在運(yùn)行該查詢結(jié)果也可以被其他事務(wù)獲得。在本文中被稱為周期的用于提交結(jié)果的時段可以與流處理的窗口語義一致。在本發(fā)明的一個實施例中,連續(xù)查詢的隔離級別可能被基于周期讀提交。在一些場景下,連續(xù)查詢可以將結(jié)果儲放例如插入在數(shù)據(jù)庫表中。通常,嘗試存取這些結(jié)果的其他事務(wù)可能遭遇阻止存取的沖突。然而,連續(xù)查詢在表中插入的數(shù)據(jù)可以被其他事務(wù)訪問。在本發(fā)明的一個實施例中,可以在周期期間使用僅記錄級鎖定來進(jìn)行更新。即使連續(xù)查詢?nèi)匀徽谶\(yùn)行,數(shù)據(jù)也可能是可得到的。 在連續(xù)查詢情況下,相同的查詢實例可以被逐個周期應(yīng)用于數(shù)據(jù)流??梢詫⒃谔囟ㄖ芷趦?nèi)所接收到的數(shù)據(jù)流的所有元素作為一塊數(shù)據(jù)來處理。流處理結(jié)果可以通過基于周期的事務(wù)的序列以面向塊的隔離而被存留到DBMS 104。雖然允許流處理事務(wù)周期性地逐個周期提交,但是這個方法使每周期的結(jié)果在周期結(jié)束之后可用。因為流處理是長期存在的操作并且所有結(jié)果被存留到相同的表中,所以在兩個順序周期之間可能存在接近零的間隙。雖然數(shù)據(jù)在這些間隙期間可能是可以訪問的,但是強(qiáng)迫其他事務(wù)等待這些間隙可能損傷DBMS 104的性能。同樣地,除在當(dāng)前周期期間所生成的那些之外,所有結(jié)果可以被其他事務(wù)訪問。使用常規(guī)數(shù)據(jù)庫系統(tǒng),SELECT操作的結(jié)果和UPDATE操作的結(jié)果可以具有不同的接收器,即目的地。SELECT操作的結(jié)果可以流向客戶端106,然而UPDATE的結(jié)果可以流向DBMS 104中的表。使用連續(xù)查詢,數(shù)據(jù)流可以連續(xù)不斷地流向客戶端106并且被連續(xù)不斷地存儲到DBMS 104中。進(jìn)一步地,正被事務(wù)存留的結(jié)果得到的數(shù)據(jù)可以通過連續(xù)查詢?nèi)匀豢稍L問。連續(xù)查詢可能長期運(yùn)行,但經(jīng)處理的數(shù)據(jù)可以為瞬態(tài)的。數(shù)據(jù)可以被認(rèn)為瞬態(tài)的,因為連接查詢的每個周期都可以處理數(shù)據(jù)流的不同塊。同樣地,每個面向塊的連續(xù)查詢評估可以被認(rèn)為是連續(xù)查詢的運(yùn)行周期??梢灶A(yù)先確定數(shù)據(jù)塊的邊界,諸如落入5分鐘窗口中的數(shù)據(jù)。因此,基于窗口邊界來提交連續(xù)查詢的結(jié)果通??梢耘c事務(wù)的應(yīng)用語義一致。更具體地,與基于查詢周期的事務(wù)邊界一致,可以強(qiáng)制基于塊的隔離。基于塊的隔離僅意味著每個周期僅處理來自在該周期的對應(yīng)窗口期間接收到的流的數(shù)據(jù)塊。例如,考慮到將新行插入在表中的連續(xù)查詢,由事務(wù)所插入的新行可以被存儲在相同的表中。然而,行可以被逐個周期插入,同時每個周期與特定的一組行相對應(yīng),所述行對應(yīng)于由該周期所處理的數(shù)據(jù)流的塊。在每個周期期間,所插入的數(shù)據(jù)可以經(jīng)受讀提交的隔離級,并且被行獨(dú)占式鎖定。因此,在周期期間插入的數(shù)據(jù)在該周期結(jié)束之后可以被公眾訪問。一旦被提交,周期結(jié)果可能是可訪問的,而不管什么其他基于周期的事務(wù)可能正在相同的表上運(yùn)行。在本發(fā)明的一個實施例中,DBMS 104的執(zhí)行引擎可以被擴(kuò)展,使用DBMS 104可以包括用于流處理和數(shù)據(jù)管理兩者的統(tǒng)一 Live-BI平臺。在這樣的實施例中,DBMS的全SQL表達(dá)能力可以被逐塊地應(yīng)用于數(shù)據(jù)流。同時,執(zhí)行歷史可以在長期存在的、待續(xù)的查詢執(zhí)行實例中保持連續(xù)不斷地易處理的。所提出的基于查詢周期的事務(wù)模型、面向數(shù)據(jù)塊的隔離和鎖定管理表示朝著對流處理利用數(shù)據(jù)庫事務(wù)管理的方向的初始步驟。圖2是示出了根據(jù)本發(fā)明的實施例的數(shù)據(jù)流的連續(xù)查詢的數(shù)據(jù)流程圖200。如先前所陳述的那樣,客戶端106可以向DBMS 104提交對于數(shù)據(jù)流的查詢。在本發(fā)明的一個實施例中,查詢可以規(guī)定周期和窗口參數(shù),并且標(biāo)識數(shù)據(jù)流。例如,查詢可以規(guī)定在每個60秒窗口內(nèi)接收到的數(shù)據(jù)流元素可以在連續(xù)查詢的一個周期期間被處理。查詢還可以規(guī)定連續(xù)查詢處理180個周期。在這樣的情況下,連續(xù)查詢可以處理從數(shù)據(jù)流接收到的3個小時的數(shù)據(jù),即,180個一分鐘周期。類似于在典型的查詢中引用的其他數(shù)據(jù)結(jié)構(gòu),可以使用在連續(xù)查詢中規(guī)定的流。例如,查詢可以將流聯(lián)接到數(shù)據(jù)庫表、視圖或另一流。在其中流被聯(lián)接到靜態(tài)的例如歷史的表的情況下,該流的每個塊可以與該表聯(lián)接。DBMS 104可以編譯查詢。編譯查詢可以包括解析查詢并且將其優(yōu)化成查詢計劃,例如,操作符的樹。在編譯之后,DBMS 104可以啟動針對連續(xù)查詢的事務(wù)。在本發(fā)明的一個實施例中,執(zhí)行引擎可以與用戶定義函數(shù)相互作用以啟動事務(wù)。在這樣的實施例中,查詢可以規(guī)定用戶定義函數(shù)。用戶定義函數(shù)可以配置有可被功能和DBMS執(zhí)行引擎兩者訪問的擴(kuò)展函數(shù)調(diào)用句柄。執(zhí)行引擎和用戶定義函數(shù)可以在為連續(xù)查詢分配初始存儲器中相互作用。一旦被啟動,連續(xù)查詢就可以對落入時間窗口的所有流元素進(jìn)行存檔,所述時間窗口例如I分鐘或區(qū)組(例如,100個元組)。時間窗口和區(qū)組可能是間隔特定的或滑動的。在本發(fā)明的一個實施例中,DBMS 104的執(zhí)行引擎可以包括用于遞增地并且共同地對流元素進(jìn)行歸檔的歷史敏感窗口操作符。例如,流源函數(shù)可以被用作為新種類的數(shù)據(jù)源。所述流源函數(shù)可以從數(shù)據(jù)流中偵聽或者讀取數(shù)據(jù)/事件序列。在時間窗口 202-1結(jié)束時,DBMS 104可以執(zhí)行連續(xù)查詢的周期。通常,在執(zhí)行期間,在樹的葉處的掃描操作符可以檢索和具體化一塊數(shù)據(jù)(例如,數(shù)據(jù)流塊)。具體化數(shù)據(jù)的塊可以包括逐個元組地將數(shù)據(jù)流塊輸送到樹的上層。然而,在本發(fā)明的一個實施例中,掃描方法可以被擴(kuò)展為在每元組基礎(chǔ)上從流源函數(shù)中檢索流元素。此外,所述流源函數(shù)可以顯式地控制用于終止每個周期的“數(shù)據(jù)結(jié)束”信號。分割和重繞方法可以被用于連續(xù)查詢的每個周期。換句話說,查詢執(zhí)行可以基于對應(yīng)的塊來分割,并且然后重繞以用于處理數(shù)據(jù)流的下一個塊。連續(xù)查詢可以被重繞(而不是關(guān)閉并且重新開始)以用于在下一個周期中處理后續(xù)的數(shù)據(jù)塊。在其中查詢規(guī)定了多個流的聯(lián)接的情況下,查詢重繞點(diǎn)可以用作同步點(diǎn)。這個方法可以解決基于查詢流處理的兩個沖突細(xì)節(jié):1) 一次一個塊對數(shù)據(jù)流應(yīng)用SQL查詢,以及2)跨越執(zhí)行周期連續(xù)不斷地維持需要的狀態(tài)以用于處理滑動窗口等。應(yīng)該注意的是,在每個執(zhí)行周期中,連續(xù)查詢可以返回對當(dāng)前塊進(jìn)行處理的結(jié)果,但可以一次一個元組來調(diào)用包括用戶定義函數(shù)的查詢的操作符。使查詢執(zhí)行實例保活可以允許存儲器上下文和每元組的處理歷史被緩沖在操作節(jié)點(diǎn)中??梢钥缭蕉鄠€周期維持這個緩沖。使用分割和重繞方法允許在單個、完全連續(xù)的查詢執(zhí)行實例內(nèi)逐塊地對數(shù)據(jù)流應(yīng)用SQL。此外,執(zhí)行引擎和用戶定義函數(shù)可以緩沖每元組的周期結(jié)果以被攜載到下一個周期上。因為連續(xù)查詢實例重繞但是從來不關(guān)閉,所以可以跨越查詢執(zhí)行周期維持所緩沖的狀態(tài),只要該連續(xù)查詢執(zhí)行實例是活躍的。進(jìn)一步地,能夠在事務(wù)初始化期間預(yù)先加載對于UDF計算所需要的任何靜態(tài)數(shù)據(jù)。窗口用戶定義函數(shù)外殼的列表可以被預(yù)先定義為相應(yīng)地擴(kuò)展執(zhí)行引擎的一個方式。如上文所提到的那樣,源流函數(shù)可以發(fā)出“數(shù)據(jù)結(jié)束”信號以命令執(zhí)行引擎終止當(dāng)前周期,并且在當(dāng)前塊上返回查詢結(jié)果。通常,查詢選擇、投影或者聯(lián)接操作不同于在結(jié)果的數(shù)據(jù)的流中插入、刪除或者更新的查詢。在選擇/投影/聯(lián)接查詢中,結(jié)果的目的地是連接到客戶端106的查詢接收器。在插入/更新/刪除查詢中,結(jié)果的目的地可以為數(shù)據(jù)庫表。在本發(fā)明的一個實施例中,結(jié)果可以被提供給客戶端106和數(shù)據(jù)庫表(經(jīng)由DBMS104)。這個可以用有效的堆插入來完成。這兩個接收器方法可以使結(jié)果到客戶端106的存留成為流式傳輸?shù)淖詣痈弊饔?。例如,通常,?select into”語句的結(jié)果僅轉(zhuǎn)向數(shù)據(jù)庫表。在這樣的實施例中,執(zhí)行引擎可以將查詢結(jié)果分叉到兩個接收器。以這種方式,連續(xù)查詢結(jié)果可以連續(xù)不斷地流向客戶端106,并且被同時地存儲在DBMS 104中。具體地,執(zhí)行引擎可以被擴(kuò)展為提供具有兩個結(jié)果目的地的基于周期的SELECT INTO和INSERT INTO。在周期之間,可以接收和歸檔更多的流元素。在窗口 202-2結(jié)束時,可以執(zhí)行下一個周期。因為連續(xù)查詢是連續(xù)不斷地存留結(jié)果,所以儲存器可能變得擁擠。在正常數(shù)據(jù)庫操作期間,由已刪除的或過時的元組所占有的儲存器物理上未被從它們的表中移除。替代地,這些元組可能仍然存在直到DBMS公用程序?qū)⑺鼈兦謇砹藶橹?,例如PostgreSQL中的真空公用程序。通常,DBMS 104周期性地清理儲存器,特別是對頻繁更新的表。然而,在連續(xù)查詢期間,結(jié)果被逐周期地提交,同時在之間幾乎沒有間隙。同樣地,在連續(xù)查詢期間還清理儲存器可能是有用的。在本發(fā)明的一個實施例中,由于每隔N個周期,可以調(diào)用特定的清理操作以回收利用空間,并且使所回收利用的空間可用于再使用。這個清理操作的兩個可能的方法包括并發(fā)清理和嵌入式清理。并發(fā)清理可以與連續(xù)查詢并行操作。并發(fā)清理可以不獨(dú)占地鎖定表。同樣地,并發(fā)清理可以與表的正常讀取和寫入并行操作。嵌入式清理可以被顯式地嵌入在連續(xù)查詢的周期控制流中。嵌入式清理可以在獨(dú)占式鎖獲得的情況下每隔N個周期運(yùn)行,以用于跨越塊移動元組以試圖將表壓縮到最小數(shù)目的磁盤塊。因為嵌入式清理可以對表使用獨(dú)占式鎖,所以出于成本節(jié)約目的,清理操作僅可以在不使用寫前日志記錄的情況下被應(yīng)用于直接插入?!┳罱K周期完成,并且最后一個塊的結(jié)果被提供給客戶端106和DBMS 104,DBMS 104就可以結(jié)束事務(wù)。如先前所陳述的那樣,SELECT INTO和INSERT INTO可以被查詢引擎擴(kuò)展來在對數(shù)據(jù)流的連續(xù)存留情況下支持連續(xù)查詢。正常的SELECT INTO和INSERT INTO行為可能是未改變的。關(guān)于SELECT INTO,每周期的查詢結(jié)果可以被堆插入到所規(guī)定的表。此外,SELECTINTO可以被擴(kuò)展成允許選擇轉(zhuǎn)入現(xiàn)有關(guān)系。選擇轉(zhuǎn)入現(xiàn)有關(guān)系可以通過允許以匹配模式附加到現(xiàn)有表來實現(xiàn)。
通過所擴(kuò)展的SELECT INTO存留流處理結(jié)果可以包括直接加載。在直接加載中,插入到堆的數(shù)據(jù)在沒有日志記錄的情況下被儲放到磁盤。這個方法可能適合于存留將不被立即檢索的數(shù)據(jù)。執(zhí)行引擎還可以被擴(kuò)展以用于INSERT INO…SELECT…FROM操作。與上述所擴(kuò)展的SELECT INTO類似,在周期事務(wù)機(jī)制下每周期的查詢結(jié)果可以被堆插入到所規(guī)定的表。
通過所擴(kuò)展的INSERT INTO存留流處理結(jié)果可以導(dǎo)致堆同步和寫前日志記錄。同樣地,插入到堆的數(shù)據(jù)可以保持在主存儲器中一會兒,并且然后由數(shù)據(jù)庫寫入器基于規(guī)定策略寫入到磁盤。結(jié)果,可以在周期提交之后立即從存儲器中檢索在連續(xù)查詢周期中最近插入的數(shù)據(jù)。除由SELECT INTO和INSERT INTO所提供的更新之外,連續(xù)查詢可以允許具有更新效果的用戶定義函數(shù)。使用用戶定義函數(shù),某些中間流處理結(jié)果可以被存儲在DBMS104中。為了這樣做,用戶定義函數(shù)可以從只讀模式放松,并且采用數(shù)據(jù)庫內(nèi)部查詢工具來有效地形成、解析、計劃并且執(zhí)行查詢。在使用PostgreSQL服務(wù)器的實施例中,可以使用PostgreSQL SPI (服務(wù)器程序接口)。在一個或多個用戶定義函數(shù)的更新效果情況下,連續(xù)查詢可能不再單獨(dú)地只讀。如果逐周期地執(zhí)行,連續(xù)查詢可以遵循基于周期的事務(wù)邊界,從而在重繞之前的每個周期之后進(jìn)行提交。這可以使得用戶定義函數(shù)的更新效果能夠在該周期完成之后可被公眾訪問。為了支持從用戶定義函數(shù)存留的結(jié)果,SELECT查詢的每個周期都可以被放在事務(wù)邊界內(nèi)。此外,行獨(dú)占式鎖可以被用于通過SPI從用戶定義函數(shù)更新的表。因此,連續(xù)查詢的中間結(jié)果可以由用戶定義函數(shù)插入到表。使用分割和重繞方法來存留流數(shù)據(jù)具有三個性能優(yōu)點(diǎn)。首先,重繞連續(xù)查詢比常規(guī)的逐條駁斥/重新開始是更有效率的。其次,因為查詢不關(guān)閉,所以可以維持UDP狀態(tài)(例如,用于滑動窗口)。另外,因為下一個查詢執(zhí)行將為不同的后端進(jìn)程,所以數(shù)據(jù)可能需要被拷貝到一些共享存儲器。第三,在連續(xù)查詢處理期間直接地將數(shù)據(jù)插入到堆避免了解析、計劃以及設(shè)置多個數(shù)據(jù)庫更新操作中的開銷。圖3是示出了根據(jù)本發(fā)明的實施例的數(shù)據(jù)流的連續(xù)查詢的性能的圖形300。這個方法已經(jīng)使用廣泛接受的線形道路基準(zhǔn)程序測試過了,所述線形道路基準(zhǔn)程序?qū)Τ掷m(xù)3個小時持續(xù)時間的多條聞速公路上的交通進(jìn)行建I旲。在該基準(zhǔn)程序中,每條聞速公路在每個方向上具有3個車道,并且每個車道具有多個路段。車在路段邊界處進(jìn)入和離開車道,并且每隔30秒讀取每輛車的位置而且每個讀取構(gòu)成流式事件。在L=I處,基準(zhǔn)程序由一條高速公路構(gòu)成,同時事件到達(dá)速率范圍從每秒幾百個到在3小時持續(xù)時間結(jié)束時的1,700個事件/秒的峰值。LI設(shè)定被選擇用于我們的試驗。每條記錄給出了車的當(dāng)前位置和速度。路段統(tǒng)計,即按高速公路、方向以及路段尺寸定制為的活動車的數(shù)目、平均速度以及5分鐘平均移動速度的計算已經(jīng)被公認(rèn)為基準(zhǔn)程序的瓶頸。流式元組由源流函數(shù)STREAM_CYCLE_LR(時間,周期)根據(jù)線形道路輸入數(shù)據(jù)來生成,其中參數(shù)“時間”是以秒為單位的時間窗口尺寸。周期是連續(xù)查詢運(yùn)行的周期的數(shù)目。例如,STREAM_CYCLE_LR(60, 180)交付待在一個執(zhí)行周期中處理的落入每一分鐘(60秒)的元組180次(持續(xù)3小時或180分鐘)。不像其中路段統(tǒng)計由專設(shè)程序所計算的其他報告的LR實施方式,連續(xù)查詢使得使這兩個連續(xù)統(tǒng)計測量由查詢引擎直接地用以下單個、長期存在的SQL查詢來生成成為可倉泛:
權(quán)利要求
1.一種用于查詢數(shù)據(jù)流的方法(200),包括: 接收基于規(guī)定所述數(shù)據(jù)流和窗口的查詢(528)的查詢計劃; 在所述窗口期間從所述數(shù)據(jù)流接收一個或多個流元素; 通過在逐個元組的基礎(chǔ)上將所述一個或多個流元素從在所述查詢計劃的葉處的掃描操作符傳遞到所述查詢計劃的上層來對所述一個或多個流元素應(yīng)用所述查詢(528);以及基于所述一個或多個流元素來提交所述查詢(528)的結(jié)果。
2.根據(jù)權(quán)利要求1所述的方法(200),包括: 將所述結(jié)果提供給客戶端應(yīng)用(106);并且 將所述結(jié)果存留到數(shù)據(jù)庫表。
3.根據(jù)權(quán)利要求2所述的方法(200),其中,所述查詢(528)規(guī)定以下各項中的一個: 插入操作;以及 選擇轉(zhuǎn)入操作。
4.根據(jù)權(quán)利要求1所述的方法(200),包括: 基于在所述查詢(528)中規(guī)定的用戶定義函數(shù)來啟動事務(wù); 在所述事務(wù)期間執(zhí)行與多個窗口相對應(yīng)的多個周期,其中所述多個窗口包括所述窗口,并且其中,所述周期中的每一個都包括: 接收所述一個或多個流元素; 對所述一個或多個流元素應(yīng)用所述查詢(528);并且 提交所述結(jié)果。
5.根據(jù)權(quán)利要求4所述的方法(200),包括周期性地對用于所述事務(wù)的過時數(shù)據(jù)執(zhí)行真空操作,其中,時段包括預(yù)定數(shù)目的所述多個周期。
6.根據(jù)權(quán)利要求1所述的方法(200),包括基于用戶定義函數(shù)來存儲所述查詢(528)的中間結(jié)果。
7.根據(jù)權(quán)利要求1所述的方法(200),其中,所述查詢(528)規(guī)定所述數(shù)據(jù)流和以下中的至少一個的聯(lián)接: 數(shù)據(jù)庫表;以及 另一數(shù)據(jù)流。
8.一種用于查詢數(shù)據(jù)流的計算機(jī)系統(tǒng)(500),所述計算機(jī)系統(tǒng)包括處理器(512),所述處理器(512)被配置成: 接收基于規(guī)定所述數(shù)據(jù)流、窗口以及用戶定義函數(shù)的查詢(528)的查詢計劃; 在所述窗口期間從所述數(shù)據(jù)流接收一個或多個流元素; 通過在逐個元組的基礎(chǔ)上將所述一個或多個流元素從在所述查詢計劃的葉處的掃描操作符傳遞到所述查詢計劃的上層來對所述一個或多個流元素應(yīng)用所述查詢(528);以及基于所述一個或多個流元素來提交所述查詢(528)的結(jié)果。
9.根據(jù)權(quán)利要求8所述的計算機(jī)系統(tǒng)(500),其中,所述處理器(512)被配置成: 將所述結(jié)果提供給客戶端應(yīng)用(106);并且 將所述結(jié)果存留到數(shù)據(jù)庫表。
10.根據(jù)權(quán)利要求9所述的計算機(jī)系統(tǒng)(500),其中,所述查詢(528)規(guī)定以下各項中的一個:插入操作;以及 選擇轉(zhuǎn)入操作。
11.根據(jù)權(quán)利要求8所述的計算機(jī)系統(tǒng)(500),其中,所述處理器(512)被配置成: 基于所述用戶定義函數(shù)來啟動事務(wù),其中,所述用戶定義函數(shù)配置有對所述用戶定義函數(shù)和數(shù)據(jù)庫管理系統(tǒng)執(zhí)行引擎可訪問的擴(kuò)展函數(shù)調(diào)用句柄,并且其中,所述執(zhí)行引擎和所述用戶定義函數(shù)被配置成相互作用以為所述事務(wù)分配初始存儲器; 在所述事務(wù)期間執(zhí)行與多個窗口相對應(yīng)的多個周期,其中所述多個窗口包括所述窗口,并且其中,在所述周期中的每一個中,所述處理器被配置成: 接收所述一個或多個流元素; 對所述一個或多個流元素應(yīng)用所述查詢;以及 提交所述結(jié)果。
12.根據(jù)權(quán)利要求11所述的計算機(jī)系統(tǒng)(500),包括周期性地對用于所述事務(wù)的過時數(shù)據(jù)執(zhí)行真空操作,其中,時段包括預(yù)定數(shù)目的所述多個周期。
13.根據(jù)權(quán)利要求8所述的計算機(jī)系 統(tǒng)(500),其中,所述處理器被配置成基于第二用戶定義函數(shù)來存儲所述查詢(528)的中間結(jié)果。
14.根據(jù)權(quán)利要求8所述的計算機(jī)系統(tǒng)(500),其中,所述查詢(528)規(guī)定所述數(shù)據(jù)流和以下中的至少一個的聯(lián)接: 數(shù)據(jù)庫表;以及 另一數(shù)據(jù)流。
15.一種非暫時性計算機(jī)可讀介質(zhì)(622),其包括可由處理器(612)執(zhí)行以查詢數(shù)據(jù)流的機(jī)器可讀指令,所述非暫時性計算機(jī)可讀介質(zhì)(622)包括: 計算機(jī)可讀指令(624),其當(dāng)被處理器(612)執(zhí)行時,接收基于規(guī)定更新操作、所述數(shù)據(jù)流、窗口以及用戶定義函數(shù)的查詢的查詢計劃; 計算機(jī)可讀指令(626),其當(dāng)被處理器(612)執(zhí)行時,在所述窗口期間從所述數(shù)據(jù)流接收一個或多個流元素; 計算機(jī)可讀指令(628),其當(dāng)被處理器(612)執(zhí)行時,基于所述用戶定義函數(shù)來啟動事務(wù); 計算機(jī)可讀指令(628),其當(dāng)被處理器(612)執(zhí)行時,在所述事務(wù)期間執(zhí)行與多個窗口相對應(yīng)的多個周期,其中所述多個窗口包括所述窗口,并且其中,在所述周期中的每一個期間,所述處理器(612)被配置成: 接收所述一個或多個流元素; 通過在逐個元組的基礎(chǔ)上將所述一個或多個流元素從在所述查詢計劃的葉處的掃描操作符傳遞到所述查詢計劃的上層來對所述一個或多個流元素應(yīng)用所述更新操作;以及提交所述結(jié)果; 計算機(jī)可讀指令(630),其當(dāng)被所述處理器(612)執(zhí)行時,將所述結(jié)果提供給客戶端應(yīng)用;以及 計算機(jī)可讀指令(630),其當(dāng)被所述處理器(612)執(zhí)行時,將所述結(jié)果存留到數(shù)據(jù)庫表。
全文摘要
提供了一種用于查詢數(shù)據(jù)流的方法。所述方法包括接收基于規(guī)定數(shù)據(jù)流和窗口的查詢的查詢計劃。所述方法進(jìn)一步包括在所述窗口期間從所述數(shù)據(jù)流接收一個或多個流元素。此外,所述方法包括通過在逐個元組的基礎(chǔ)上將所述一個或多個流元素從在所述查詢計劃的葉處的掃描操作符傳遞到所述查詢計劃的上層來對所述一個或多個流元素應(yīng)用所述查詢。所述方法還包括基于所述一個或多個流元素來提交所述查詢的結(jié)果。
文檔編號G06F15/16GK103154935SQ201080069548
公開日2013年6月12日 申請日期2010年10月11日 優(yōu)先權(quán)日2010年10月11日
發(fā)明者Q.陳, M.蘇 申請人:惠普發(fā)展公司,有限責(zé)任合伙企業(yè)