優(yōu)先權(quán)申明
本申請要求提交于2015年6月22日的美國專利申請14/746,188的優(yōu)先權(quán),后者要求提交于2014年11月14日的美國專利申請62/079,922的優(yōu)先權(quán),其全部內(nèi)容通過引用而并入于此。
背景技術(shù):
本說明書涉及處理包括聯(lián)合類型操作(union-typeoperation)的查詢。
對數(shù)據(jù)源的查詢指定了要從數(shù)據(jù)源檢索的數(shù)據(jù)。查詢可被提供給數(shù)據(jù)源(例如,數(shù)據(jù)庫),并且與數(shù)據(jù)源相關(guān)聯(lián)的數(shù)據(jù)處理系統(tǒng)(例如,數(shù)據(jù)庫管理系統(tǒng))可以返回由查詢指定的數(shù)據(jù)??梢允褂酶鞣N技術(shù)來解析查詢以識別數(shù)據(jù)源中的由查詢指定的數(shù)據(jù)。
技術(shù)實現(xiàn)要素:
方面1是一種基于sql查詢來生成計算機(jī)程序的計算機(jī)實現(xiàn)方法,包括:接收sql查詢,所述sql查詢包括對存儲在第一數(shù)據(jù)源處的第一數(shù)據(jù)集的引用,并且包括對存儲在與所述第一數(shù)據(jù)源不同的第二數(shù)據(jù)源處的第二數(shù)據(jù)集的引用;確定所述sql查詢包括兩個或更多個命令,所述命令包括第一聯(lián)合類型操作和第一聚合操作;以及確定所述sql查詢描述出應(yīng)當(dāng)對來自所述第一數(shù)據(jù)集的至少部分?jǐn)?shù)據(jù)應(yīng)用所述第一聯(lián)合類型操作并且對來自所述第二數(shù)據(jù)集的至少部分?jǐn)?shù)據(jù)應(yīng)用所述第一聯(lián)合類型操作;確定所述sql查詢描述出應(yīng)當(dāng)對由所述第一聯(lián)合類型操作產(chǎn)生的數(shù)據(jù)應(yīng)用所述第一聚合操作;以及基于所述sql查詢來在第一系統(tǒng)上生成計算機(jī)程序,所述計算機(jī)程序被配置為:發(fā)送用于引導(dǎo)第二系統(tǒng)對來自所述第一數(shù)據(jù)集的一部分?jǐn)?shù)據(jù)執(zhí)行第二聚合操作的指令;從所述第二系統(tǒng)接收作為第一部分?jǐn)?shù)據(jù)的匯總的特定數(shù)據(jù)集;以及對所述特定數(shù)據(jù)集和來自所述第二數(shù)據(jù)集的一部分?jǐn)?shù)據(jù)的匯總執(zhí)行第二聯(lián)合類型操作。
方面2是如方面1所述的方法,其中,所述計算機(jī)程序還被配置為:發(fā)送用于引導(dǎo)第三系統(tǒng)對來自所述第二數(shù)據(jù)集的一部分?jǐn)?shù)據(jù)執(zhí)行第二聚合操作的指令;以及從所述第三系統(tǒng)接收作為第二部分?jǐn)?shù)據(jù)的匯總的特定數(shù)據(jù)集。
方面3是如方面1或2所述的方法,其中,所述計算機(jī)程序包括:表示對作為第一部分?jǐn)?shù)據(jù)的匯總和第二部分?jǐn)?shù)據(jù)的匯總的數(shù)據(jù)集所應(yīng)用的sql查詢的聯(lián)合類型操作的第一組件,其中所述匯總各自包含比各自相應(yīng)部分的數(shù)據(jù)更少的記錄;以及表示所述第一數(shù)據(jù)集的第二組件,其中所述第二組件在被執(zhí)行時使得發(fā)送所述指令。
方面4是如方面3所述的方法,其中,所述計算機(jī)程序還包括:表示所述第二數(shù)據(jù)集的第三組件和表示第三聚合操作的第四組件,其中所述第三組件的輸出流向所述第四組件,并且所述第四組件的輸出流向所述第一組件。
方面5是如方面3或4所述的方法,其中,所述第二組件的輸出包括作為所述第一部分?jǐn)?shù)據(jù)的匯總的特定數(shù)據(jù)集。
方面6是如方面3、4或5所述的方法,其中,表示所述第一數(shù)據(jù)源的組件發(fā)送所述指令,所述指令是在所述第一系統(tǒng)使數(shù)據(jù)被發(fā)送至用于執(zhí)行所述計算機(jī)程序的系統(tǒng)之前進(jìn)行的。
方面7是如方面1至6中任一項所述的方法,其中,所述指令包括sql語句,所述sql語句包括與所述第二聚合操作相對應(yīng)的命令。
方面8是如方面1至7中任一項所述的方法,其中,基于所述sql查詢來生成計算機(jī)程序的步驟包括:基于所述sql查詢來生成查詢計劃;向所述查詢計劃添加對來自所述第一數(shù)據(jù)源的數(shù)據(jù)所應(yīng)用的第二聚合操作;確定所述第一系統(tǒng)包括用于進(jìn)行所述第二聚合操作的功能;向表示所述第一數(shù)據(jù)集的一部分查詢計劃附加用以進(jìn)行所述第二聚合操作的指令;以及基于所述查詢計劃來生成所述計算機(jī)程序。
方面9是如方面1至8中任一項所述的方法,其中,所述第一聚合操作是最小值、最大值、求和或計數(shù)操作,并且所述第二聚合操作是與所述第一聚合操作相同類型的聚合操作。
方面10是如方面1至9中任一項所述的方法,其中,所述第一聚合操作是平均操作,并且所述第二聚合操作是求和操作或計數(shù)操作。
方面11是如方面1至10中任一項所述的方法,其中,還包括:基于所述第一聚合操作來確定所述第二聚合操作。
方面12是如方面11所述的方法,其中,基于所述第一聚合操作來確定所述第二聚合操作的步驟包括:確定在被進(jìn)行時產(chǎn)生與所述第一聚合操作的輸出等同的輸出的操作序列;以及從所述操作序列中選擇所述第二聚合操作。
方面13是如方面1至12中任一項所述的方法,其中,所述第一聯(lián)合類型操作與所述第二聯(lián)合類型操作具有相同的類型。
方面14是如方面1至13中任一項所述的方法,其中,所述第一系統(tǒng)包括基于圖的處理系統(tǒng),并且所述第二系統(tǒng)包括關(guān)系數(shù)據(jù)庫管理系統(tǒng)。
所述方面中的一個或多個方面可以被單獨地或組合地表示為系統(tǒng)或設(shè)備,或者表示為計算機(jī)可讀存儲裝置,所述計算機(jī)可讀存儲裝置用于存儲包括在被計算機(jī)系統(tǒng)執(zhí)行時進(jìn)行該方面的操作的機(jī)器可讀指令的計算機(jī)程序產(chǎn)品。作為一個示例,計算機(jī)可讀存儲裝置可以存儲包括在由計算機(jī)系統(tǒng)執(zhí)行時進(jìn)行根據(jù)第一至第十三方面中任一項所述的操作的機(jī)器可讀指令的計算機(jī)程序產(chǎn)品。作為另一示例,包括一個或多個處理器的計算機(jī)系統(tǒng)可以包括用于存儲計算機(jī)程序產(chǎn)品的計算機(jī)可讀存儲裝置,所述計算機(jī)程序產(chǎn)品包括在由一個或多個處理器執(zhí)行時進(jìn)行根據(jù)第一至第十三方面中任一項所述的操作的機(jī)器可讀指令。
各方面可以包括以下優(yōu)點中的一個或多個。數(shù)據(jù)處理系統(tǒng)下推聚合操作以減少從數(shù)據(jù)源傳輸?shù)臄?shù)據(jù)量。與查詢相對應(yīng)的計算機(jī)程序可例如通過移除組件來簡化。
根據(jù)以下描述和權(quán)利要求書,本發(fā)明的其它特征和優(yōu)點將變得顯而易見。
附圖說明
圖1示出可以處理查詢的數(shù)據(jù)處理系統(tǒng)。
圖2示出數(shù)據(jù)處理系統(tǒng)的元件。
圖3和圖4示出查詢計劃。
圖5和圖6示出計算機(jī)程序。
圖7和圖8是流程圖。
具體實施方式
數(shù)據(jù)處理系統(tǒng)可以將查詢(諸如sql查詢)轉(zhuǎn)換為諸如數(shù)據(jù)流圖等的計算機(jī)程序。數(shù)據(jù)流圖包括被執(zhí)行時進(jìn)行與查詢的操作等同的操作(例如,數(shù)據(jù)處理操作)的組件。用于根據(jù)查詢來生成計算機(jī)程序的系統(tǒng)可以確定一些操作可以由數(shù)據(jù)源(例如,數(shù)據(jù)庫系統(tǒng))執(zhí)行。例如,可以通過指示數(shù)據(jù)源執(zhí)行組件所表示的一個或多個操作來將計算機(jī)程序的組件“下推”至數(shù)據(jù)源,據(jù)此可以從計算機(jī)程序中除去該組件。例如,計算機(jī)程序可以通過向數(shù)據(jù)源發(fā)送(當(dāng)在數(shù)據(jù)源處執(zhí)行時進(jìn)行操作的)sql語句來指示數(shù)據(jù)源執(zhí)行操作。
sql查詢(亦稱為sql語句)使用由結(jié)構(gòu)化查詢語言(sql)定義的命令和句法。一般來說,查詢是用于指定該查詢中所指示的一個或多個數(shù)據(jù)集中的數(shù)據(jù)的子集的語句。指定的子集可以由用于處理查詢的系統(tǒng)返回給用于發(fā)出該查詢的系統(tǒng)。由查詢指定并且響應(yīng)于查詢而返回的數(shù)據(jù)通常是存儲在查詢所指示的數(shù)據(jù)集中的總數(shù)據(jù)的一部分。sql查詢的示例可以是“selectlast_namefromcurrent_customers”。該sql查詢包括操作select,該操作指示執(zhí)行查詢的系統(tǒng)根據(jù)select操作的自變量來檢索數(shù)據(jù)。在sql的句法中,自變量是作為諸如數(shù)據(jù)庫表等的數(shù)據(jù)集的“current_customers”和作為數(shù)據(jù)庫表的列的“l(fā)ast_name”。當(dāng)系統(tǒng)解釋查詢并執(zhí)行查詢的操作時,系統(tǒng)將響應(yīng)于查詢而返回last_name列的數(shù)據(jù)(例如,包含在last_name列中的數(shù)據(jù)的每個部分)。在通過引用而并入于此的isbn978-0470229064的由alexkriegel和boristrukhnov在2008年4月7日發(fā)表的“sqlbible,2ndedition”中詳細(xì)描述了sql。
有時,查詢可以包括對來自兩個或更多個數(shù)據(jù)源的記錄的組合所執(zhí)行的操作。例如,查詢可以包括聯(lián)合類型操作。聯(lián)合類型操作生成包括來自兩個或更多個數(shù)據(jù)源的記錄的數(shù)據(jù)集,并且提供該數(shù)據(jù)集作為輸出。換句話說,聯(lián)合類型操作將來自兩個或更多個源的數(shù)據(jù)組合為單個數(shù)據(jù)集。術(shù)語“聯(lián)合”(例如,sql中的union命令)通常是指在提供輸出之前移除兩個數(shù)據(jù)源中重復(fù)的數(shù)據(jù)元素的聯(lián)合類型操作,而“聯(lián)合所有”(例如,sql中的unionall命令)通常是指在提供輸出之前移除兩個數(shù)據(jù)源中重復(fù)的數(shù)據(jù)元素的聯(lián)合類型操作。例如,如果兩個數(shù)據(jù)集各自包含電話號碼并且兩個數(shù)據(jù)集都包含表示電話號碼“555-1212”的數(shù)據(jù)元素,則“聯(lián)合”操作將僅輸出表示電話號碼“555-1212”的一個數(shù)據(jù)元素,而“聯(lián)合所有”操作將輸出表示電話號碼“555-1212”的兩個數(shù)據(jù)元素。
在聯(lián)合類型操作之后,查詢還可以包括聚合操作(例如,諸如sum、count、avg、min或max等的操作)。聚合操作(有時稱為聚合功能或匯總操作)提供了匯總輸入數(shù)據(jù)的輸出數(shù)據(jù),使得輸出數(shù)據(jù)的大小通常比輸入數(shù)據(jù)小得多。如果在聯(lián)合類型操作之后,查詢包括聚合操作,則生成計算機(jī)程序的系統(tǒng)可以將聚合操作置于聯(lián)合類型操作之前,這是因為進(jìn)行聚合操作僅需要從數(shù)據(jù)源所接收到的數(shù)據(jù)的匯總。此外,如果任何或所有數(shù)據(jù)源已被確定為本地支持聚合操作,則置于聯(lián)合類型操作之前的聚合操作可被下推至其各自相關(guān)聯(lián)的數(shù)據(jù)源中。這通常減少了從數(shù)據(jù)源傳輸?shù)臄?shù)據(jù)量,因為計算機(jī)程序僅接收將以其它方式從一些或所有數(shù)據(jù)源所接收的數(shù)據(jù)的匯總。
作為一個現(xiàn)實世界的例子,電話公司可以存儲追溯60天的電話呼叫記錄。該公司可以具有包含最近7天的電話記錄的數(shù)據(jù)存儲以及包含剩余53天記錄的另一數(shù)據(jù)存儲。對所有60天記錄執(zhí)行的查詢可以包括聯(lián)合類型操作,并且聚合操作可被下推至一個或全部兩個數(shù)據(jù)存儲。此外,包含最近7天電話記錄的數(shù)據(jù)存儲可以是關(guān)系數(shù)據(jù)庫,并且包含剩余53天記錄的數(shù)據(jù)存儲可以是除關(guān)系數(shù)據(jù)庫以外的數(shù)據(jù)存儲類型,例如平面文件。聚合操作仍可被下推至包含最近7天電話記錄的關(guān)系數(shù)據(jù)庫。
圖1示出可以處理查詢102以生成由查詢102指定的結(jié)果104的數(shù)據(jù)處理系統(tǒng)100。結(jié)果104基于從查詢102所引用的數(shù)據(jù)源110、120所接收到的數(shù)據(jù)106。數(shù)據(jù)處理系統(tǒng)100響應(yīng)于該數(shù)據(jù)處理系統(tǒng)100基于查詢103所生成的指令114、124來接收數(shù)據(jù)106。
查詢102用于檢索被確定為由查詢指定的數(shù)據(jù)。
一種類型的查詢102是結(jié)構(gòu)化查詢語言(sql)查詢。sql查詢(亦稱為sql語句)使用由結(jié)構(gòu)化查詢語言定義的命令和句法。響應(yīng)于查詢而返回數(shù)據(jù)的資源的典型示例是關(guān)系數(shù)據(jù)庫。關(guān)系數(shù)據(jù)庫是一個或多個數(shù)據(jù)庫表的集合以及管理諸如解釋sql查詢、從表讀取數(shù)據(jù)、向表寫入數(shù)據(jù)以及執(zhí)行其它種類數(shù)據(jù)處理功能等的數(shù)據(jù)處理操作的系統(tǒng)。數(shù)據(jù)庫表是排列在a)各自表示記錄的行和b)各自表示存儲在行中的數(shù)據(jù)的類別的列中的數(shù)據(jù)的集合。例如,名為“current_customers”的數(shù)據(jù)庫表可以具有各自表示業(yè)務(wù)的當(dāng)前客戶的行,并且可以具有表示數(shù)據(jù)的類別(諸如客戶的名稱、客戶的地址、客戶最近購買的產(chǎn)品等)的列。
數(shù)據(jù)源110、120在數(shù)據(jù)處理系統(tǒng)100的外部。在數(shù)據(jù)處理系統(tǒng)100的外部是指資源不是數(shù)據(jù)處理系統(tǒng)100的組件之一。(圖2中詳細(xì)示出數(shù)據(jù)處理系統(tǒng)100的一些組件。)例如,數(shù)據(jù)源110、120可以是使用網(wǎng)絡(luò)(例如,因特網(wǎng))進(jìn)行通信的設(shè)施。數(shù)據(jù)處理系統(tǒng)100通過向網(wǎng)絡(luò)發(fā)送數(shù)據(jù)并從網(wǎng)絡(luò)接收數(shù)據(jù)來與數(shù)據(jù)源110、120進(jìn)行通信。
如圖所示,數(shù)據(jù)處理系統(tǒng)100可以接收包括對多個數(shù)據(jù)源110、120的引用101、103的查詢102。數(shù)據(jù)源110、120各自包含一個或多個數(shù)據(jù)集。例如,數(shù)據(jù)源110、120可以包括諸如數(shù)據(jù)庫表、數(shù)據(jù)文件或存儲在例如有形、非暫時性計算機(jī)可讀介質(zhì)的存儲介質(zhì)上的其它數(shù)據(jù)結(jié)構(gòu)等的數(shù)據(jù)集。
此外,數(shù)據(jù)源通常由與該數(shù)據(jù)源相關(guān)聯(lián)的系統(tǒng)來管理。例如,如果數(shù)據(jù)源是包含數(shù)據(jù)庫表的關(guān)系數(shù)據(jù)庫(或數(shù)據(jù)庫表的集合),則關(guān)系數(shù)據(jù)庫可以由關(guān)系數(shù)據(jù)庫管理系統(tǒng)(rdbms)管理。引用101、103可以是識別數(shù)據(jù)源的任何信息。在一些示例中,引用101、103是數(shù)據(jù)源110、120的字母數(shù)字“名稱”。
關(guān)系數(shù)據(jù)庫管理系統(tǒng)(rdbms)是用于處理涉及創(chuàng)建并修改存儲在關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)的指令的系統(tǒng)。rdbms包括用于解釋查詢并返回查詢所指定的數(shù)據(jù)的功能。解釋查詢和返回查詢所指定的數(shù)據(jù)的組合有時稱為執(zhí)行查詢。例如,一些rdbms實現(xiàn)包括引擎,該引擎a)解析sql查詢、b)識別由結(jié)構(gòu)化查詢語言定義的操作、c)識別命令的自變量以及d)根據(jù)自變量進(jìn)行(例如,執(zhí)行)操作。
如上所述,sql查詢“selectlast_namefromcurrent_customers”包括操作select,該操作指示rdbms根據(jù)select操作的自變量來檢索數(shù)據(jù)。自變量是作為rdbms所管理的數(shù)據(jù)庫表的“current_customers”和作為數(shù)據(jù)庫表的列的“l(fā)ast_name”。當(dāng)rdbms解釋查詢并執(zhí)行查詢的操作時,rdbms將響應(yīng)于查詢而返回last_name列的數(shù)據(jù)(例如,包含在last_name列中的數(shù)據(jù)的每個部分)。
數(shù)據(jù)處理系統(tǒng)100基于查詢102而生成計算機(jī)程序108(有時稱為數(shù)據(jù)處理程序)。例如,可以使用將查詢當(dāng)作輸入并產(chǎn)生數(shù)據(jù)流圖作為輸出的引擎(例如,形成數(shù)據(jù)處理系統(tǒng)100的子系統(tǒng)的引擎)來生成計算機(jī)程序108。盡管此處使用數(shù)據(jù)流圖作為示例,但計算機(jī)程序可以是包括程序代碼的任何種類的程序,所述程序代碼可被執(zhí)行用于進(jìn)行程序代碼所表示的指令。
以這種方式,諸如圖1所示的計算機(jī)程序108等的計算機(jī)程序在被執(zhí)行時可例如通過諸如rdbms等的數(shù)據(jù)庫管理系統(tǒng)來產(chǎn)生與相應(yīng)查詢102的執(zhí)行相同的輸出。因此,可以使用諸如sql等的查詢語言來編寫查詢102。然而,進(jìn)行相應(yīng)數(shù)據(jù)處理操作的系統(tǒng)(例如,數(shù)據(jù)處理系統(tǒng)100的子系統(tǒng))可以執(zhí)行計算機(jī)程序108,以便執(zhí)行與執(zhí)行查詢102但不執(zhí)行計算機(jī)程序108的系統(tǒng)(例如,rdbms)將執(zhí)行的操作等同的操作。當(dāng)我們說兩個操作等同時,意思是當(dāng)提供相同的輸入數(shù)據(jù)時,這兩個操作產(chǎn)生基本上相同的輸出數(shù)據(jù)。例如,當(dāng)提供有相同的輸入數(shù)據(jù)時,兩個操作可以產(chǎn)生完全相同的輸出數(shù)據(jù)。例如,提供有相同輸入數(shù)據(jù)的兩個操作可以產(chǎn)生僅在數(shù)據(jù)格式化方面不同的輸出數(shù)據(jù),例如,一個操作可以產(chǎn)生逗號分隔的輸出數(shù)據(jù),并且等同的操作可以產(chǎn)生制表符分隔的以其它方式與逗號分隔的輸出數(shù)據(jù)相同的輸出數(shù)據(jù)。
在一些示例中,查詢102的一些操作可以由計算機(jī)程序108進(jìn)行,并且查詢102的一些操作可被下推至數(shù)據(jù)源110、120。這時,意思是數(shù)據(jù)處理系統(tǒng)100識別查詢102中的可由管理數(shù)據(jù)源110、120的系統(tǒng)112、122中的一個或多個所執(zhí)行的操作。然后,數(shù)據(jù)處理系統(tǒng)100可以生成在由系統(tǒng)112、122執(zhí)行時使系統(tǒng)112、122執(zhí)行與數(shù)據(jù)處理系統(tǒng)100所識別的操作等同的操作的指令114、124。計算機(jī)程序108可被配置為在被執(zhí)行時向系統(tǒng)112、122發(fā)送指令114、124。指令114、124可以是可由系統(tǒng)112、122執(zhí)行的任何格式的指令。
在一些示例中,基于數(shù)據(jù)源110、120的已知特性,數(shù)據(jù)處理系統(tǒng)100已知數(shù)據(jù)源110、120的各個能力。例如,如果數(shù)據(jù)處理系統(tǒng)100使用sql語句與數(shù)據(jù)源110之一進(jìn)行通信,則數(shù)據(jù)處理系統(tǒng)100已知數(shù)據(jù)源110能夠處理sql語句。利用該信息,數(shù)據(jù)處理系統(tǒng)100可以識別可表示為sql語句并因此被下推至數(shù)據(jù)源110的其它操作。
在一些示例中,下推的操作是聚合操作105。因為聚合操作105接受數(shù)據(jù)并產(chǎn)生數(shù)據(jù)的匯總,所以聚合操作105通常產(chǎn)生比輸入數(shù)據(jù)的量少的輸出數(shù)據(jù)。出于這個原因,由管理數(shù)據(jù)源110、120的系統(tǒng)112、122來進(jìn)行與聚合操作105相對應(yīng)的操作通常更有效。以這種方式,數(shù)據(jù)處理系統(tǒng)100僅接收來自每個數(shù)據(jù)源110、120的匯總數(shù)據(jù)116、126。如果通過數(shù)據(jù)處理系統(tǒng)100上執(zhí)行的計算機(jī)程序108來執(zhí)行與聚合操作105相對應(yīng)的操作,則匯總數(shù)據(jù)116、126通常是比從數(shù)據(jù)源110、120傳輸?shù)臄?shù)據(jù)106更少量的數(shù)據(jù)。此外,聚合操作通??杀槐硎緸閟ql語句或sql語句的一部分,因此聚合操作是可被下推至能夠處理sql語句的系統(tǒng)(例如,rdbms)的操作的示例。以這種方式,從每個數(shù)據(jù)源110、120返回的數(shù)據(jù)106是存儲在各個數(shù)據(jù)源中的一部分?jǐn)?shù)據(jù)的匯總,而不是該一部分?jǐn)?shù)據(jù)(例如,數(shù)據(jù)庫表的一部分或者如由查詢102所指定的其它數(shù)據(jù)體的一部分)本身。
如圖3和4中詳細(xì)所示,即使在查詢102中聯(lián)合類型操作位于聚合操作105之前,聚合操作105也可被下推。
圖2示出可以用于解釋查詢102并生成與查詢102相對應(yīng)的計算機(jī)程序108的數(shù)據(jù)處理系統(tǒng)100的元件。
查詢102由用于生成與該查詢102相對應(yīng)的查詢計劃132的查詢計劃器130接收。例如,數(shù)據(jù)處理系統(tǒng)100可以向查詢計劃器130提供查詢102。查詢計劃是在執(zhí)行查詢時可以執(zhí)行的操作(例如,數(shù)據(jù)處理操作)的描述。例如,操作可以是例如由數(shù)據(jù)庫管理系統(tǒng)進(jìn)行的數(shù)據(jù)庫操作。這些操作還可以采取其它形式。數(shù)據(jù)庫操作有時被稱為數(shù)據(jù)庫功能或數(shù)據(jù)庫任務(wù)。
查詢計劃可以描述一個可能的操作安排,即使其它操作安排或不同的操作集將實現(xiàn)相同的結(jié)果。查詢計劃器是可以基于與查詢有關(guān)的信息和與查詢所使用的數(shù)據(jù)源有關(guān)的信息來生成查詢計劃的系統(tǒng)。
在一些安排中,操作能夠按各種順序執(zhí)行,同時仍提供等同的輸出。正因如此,查詢計劃器可以具有確定最佳查詢計劃的功能。例如,最佳查詢計劃可以是描述用于以最少時間量執(zhí)行查詢、或者使用最少量的諸如數(shù)據(jù)存儲空間等的數(shù)據(jù)庫資源、或者以其它方式在已由數(shù)據(jù)庫系統(tǒng)所識別的約束內(nèi)完成查詢的操作的安排的查詢計劃。查詢計劃器的用于確定最佳查詢計劃的功能可以包括用于對許多可能的查詢計劃進(jìn)行評分或評級的功能,并且還可以包括用于以最佳或有效的配置來重新安排可能的查詢計劃的功能。
單個查詢可以被執(zhí)行多次,并且每次執(zhí)行可以具有唯一的最佳查詢計劃。例如,數(shù)據(jù)庫表內(nèi)的數(shù)據(jù)可以在查詢的兩次執(zhí)行之間發(fā)生變化。在該示例中,針對第一次查詢執(zhí)行而生成的查詢計劃中描述的操作在第二次查詢執(zhí)行期間可能比第一次執(zhí)行期間需要更多或更少的執(zhí)行時間。在這種情況下,不同的操作安排可能更適合第二次查詢執(zhí)行,例如,相同操作的不同安排或不同操作的安排??紤]到數(shù)據(jù)庫表的瞬時狀態(tài),可以針對第二次查詢執(zhí)行而生成針對該查詢所優(yōu)化的查詢計劃。
查詢計劃132由計算機(jī)程序生成引擎140接收。計算機(jī)程序生成引擎140生成計算機(jī)程序108,該計算機(jī)程序108在被執(zhí)行時進(jìn)行與查詢102相對應(yīng)的操作。例如,查詢102包含由結(jié)構(gòu)化查詢語言定義的一個或多個操作以及與操作相關(guān)聯(lián)的自變量。在該示例中,計算機(jī)程序108包含與sql查詢的操作等同的可執(zhí)行功能,并且當(dāng)執(zhí)行計算機(jī)程序108時,基于相同的自變量而執(zhí)行該計算機(jī)程序108。
計算機(jī)程序生成引擎140分析查詢計劃132以判斷在生成計算機(jī)程序108之前是否應(yīng)該改變查詢計劃132所表示的操作。因為計算機(jī)程序108是基于查詢計劃132而生成的,所以計算機(jī)程序生成引擎140可以在繼續(xù)生成計算機(jī)程序108之前使用分析結(jié)果來修改查詢計劃132。例如,查詢計劃132可以包括聯(lián)合類型操作,然后是聚合操作。如果在生成計算機(jī)程序108之前應(yīng)該改變查詢計劃132所表示的操作,則計算機(jī)程序生成引擎140可以修改查詢計劃132以將聚合操作置于聯(lián)合類型操作之前。這在圖3和4中進(jìn)一步詳細(xì)地示出。
當(dāng)計算機(jī)程序生成引擎140生成計算機(jī)程序時,由于對直接從數(shù)據(jù)源接收到的數(shù)據(jù)執(zhí)行聚合操作(例如,數(shù)據(jù)在聚合操作之前未受到任何操作),所以計算機(jī)程序生成引擎140可以將聚合操作識別為下推至數(shù)據(jù)源的候選。然后,計算機(jī)程序生成引擎140可以判斷管理數(shù)據(jù)源110、120的系統(tǒng)112、122中的任一個或全部兩者是否能夠執(zhí)行與聚合操作等同的操作。如果第一系統(tǒng)112能夠執(zhí)行與聚合操作等同的操作,則計算機(jī)程序生成引擎140將計算機(jī)程序108配置為向第一系統(tǒng)112發(fā)送指令114,從而指示第一系統(tǒng)112執(zhí)行與聚合操作等同的操作并將匯總數(shù)據(jù)返回給計算機(jī)程序。如果第二系統(tǒng)122能夠執(zhí)行與聚合操作等同的操作,則計算機(jī)程序生成引擎140將計算機(jī)程序108配置為向第二系統(tǒng)122發(fā)送指令124,從而指示第二系統(tǒng)122執(zhí)行與聚合操作等同的操作并將匯總數(shù)據(jù)返回給計算機(jī)程序。
在一些實現(xiàn)中,計算機(jī)程序108包括數(shù)據(jù)流圖142。數(shù)據(jù)流圖是包含表示要對輸入數(shù)據(jù)執(zhí)行的操作的組件以及組件間的表示數(shù)據(jù)流動的鏈接(有時稱為節(jié)點)的計算機(jī)程序。組件所表示的操作通過處理輸入數(shù)據(jù)來生成基于輸入數(shù)據(jù)的輸出數(shù)據(jù)。如果組件鏈接到其它組件,則該組件可以向該其它組件提供輸入數(shù)據(jù)并從該其它組件接收輸出數(shù)據(jù),其中,兩個組件之間的每個鏈接表示數(shù)據(jù)從一個組件向另一個組件的流動。圖的組件的子集(例如,圖的一個或多個組件)有時稱為圖的子圖。當(dāng)通過基于圖的處理系統(tǒng)來執(zhí)行數(shù)據(jù)流圖時,執(zhí)行各個組件(例如,執(zhí)行計算機(jī)程序或計算機(jī)程序的一部分)并且進(jìn)行該組件所表示的操作。在執(zhí)行期間,數(shù)據(jù)流圖接收處理后(例如,通過數(shù)據(jù)流圖的組件的操作而進(jìn)行操作)的輸入數(shù)據(jù)以生成輸出數(shù)據(jù)。在一些示例中,數(shù)據(jù)流圖的一些或所有組件各自與用于調(diào)用可執(zhí)行程序代碼的信息相關(guān)聯(lián),以執(zhí)行與該組件相關(guān)聯(lián)的操作。例如,組件可以與包含用于進(jìn)行與組件相關(guān)聯(lián)的操作(例如,處理和輸出數(shù)據(jù))的計算機(jī)可執(zhí)行指令的計算機(jī)可讀存儲器中所存儲的計算機(jī)程序的引用相關(guān)聯(lián)。在一些示例中,數(shù)據(jù)流圖的一些或所有組件各自與用于使數(shù)據(jù)可用于程序代碼的信息相關(guān)聯(lián)。例如,組件可以與可被調(diào)用以將數(shù)據(jù)遞送至與組件相關(guān)聯(lián)的可執(zhí)行程序的函數(shù)調(diào)用相關(guān)聯(lián),或者組件可以與可接收被遞送至與組件相關(guān)聯(lián)的可執(zhí)行程序的數(shù)據(jù)的網(wǎng)絡(luò)端口相關(guān)聯(lián),或者組件可以與用于將數(shù)據(jù)遞送至與組件相關(guān)聯(lián)的可執(zhí)行程序的另一種技術(shù)相關(guān)聯(lián)。以這種方式,每個組件可以接收、處理并輸出數(shù)據(jù)。
在通過引用而并入于此的標(biāo)題為“managingparametersforgraph-basedapplications”的美國公布2007/0011668中詳細(xì)描述了基于圖的系統(tǒng)的一個示例。在通過引用而并入于此的標(biāo)題為“executingcomputationsexpressedasgraphs”的美國專利5,966,072中描述了一種用于執(zhí)行基于圖的計算的系統(tǒng)。此外,數(shù)據(jù)流圖的組件可以替代查詢102的操作。在通過引用而并入于此的標(biāo)題為“managingdataqueries”的美國公布2011/0179014a1以及標(biāo)題為“managingdataqueries”的美國公布2012/0284255a1中進(jìn)一步描述了根據(jù)這種替代的技術(shù)。在一些實現(xiàn)中,數(shù)據(jù)流圖可以由查詢102產(chǎn)生。
在一些實現(xiàn)中,計算機(jī)程序108可以配置有參數(shù)。例如,參數(shù)可以是可被改變以改變程序行為的值。作為具體示例,參數(shù)可以是“filename”并且該參數(shù)的值可以是文件在文件系統(tǒng)中的位置。參數(shù)的值可以改變?yōu)椴煌募奈恢茫詫⒊绦蚺渲脼樵L問不同的文件。同一程序的兩個實例可以配置有不同的參數(shù)值,這將改變同一程序的兩個實例的行為。
執(zhí)行引擎150接收計算機(jī)程序108。然后,執(zhí)行引擎150執(zhí)行計算機(jī)程序108,例如進(jìn)行與計算機(jī)程序108相關(guān)聯(lián)的程序代碼所指定的指令。在被執(zhí)行時,計算機(jī)程序108生成指令114、124并將指令114、124發(fā)送至用于管理數(shù)據(jù)源110、120的系統(tǒng)112、122。
在一些實現(xiàn)中,例如,如果計算機(jī)程序108是數(shù)據(jù)流圖,則執(zhí)行引擎150包括專門的操作系統(tǒng),有時稱為圖操作系統(tǒng)。圖操作系統(tǒng)是能夠執(zhí)行數(shù)據(jù)流圖的各個組件背后的操作的計算機(jī)程序。例如,如果數(shù)據(jù)流圖的組件表示數(shù)據(jù)處理系統(tǒng)要進(jìn)行的操作,則圖操作系統(tǒng)的任務(wù)是指示數(shù)據(jù)處理系統(tǒng)進(jìn)行該操作。
在將指令114、124發(fā)送至用于管理數(shù)據(jù)源110、120的系統(tǒng)112、122之后,計算機(jī)程序108從數(shù)據(jù)源110、120接收匯總數(shù)據(jù)116、126。然后,執(zhí)行引擎150在執(zhí)行計算機(jī)程序108時使用匯總數(shù)據(jù)116、126來產(chǎn)生查詢102的結(jié)果104。以這種方式,數(shù)據(jù)處理系統(tǒng)100可以執(zhí)行查詢102以生成由該查詢指定的結(jié)果104。
圖3示出以sql編寫的查詢200以及表示該查詢的查詢計劃210的圖形表示。例如,查詢200可以是圖1和2所示的查詢102的示例,并且查詢計劃210可以是圖2所示的查詢計劃132的示例。查詢200用于計算在名為“波士頓(boston)”和“紐約(newyork)”的兩個數(shù)據(jù)源(例如,關(guān)系數(shù)據(jù)庫表)中所找到的名為“價格(price)”的列中的最大值。這兩個數(shù)據(jù)源由查詢200中的自變量202、204來識別。查詢200還要求執(zhí)行名為“groupbyhotel_chain”的操作,該操作根據(jù)輸出的列之一(此處為hotel_chain列)來對輸出的數(shù)據(jù)進(jìn)行分組。作為一個現(xiàn)實世界的例子,該查詢可以用于獲得波士頓酒店數(shù)據(jù)庫和紐約酒店數(shù)據(jù)庫這兩者中所記錄的酒店房間的最大(“max”)價格。當(dāng)執(zhí)行查詢時,聯(lián)合(例如,組合)來自這兩個數(shù)據(jù)源的數(shù)據(jù)并按照酒店連鎖對其進(jìn)行分組。然后,識別并返回每個酒店連鎖的酒店房間的最大價格。
查詢計劃210包括兩個數(shù)據(jù)源212、214的識別,其中兩個數(shù)據(jù)源212、214各自提供通過聯(lián)合類型操作216組合的數(shù)據(jù)。例如,聯(lián)合類型操作216可以與“聯(lián)合”或“聯(lián)合所有”等同,這例如取決于sql查詢200中所指定的操作。此處,在sql查詢200中指定“聯(lián)合”操作(例如,union命令)。
將聯(lián)合類型操作216的輸出提供給groupby操作217,該groupby操作217例如通過按hotel_chain列對數(shù)據(jù)進(jìn)行分組來處理數(shù)據(jù)。將處理后的數(shù)據(jù)傳遞給上卷操作218,該上卷操作218確定輸入數(shù)據(jù)的最大值。該最大值為查詢200的結(jié)果。
圖4示出查詢計劃210a的另一種版本。該版本的查詢計劃210a已被修改,例如,由圖2所示的計算機(jī)程序生成引擎140修改。(在一些示例中,在查詢計劃器130中執(zhí)行修改,然后將查詢計劃132提供給生成引擎140。)在該版本的查詢計劃210a中,上卷操作218a已被置于第一數(shù)據(jù)源212和聯(lián)合類型操作216之間,并且另一上卷操作218b已被置于第二數(shù)據(jù)源214和聯(lián)合類型操作216之間。查詢計劃210a的這種安排將產(chǎn)生與圖3所示的安排中的查詢計劃210相同的輸出。此外,如果數(shù)據(jù)源212、214中的任一數(shù)據(jù)源能夠進(jìn)行與上卷操作218a、218b等同的操作,則各自的上卷操作218a、218b可以被下推至相應(yīng)的數(shù)據(jù)源212、214。
該版本的查詢計劃210a在聯(lián)合類型操作之后包括附加的上卷操作219。因為上卷操作218a、218b各自表示“max”(最大值)操作,所以必須確定聯(lián)合類型操作輸出的最大值以識別由聯(lián)合類型操作所輸出的兩個值(例如,由上卷操作218a、218b返回的兩個值)之間的最大值。因此,上卷操作219對聯(lián)合類型操作216和groupby操作217的輸出進(jìn)行操作,正如上卷操作218對圖3所示的聯(lián)合類型操作216和groupby操作217的輸出進(jìn)行操作一樣。然而,圖4所示的該上卷操作219相對于圖3所示的該位置中的上卷操作218而言對非常少量的數(shù)據(jù)進(jìn)行操作。
圖4所示的查詢計劃210a可以基于聚合操作的性質(zhì)而生成。例如,以下是聚合操作的一些性質(zhì),包括min(最小數(shù)據(jù)值)、max(最大數(shù)據(jù)值)、sum(數(shù)據(jù)值的總和)、count(記錄數(shù))以及avg(數(shù)據(jù)值的平均)。這些性質(zhì)各自表示包含聚合操作的表達(dá)式以及包括按順序執(zhí)行的多個聚合操作的等同表達(dá)式。這些性質(zhì)中的一些包括分布性質(zhì)的應(yīng)用,其中在給定函數(shù)f的情況下,表達(dá)式f(x,y)與表達(dá)式f(f(x),f(y))等同。一般來說,聚合操作可被轉(zhuǎn)換為根據(jù)這些性質(zhì)的聚合操作序列,然后序列中的一些操作可被“下推”至用于管理數(shù)據(jù)源的系統(tǒng)。
性質(zhì)1:agg(xunionally)=agg(agg(x)unionallagg(y))[其中agg是min、max和sum之一]
性質(zhì)2:count(xunionally)=sum(count(x)unionallcount(y))
性質(zhì)3:avg(xunionally)=sum(xunionally)/count(xunionally)=sum(sum(x)unionallsum(y))/sum(count(x)unionallcount(y))
性質(zhì)4:agg(xuniony)=agg(agg(x)unionagg(y))[其中agg是min和max之一]
以下偽代碼表示用于修改查詢計劃從而下推一個或多個各自在聯(lián)合類型操作之后的聚合操作。
圖5示出根據(jù)查詢計劃210a生成的計算機(jī)程序300。該計算機(jī)程序300可以是圖1和2所示的計算機(jī)程序108的示例。該計算機(jī)程序300是包含通過表示數(shù)據(jù)流的鏈接所連接的組件的數(shù)據(jù)流圖,并且也可以是如圖2所示的數(shù)據(jù)流圖132的示例。
計算機(jī)程序300具有表示可執(zhí)行代碼(例如,一個或多個可執(zhí)行操作)的組件。計算機(jī)程序300具有表示第一數(shù)據(jù)源212的輸出數(shù)據(jù)的組件302和表示第二數(shù)據(jù)源214的輸出數(shù)據(jù)的組件304。兩個組件302、304鏈接到表示聯(lián)合類型操作216的組件306。在一些實現(xiàn)中,組件306可以是多個組件的組合,例如子圖。該組件306鏈接到共同表示上卷操作219和groupby操作217的組件308。當(dāng)計算機(jī)程序300執(zhí)行時,計算機(jī)程序300的輸出與執(zhí)行圖3所示的以sql編寫的查詢200的系統(tǒng)的輸出等同。
表示數(shù)據(jù)源的輸出數(shù)據(jù)的組件302、304各自已被配置為向相應(yīng)數(shù)據(jù)源發(fā)送指令。例如,表示波士頓數(shù)據(jù)源212的輸出數(shù)據(jù)的組件302已經(jīng)配置有指令,這些指令在被發(fā)送至管理波士頓數(shù)據(jù)源212的系統(tǒng)(例如,管理存儲在波士頓數(shù)據(jù)源212中的數(shù)據(jù)集的系統(tǒng))時執(zhí)行與由圖4所示的上卷操作218a所表示的匯總操作等同的操作。在計算機(jī)程序300接收到任何數(shù)據(jù)之前進(jìn)行該操作。在一些實現(xiàn)中,組件302可以將sql查詢發(fā)送至管理波士頓數(shù)據(jù)源212的系統(tǒng)。此處,sql查詢可以指定存儲在波士頓數(shù)據(jù)源212處的數(shù)據(jù)庫表的“價格”列的最大值。指令可以是sql語句,例如“selectmax(price),hotel_chainfrombostongroupbyhotel_chain”。以這種方式,上卷操作218a已被下推至波士頓數(shù)據(jù)源212。
在該示例中,聚合操作已被下推至波士頓數(shù)據(jù)源212和紐約數(shù)據(jù)源214這兩者。因此,管理波士頓數(shù)據(jù)源212和紐約數(shù)據(jù)源214的系統(tǒng)已被判斷為能夠執(zhí)行與聚合操作等同的操作。在一些實現(xiàn)中,這種判斷是由圖2所示的計算機(jī)程序生成引擎140進(jìn)行的,并且計算機(jī)程序生成引擎140在生成計算機(jī)程序300時使用這種判斷。在一些實現(xiàn)中,這種判斷是由圖2所示的查詢計劃器130進(jìn)行的,并且通過查詢計劃器130來修改查詢計劃132以包含聚合操作的下推。在這些實現(xiàn)中,計算機(jī)程序生成引擎140可以根據(jù)查詢計劃132來生成計算機(jī)程序300,并且不需要評價用于管理查詢計劃132中所識別的數(shù)據(jù)源的系統(tǒng)的能力。
在一些示例中,數(shù)據(jù)源至少之一可能無法執(zhí)行與聚合操作等同的操作。圖6示出根據(jù)查詢計劃210a所生成的計算機(jī)程序300a的示例。在該示例中,管理波士頓數(shù)據(jù)源212的系統(tǒng)已被判斷為能夠執(zhí)行與聚合操作等同的操作。然而,管理紐約數(shù)據(jù)源214的系統(tǒng)已被判斷為無法執(zhí)行與聚合操作等同的操作。因此,在該計算機(jī)程序300a中,表示紐約數(shù)據(jù)源214的輸出的組件304鏈接到上卷組件305,該上卷組件305鏈接到表示聯(lián)合類型操作的組件306。此處,因為max操作不能被下推至紐約數(shù)據(jù)源214,所以作為替代地在上卷組件305處執(zhí)行該操作。表示波士頓數(shù)據(jù)源214的輸出的組件302被配置為向波士頓數(shù)據(jù)源214發(fā)送指令以根據(jù)查詢計劃210來進(jìn)行與聚合操作218a等同的操作,因此表示波士頓數(shù)據(jù)源214的輸出的組件302鏈接到表示聯(lián)合類型操作的組件306。以這種方式,聚合操作也可被下推至一些數(shù)據(jù)源,即使其它數(shù)據(jù)源不支持該操作。
圖7示出表示用于基于sql查詢來生成計算機(jī)程序的過程400的流程圖。過程400可例如通過圖1所示的數(shù)據(jù)處理系統(tǒng)100的組件來進(jìn)行。
該過程接收(402)sql查詢。例如,sql查詢可以是圖1所示的查詢102的示例。在一些示例中,sql查詢包括對數(shù)據(jù)處理系統(tǒng)外部的一個或多個數(shù)據(jù)集的引用。例如,查詢可以具有對存儲在第一數(shù)據(jù)源處的第一數(shù)據(jù)集的引用以及對存儲在與第一數(shù)據(jù)源不同的第二數(shù)據(jù)源處的第二數(shù)據(jù)集的引用。例如,數(shù)據(jù)源可以是(例如,存儲關(guān)系數(shù)據(jù)庫表的)關(guān)系數(shù)據(jù)庫、可在數(shù)據(jù)存儲器上訪問的平面文件、可經(jīng)由網(wǎng)絡(luò)訪問的數(shù)據(jù)流、hdfs(hadoop分布式文件系統(tǒng))文件、或其它種類的數(shù)據(jù)源。圖1所示的數(shù)據(jù)源110、120是數(shù)據(jù)源的示例,并且數(shù)據(jù)集可以是存儲在數(shù)據(jù)源110、120處的數(shù)據(jù)。引用的示例是圖3所示的自變量202、204。
過程確定(404)sql查詢包括兩個或更多個命令,所述命令包括第一聯(lián)合類型操作和第一聚合操作。在一些實現(xiàn)中,對基于從第一數(shù)據(jù)源所接收到的數(shù)據(jù)的第一部分?jǐn)?shù)據(jù)應(yīng)用聯(lián)合類型操作,并且還對基于從第二數(shù)據(jù)源所接收到的數(shù)據(jù)的第二部分?jǐn)?shù)據(jù)應(yīng)用聯(lián)合類型操作。sql查詢的示例是圖3所示的sql查詢200。在一些實現(xiàn)中,基于根據(jù)sql查詢所生成的查詢計劃,sql查詢被判斷為包括聯(lián)合類型操作和第一聚合操作。
過程確定(406)sql查詢描述出應(yīng)當(dāng)至少對來自第一數(shù)據(jù)集的一部分?jǐn)?shù)據(jù)應(yīng)用第一聯(lián)合類型操作,并且應(yīng)當(dāng)至少對來自第二數(shù)據(jù)集的一部分?jǐn)?shù)據(jù)應(yīng)用第一聯(lián)合類型操作。例如,處理可以解析sql查詢以識別聯(lián)合類型操作(例如,unoin或unionall)并識別與一部分?jǐn)?shù)據(jù)相對應(yīng)的自變量(例如,指定包含一部分?jǐn)?shù)據(jù)的數(shù)據(jù)源的自變量)。
過程確定(408)sql查詢描述出應(yīng)當(dāng)對由第一聯(lián)合類型操作產(chǎn)生的數(shù)據(jù)應(yīng)用第一聚合操作。例如,過程可以解析sql查詢以識別第一聚合操作,并且例如聯(lián)合類型操作被提供為第一聚合操作的自變量。
在一些實現(xiàn)中,過程基于第一聚合操作來確定第二聚合操作。例如,過程可以確定在被執(zhí)行時產(chǎn)生與第一聚合操作的輸出等同的輸出的操作序列,并且從所述操作序列中選擇第二聚合操作。作為一個示例,第一聚合操作可以是最小值、最大值、求和或計數(shù)操作,并且第二聚合操作可以是與第一聚合操作相同類型的聚合操作。作為另一示例,第一聚合操作可以是平均操作,并且第二聚合操作可以是求和操作或計數(shù)操作。在這些示例中,根據(jù)上述性質(zhì)1-4之一來選擇第二聚合操作。
在一些實現(xiàn)中,過程確定第二聚合操作可以由管理第一數(shù)據(jù)源的系統(tǒng)執(zhí)行。例如,如果管理數(shù)據(jù)源的系統(tǒng)是可以執(zhí)行sql語句的rdbms,則系統(tǒng)可以在聚合操作被表示為sql語句的一部分時執(zhí)行該操作。圖1中示出rdbms112、122的示例。
過程基于sql查詢來生成(410)計算機(jī)程序。在一些實現(xiàn)中,計算機(jī)程序由第一系統(tǒng)(例如,圖1所示的數(shù)據(jù)處理系統(tǒng)100)生成。程序的執(zhí)行可以與以下圖8所示的過程500相對應(yīng)。在一些實現(xiàn)中,這包括基于sql查詢來生成查詢計劃;向查詢計劃添加向來自第一數(shù)據(jù)源的數(shù)據(jù)應(yīng)用的第二聚合操作;確定與第一數(shù)據(jù)源相關(guān)聯(lián)的第一系統(tǒng)包括用于進(jìn)行第二聚合操作的功能;向表示第一數(shù)據(jù)源的一部分查詢計劃附加用以進(jìn)行第二聚合操作的指令;以及基于查詢計劃來生成計算機(jī)程序。然后可以執(zhí)行程序。
在一些實現(xiàn)中,過程400中所生成(410)的計算機(jī)程序包括表示sql查詢的聯(lián)合類型操作的第一組件。向第一部分?jǐn)?shù)據(jù)的匯總和第二部分?jǐn)?shù)據(jù)的匯總應(yīng)用第一組件,其中這些匯總各自包含比其各自相應(yīng)部分的數(shù)據(jù)更少的記錄。計算機(jī)程序還可以包括表示第一數(shù)據(jù)源的第二組件,其中第二組件在被執(zhí)行時致使指令被發(fā)送以供第一系統(tǒng)執(zhí)行。指令可以包括sql語句,該sql語句包括與第二聚合操作相對應(yīng)的命令。此外,在第一系統(tǒng)使數(shù)據(jù)被發(fā)送至執(zhí)行計算機(jī)程序的系統(tǒng)之前,執(zhí)行指令。
在該示例中,第二組件的輸出可以包括來自第一數(shù)據(jù)源的第一部分?jǐn)?shù)據(jù)的匯總。計算機(jī)程序還可以包括表示第二數(shù)據(jù)源的第三組件和表示第三聚合操作的第四組件,其中,第三組件的輸出流向第四組件,并且第四組件的輸出流向第一組件。例如,第三聚合操作可以由圖6所示的組件305表示。此外,第一組件的輸出可以流向例如由圖6所示的組件308表示的另一聚合操作。
在一些實現(xiàn)中,計算機(jī)程序還發(fā)送引導(dǎo)第三系統(tǒng)對來自第二數(shù)據(jù)集的一部分?jǐn)?shù)據(jù)執(zhí)行第二聚合操作的指令,并從第三系統(tǒng)接收作為第二部分?jǐn)?shù)據(jù)的匯總的特定數(shù)據(jù)集。這可以例如發(fā)生在判斷為管理第二數(shù)據(jù)源的系統(tǒng)可以執(zhí)行第二聚合操作時。
圖8示出表示用于執(zhí)行與執(zhí)行sql查詢有關(guān)的操作的過程500的流程圖。過程500可例如由第一系統(tǒng)(諸如圖1所示的數(shù)據(jù)處理系統(tǒng)的組件等)進(jìn)行。例如,當(dāng)圖2所示的執(zhí)行引擎150執(zhí)行由sql查詢所生成的至少一部分計算機(jī)程序時,過程500可以由該執(zhí)行引擎150進(jìn)行。該計算機(jī)程序可以是圖1-2所示的計算機(jī)程序108以及圖7中所生成(410)的計算機(jī)程序。此外,sql查詢可以是圖1和2所示的查詢102。
過程發(fā)送(502)引導(dǎo)第二系統(tǒng)對來自第一數(shù)據(jù)集的一部分?jǐn)?shù)據(jù)執(zhí)行第二聚合操作的指令。例如,第二系統(tǒng)可以是圖1所示的系統(tǒng)112、122之一。指令可以采用sql語句的形式。例如,指令可以是圖1所示的指令114、124。
過程從第二系統(tǒng)接收504作為第一部分?jǐn)?shù)據(jù)的匯總的特定數(shù)據(jù)集。例如,第一部分?jǐn)?shù)據(jù)可以是由此生成計算機(jī)程序的sql查詢中引用的一部分?jǐn)?shù)據(jù)。
過程對特定數(shù)據(jù)集和來自第二數(shù)據(jù)集的一部分?jǐn)?shù)據(jù)的匯總執(zhí)行(506)第二聯(lián)合類型操作。例如,第二部分?jǐn)?shù)據(jù)可以是由此生成計算機(jī)程序的sql查詢中引用的另一部分?jǐn)?shù)據(jù)。在一些實現(xiàn)中,第二聯(lián)合類型操作與第二聯(lián)合類型操作具有相同的類型。如上所述,一種類型的聯(lián)合類型操作是“聯(lián)合”,且另一種類型的聯(lián)合類型操作是“聯(lián)合所有”。例如,如果第一聯(lián)合類型操作是“聯(lián)合所有”操作且第二聯(lián)合類型操作也是“聯(lián)合所有”操作,則這兩個操作具有相同類型。
以這種方式,計算機(jī)程序產(chǎn)生與sql查詢的輸出等同的輸出,例如如同sql查詢由關(guān)系數(shù)據(jù)庫系統(tǒng)或評價(例如,執(zhí)行)sql查詢的其它系統(tǒng)進(jìn)行處理一樣。然而,因為操作被“下推”至數(shù)據(jù)源,所以計算機(jī)程序可以比由計算機(jī)程序本身進(jìn)行操作時更有效地操作。
圖2所示的查詢計劃器130、生成引擎140和/或執(zhí)行引擎150可例如在合適的操作系統(tǒng)(諸如unix操作系統(tǒng)版本等)的控制下托管在一個或多個通用計算機(jī)上。例如,這可以包括多節(jié)點并行計算環(huán)境,其包括使用本地的(例如,多處理器系統(tǒng),諸如對稱多處理(smp)計算機(jī)等)、或本地分布的(例如,耦合為集群或大規(guī)模并行處理(mpp)系統(tǒng)的多個處理器)、或遠(yuǎn)程的、或遠(yuǎn)程分布的(例如,經(jīng)由局域網(wǎng)(lan)和/或廣域網(wǎng)(wan)而耦合的多個處理器)或其任何組合的多個中央處理單元(cpu)或處理器核的計算機(jī)系統(tǒng)的配置。
圖5和6所示的計算機(jī)程序300、300a可以顯示在開發(fā)環(huán)境中。在一些實現(xiàn)中,開發(fā)環(huán)境是用于開發(fā)按照數(shù)據(jù)流圖的應(yīng)用的系統(tǒng)。根據(jù)本系統(tǒng)制作的數(shù)據(jù)流圖提供了用于將信息輸入至圖組件所表示的各個處理中并從中輸出信息、用于使信息在處理之間移動以及用于定義處理的運行順序的方法。該系統(tǒng)包括從任何可用方法中選擇處理間通信方法(例如,根據(jù)圖鏈接的通信路徑可以使用tcp/ip或unix域套接字或者使用共享內(nèi)存來在處理間傳遞數(shù)據(jù))的算法。
上述的技術(shù)可以使用執(zhí)行合適軟件的計算系統(tǒng)來實現(xiàn)。例如,該軟件可以包括在一個或多個編程或可編程計算系統(tǒng)(可以具有諸如分布式、客戶端/服務(wù)器或網(wǎng)格式等的各種架構(gòu))上執(zhí)行的一個或多個計算機(jī)程序中的過程,其中該一個或多個編程或可編程計算系統(tǒng)各自包括至少一個處理器、至少一個數(shù)據(jù)存儲系統(tǒng)(包括易失性和/或非易失性存儲器和/或存儲元件)、至少一個用戶接口(用于使用至少一個輸入裝置或端口來接收輸入,并且用于使用至少一個輸出裝置或端口來提供輸出)。該軟件可以包括例如提供與數(shù)據(jù)流圖的設(shè)計、配置和執(zhí)行有關(guān)的服務(wù)的較大程序的一個或多個模塊??梢詫⒊绦虻哪K(例如,數(shù)據(jù)流圖的元素)實現(xiàn)為數(shù)據(jù)結(jié)構(gòu)或符合數(shù)據(jù)存儲庫中所存儲的數(shù)據(jù)模型的其它有組織數(shù)據(jù)。
可以將軟件設(shè)置在諸如(利用通用或?qū)S每删幊逃嬎銠C(jī)可讀取的)cd-rom或其它計算機(jī)可讀介質(zhì)等的有形、非暫時性介質(zhì)上、或者經(jīng)由網(wǎng)絡(luò)的通信介質(zhì)(例如,以編碼在傳播信號中的形式)傳遞至執(zhí)行該軟件的計算系統(tǒng)的有形、非暫時性介質(zhì)。可以在專用計算機(jī)上、或者使用諸如協(xié)處理器或現(xiàn)場可編程門陣列(fpga)或?qū)S锰囟ㄓ猛炯呻娐?asic)等的專用硬件來進(jìn)行一些處理或所有功能??梢砸岳貌煌挠嬎阍磉M(jìn)行軟件所指定的計算的不同部分的分布式方式來實現(xiàn)該處理。優(yōu)選將每一個這種計算機(jī)程序存儲在通用或?qū)S每删幊逃嬎銠C(jī)可讀取的存儲裝置的計算機(jī)可讀存儲介質(zhì)(例如,固態(tài)存儲器或介質(zhì)、或者磁性或光學(xué)介質(zhì))上或者下載至該存儲介質(zhì),以在利用計算機(jī)讀取存儲裝置介質(zhì)以進(jìn)行這里所述的處理的情況下配置計算機(jī)并使該計算機(jī)進(jìn)行工作。本發(fā)明的系統(tǒng)還可被視為作為配置有計算機(jī)程序的有形、非暫時性介質(zhì)來實現(xiàn),其中如此配置成的介質(zhì)使計算機(jī)以特定的預(yù)定義方式進(jìn)行工作,以進(jìn)行這里所述的處理步驟中的一個或多個。
已經(jīng)描述了本發(fā)明的許多實施例。然而,應(yīng)當(dāng)理解,前述描述旨在示出而不是限制本發(fā)明的范圍,該范圍由所附權(quán)利要求書的范圍限定。因此,其它實施例也在所附權(quán)利要求書的范圍內(nèi)。例如,可以在不偏離本發(fā)明的范圍的情況下作出各種修改。另外,上述步驟中的一些可以是與順序無關(guān)的,因此可以按照與所描述的順序不同的順序執(zhí)行。