專利名稱::在關(guān)系數(shù)據(jù)庫系統(tǒng)中用于使數(shù)據(jù)稠密的dml語句的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及數(shù)據(jù)操作。更特別地,本發(fā)明涉及用于使相對于一維或多維的一組數(shù)據(jù)稠密的技術(shù)。
背景技術(shù):
:術(shù)語“維”指的是一組相關(guān)的不同值。例如,TIMES維可以包括從1998年1月到2003年12月的所有日期。相似地,PRODUCTS維可以包括代表公司的所有可能的產(chǎn)品的值。如果集合中的每一數(shù)據(jù)項都與特定維的值相關(guān)聯(lián),則該數(shù)據(jù)項集合是“維的”。例如,假設表的每一行都包括關(guān)于特定事件的數(shù)據(jù),包括該事件的日期。在該實例中,“事件數(shù)據(jù)”是關(guān)于TIMES維的“維”。如果數(shù)據(jù)項集合是關(guān)于多于一維的維,則該數(shù)據(jù)項集合是“多維的”。例如,假設SALES表的每一行都包括用于特定銷售的數(shù)據(jù),包括(1)銷售的日期,(2)所售的產(chǎn)品,以及(3)銷售發(fā)生的區(qū)域。在該實例中,“銷售數(shù)據(jù)”是多維的,因為銷售數(shù)據(jù)關(guān)于TIMES維、PRODUCTS維、和REGION維的維。存儲多維數(shù)據(jù)的表通常被稱作“事實表(facttable)”。存儲特定維的維值的表被稱作“維表”。因此,具有上述的SALES表的相同數(shù)據(jù)庫通常還包括TIMES表、PRODUCTS表、和REGION表。事實表的每一行都將對應于包括每一維的一個值的維值組合。例如,在上述的SALES表中,每一行通常對應于TIMES維值、PRODUCTS維值、和REGION維值的組合。與給定的SALES表格行相關(guān)的維值的集合可以被表示為(t,p,r),其中t是TIMES維的值,p是PRODUCTS維的值,以及r是REGION維的值。通常,并不是所有的維值的組合在事實表中具有對應行。因此,與事實表中的行相關(guān)的維值組合的集合是每一維的維值的叉積的子集。如果事實表包含用于該事實表中的其它維值的任何給定組合的所有可能的維‘D’的值,則該事實表被稱作沿維‘D’是“稠密”的。例如,假設REGION維僅有三個可能的值RGN1、RGN2、和RGN3。如果對于SALES表中反映的每一組合(t,p),SALES表包括用于維值組合(t,p,RGN1)、(t,p,RGN2)和(t,p,RGN3)的行,那么SALES表相對于REGION維是稠密的。“稠化(densification)”是使數(shù)據(jù)集合沿所關(guān)注的維比其最初更加稠密的過程。行集合可以被稠化,例如通過為缺少的維值組合創(chuàng)建虛行。密度已被增加的數(shù)據(jù)被稱作已被“稠化”,并且關(guān)于數(shù)據(jù)的密度已被增加或正被增加的維被稱作“稠密”維。稠化可用于多種情形。例如,一些多維數(shù)據(jù)庫系統(tǒng)中的查詢(例如,聯(lián)機分析處理(OLAP))要求沿時間維使數(shù)據(jù)稠密。一些用戶,諸如OLAP用戶也習慣于觀看稠密格式的數(shù)據(jù),特別是當窗口函數(shù)被計算和提交時。例如,如果特定的一天沒有銷售,一些用戶仍然想要觀看顯示銷售的累計、日期、以及銷售列中的空白區(qū)(因為累計是OLAP中的窗口函數(shù),其通常顯示稠化的數(shù)據(jù))的屏幕。使用結(jié)構(gòu)化查詢語言(SQL),稠化可以通過一系列的操作來實施,該操作包括DISTINCT、CROSSJOIN(交叉連接)、和OUTERJOIN(外連接)操作。作為實例,假設有包括下面表的數(shù)據(jù)庫模式SALES(time_id,prod_id,amount_sold)TIMES(time_id,calendar_month_desc,calendar_quarter_desc,Calendar_year)PRODUCTS(prod_id,prod_subcategory,prod_category)在上面的一組表中,SALES事實表存儲一個指標(銷售量),該指標是關(guān)于TIMES維和PRODUCTS維的維。對于SALES表中的每一行,“time_id,”列存儲用于該行的時間維值,以及“product_id,”列存儲用于該行的PRODUCTS維值。因此,對于SALES事實表中包括的產(chǎn)品值和時間值的給定組合,amount_sold列存儲指標值“amountsold”。TIMES維表存儲所有的time_id值以及關(guān)于對應于每個time_id值的時間的細節(jié)。相似地,PRODUCTS維表存儲所有的product_id值以及關(guān)于對應于每個product_id值的產(chǎn)品的細節(jié)。假設,SALES中的數(shù)據(jù)沿TIMES維是稀疏的。將沿TIMES維使SALES數(shù)據(jù)稠密的查詢Q1是Q1SELECTV2.prod_id,V2.time_id,V1.amount_soldFROMSALESV1RIGHTOUTERJOIN((SELECTDISTINCTprod_idFROMSALES)CROSSJOIN(SELECTtime_idFROMTIMES))V2ON(V1.prod_id=V2.prod_idANDV1.time_id=V2.time_id);在Q1中,V2包括(1)實際上在SALES表中的prod_id值,以及(2)TIMES表中的所有time_id值的所有組合。特別地,“SELECTDISTINCTprod_idFROMSALES”子句查找在SALES表中找到的所有prod_id的唯一值。相似地,“SELECTtime_idFROMTIMES”子句查找TIMES表中的所有time_id的值?!癈ROSSJOIN”結(jié)構(gòu)使所找到的唯一prod_ids和所有的time_ids進行叉積。V1(SALES表)和V2之間的RIGHTOUTERJOIN操作生成結(jié)果集合,該結(jié)果集合包括(1)SALES表中的所有行,以及(2)來自V2并且在SALES表中未找到的對應于time_id和prod_id組合的空行。圖1是在Q1中使用的示出用于執(zhí)行稠化的方法100的流程圖。在步驟102,執(zhí)行排序來獲得SALES表中的prod_id的所有DISTINCT值。在步驟104,執(zhí)行TIMES表中的所有prod_id值和time_id值的CROSSJOIN,從而獲得在TIME維是稠密的但僅僅包括在SALES表中找到的那些prod_id值的(prod_id,time_id)維值組合的集合。在步驟106,具有步驟104的CROSSJOIN的結(jié)果的SALES事實表的OUTERJOIN被執(zhí)行,從而將空白行添加到用于在原始的SALES表中未找到的CROSSJOIN的任何(prod_id,time_id)維值組合的SALES表。作為使用相同事實表和維表的另一實例,假設用戶對每天每一產(chǎn)品的年-到-日(YTD)銷售的累計感興趣。假設數(shù)據(jù)是稀疏的,用SQL表達的產(chǎn)生YTD銷售數(shù)據(jù)的查詢Q2是Q2SELECTV2.prod_id,V2.time_id,SUM(sales)OVER(PARTITIONBYV2.prod_id,V2.yearORDERBYV2.time_id)YTD_salesFROMSALESV1RIGHTOUTERJOIN((SELECTDISTINCTprod_idFROMSALES)CROSSJOIN(SELECTtime_id,calendar_yearyearFROMTIMES))V2ON(V1.prod_id=V2.prod_idANDV1.time_id=V2.time_id);在Q2中,“FROMSALES...”語句與Q1相同,并且使得相同的操作順序發(fā)生。“SELECTV2.prod_id...”語句計算銷售值的總數(shù)。該總數(shù)在YTD_sales變量中被返回。所返回的數(shù)據(jù)根據(jù)產(chǎn)品和年份被標準的SQLPARTITIONBY結(jié)構(gòu)分區(qū),然后被ORDERBY結(jié)構(gòu)按time_id排序。類似于實例Q1,計算年-到-日的銷售要求用于排序以得到SALES表中的所有prod_id的DISTINCT值,(2)所有prod_id值與TIMES表中的time_id值的交叉連接(crossjoin),(3)具有(2)中CROSSJOIN結(jié)果的SALES表的OUTERJOIN。另外,該查詢在列(prod_id,year,time_id)上執(zhí)行在(3)產(chǎn)生的OUTERJOIN結(jié)果的排序,以計算與YTD相關(guān)聯(lián)的窗口函數(shù)。本發(fā)明人已認識到步驟102(或步驟(1))的排序是額外的計算,不是最終的結(jié)果所必需的,但在現(xiàn)有技術(shù)中不可避免。另外,本發(fā)明人已認識到Q1不是直觀的。特別是對于更復雜的稠化查詢,可能通過檢查語句來破譯用戶的意圖是非常困難的,這是因為用于執(zhí)行稠化的操作序列的非直觀性質(zhì)。因此,在查詢內(nèi)執(zhí)行稠化的當前方法的結(jié)構(gòu)復雜、難以理解并且計算效率低。通過實例來描述本發(fā)明,但是不局限于此,在附圖中相同的附圖標號表示相似的元件,其中圖1是示出用于執(zhí)行稠化的方法100的流程圖。圖2A是分區(qū)表的語法的框圖。圖2B是圖2C的外連接類型的語法的框圖。圖2C是根據(jù)本發(fā)明的實施例的使用圖2A的分區(qū)表的擴展JOIN語法的框圖。圖3是示出用于實施圖2C的PARTITIONEDOUTERJOIN(分區(qū)外連接)的方法的實例的流程圖。圖4是示出用于實施圖2C的PARTITIONEDOUTERJOIN的方法的另一實例的流程圖。圖5是示出用于實施圖2C的PARTITIONEDOUTERJOIN的方法的另一實例的流程圖。圖6是優(yōu)化程序的操作方法的流程圖,該優(yōu)化程序可能被包括在能夠運行圖2C的PARTITIONEDOUTERJOIN的關(guān)系數(shù)據(jù)庫管理系統(tǒng)中。圖7是示出可以在其上實施本發(fā)明的實施例的計算機系統(tǒng)700的框圖。具體實施例方式描述了一種提供用于使數(shù)據(jù)稠密的DML語句的方法和裝置。在下面的描述中,為了解釋的目的,描述了多個特定的細節(jié),以提供對本發(fā)明的透徹了解。然而,很顯然,在沒有這些特定細節(jié)的情況下,也可以實現(xiàn)本發(fā)明。在其它的實例中,以框圖形式示出已知的結(jié)構(gòu)和設備,以避免不必要地使本發(fā)明不清楚。本方法和裝置提供了多個特征,每一特征可以彼此獨立地使用或同其它特征的任意組合一起使用。雖然提供用于使數(shù)據(jù)稠密的DML語句的本裝置和方法的許多特征由上面解釋的問題引起,但是任何單獨的特征可能不能解決上面討論的任何問題或者可能僅僅解決上面討論的問題之一。上面討論的一些問題可能不能完全由儲存和組織與事實表相關(guān)的數(shù)據(jù)的該方法的任何特征解決。雖然提供有標題,與特定標題有關(guān),但是在具有該標題的章節(jié)中未發(fā)現(xiàn)的信息,也可能在本說明書中的別處找到。功能概述在此描述了用于使數(shù)據(jù)稠密而不必執(zhí)行DISTINCT、CROSSJOIN、和OUTERJOIN操作的組合的技術(shù)。例如,本發(fā)明的實施例使數(shù)據(jù)稠密而不執(zhí)行DISTINCT操作。特別地,使數(shù)據(jù)稠密而不執(zhí)行排序操作以找到其中數(shù)據(jù)未被稠密的維的不同的值。根據(jù)本發(fā)明的一個實施例,由數(shù)據(jù)庫服務器支持的數(shù)據(jù)庫語言被擴展以支持可以被用于至少與其它結(jié)構(gòu)結(jié)合引起稠化操作的DML語句中的結(jié)構(gòu)。例如,DML語句的新結(jié)構(gòu)被提供用于分區(qū)數(shù)據(jù)集合,該數(shù)據(jù)集合被用于與另一結(jié)構(gòu)相關(guān)聯(lián)的操作以使數(shù)據(jù)稠密。特別地,在實施例中,OUTERJOIN語句的語法和語義被擴展以包括分區(qū)結(jié)構(gòu)。具有分區(qū)結(jié)構(gòu)的OUTERJOIN將被稱作PARTITIONEDOUTERJOIN。PARTITIONEDOUTERJOIN返回相對于指定的維分區(qū)的數(shù)據(jù),并且每一分區(qū)被外連接到另一組值。如果分區(qū)被外連接到維值的稠密集合,則可以形成稠密表。類似地,如果分區(qū)被外連接到比原始表中的維值的對應組更稠密的維值組的一組值,則所產(chǎn)生的表可以比原始的組更稠密。在下面描述的示例性的實施例中,用于分區(qū)數(shù)據(jù)的結(jié)構(gòu)用于對OUTERJOIN中包含的數(shù)據(jù)執(zhí)行操作以相對于維使數(shù)據(jù)稠密。雖然在這些實例中分區(qū)結(jié)構(gòu)將稠化作為OUTERJOIN的一部分來執(zhí)行,但是該說明書不局限于其中稠化經(jīng)由分區(qū)結(jié)構(gòu)或OUTERJOIN被執(zhí)行的實施例。用于在窗口函數(shù)和電子數(shù)據(jù)表函數(shù)外部的DML語句中分區(qū)數(shù)據(jù)的結(jié)構(gòu)以及用于數(shù)據(jù)的稠化的結(jié)構(gòu)獨立地對本技術(shù)起作用。用于使數(shù)據(jù)稠密的不同結(jié)構(gòu)可以被使用,該結(jié)構(gòu)不必包括OUTERJOIN語句。正被稠化的原始數(shù)據(jù)集合可以是表,該表可以被稱作目標表。目標表可以是事實表或任何其它類型的表。例如,目標表可以是由數(shù)據(jù)庫表達式形成的虛表。PARTITIONED_TABLE引用數(shù)據(jù)庫服務器被設計成執(zhí)行符合它們支持的數(shù)據(jù)庫語言的數(shù)據(jù)庫語句。SQL是許多數(shù)據(jù)庫服務器支持的數(shù)據(jù)庫語言。數(shù)據(jù)庫語言通常包括(1)用于識別操作的結(jié)構(gòu),以及(2)用于識別對其執(zhí)行操作的數(shù)據(jù)的結(jié)構(gòu)。由于許多數(shù)據(jù)庫操作被設計為在表上執(zhí)行,因此數(shù)據(jù)庫語句通常包括指定在其上執(zhí)行操作的表的表標識符。當描述數(shù)據(jù)庫語言的語法時,這種表標識符由標簽table_reference來表示。圖2A是分區(qū)表220的語法的框圖。分區(qū)表210包括表引用221、逗號224以及表達式210,這些將在下面的討論中提到。根據(jù)一個實施例,數(shù)據(jù)庫服務器的查詢執(zhí)行引擎被擴展以支持以下數(shù)據(jù)庫語句該數(shù)據(jù)庫語句在其中語言以前僅僅支持table_reference的一個或多個環(huán)境中具有partitioned_table引用(分區(qū)表220)。根據(jù)一個實施例,partition_table引用的元語法(metasyntax)在圖2A中示出,并以Backus-Naur格式(BNF)定義如下partitioned_table=table_referencePARTITIONBY(expr[,expr]...)參照圖2A,在分區(qū)表220的語法中,表引用221被放置于關(guān)鍵字“PARTITIONBY”的左邊。表引用221可以是任何表。類似地,在關(guān)鍵字“PARTITIONBY”的右邊是表達式222,它可以指列或?qū)α星笾档谋磉_式,諸如Col1+Col2,其中Col1和Col2指的是列。在“PARTITIONBY”關(guān)鍵字之后,可以有一個表達式222,或可以有任何數(shù)量的諸如表達式222的表達式,其中,每一表達式由諸如逗號224的逗號與相鄰的表達式分開。例如,對于具有對應于銷售區(qū)域(regn_id)、銷售時間(time_id)、供應所售的產(chǎn)品的倉庫(warehouse_id)、以及交付所售的產(chǎn)品的公司(deliv_id)的維的SALES表??赡躻arehouse_id和deliv_id的乘積可以被用于唯一地識別所有的產(chǎn)品,以及數(shù)據(jù)庫使用prod_id=warehouse_id*deliv_id來識別產(chǎn)品。分區(qū)表220可以是SALESPARTITIONBY(warehouse_id*deliv_id,time_id)。諸如分區(qū)表220的Partitioned_table引用可以用于以前要求表引用的多種環(huán)境。在實施例中,PARTITIONEDOUTERJOIN的語法類似于標準OUTERJOIN的語法,除了無論在何種情況下在標準OUTERJOIN中調(diào)用table_reference的情況,PARTITIONEDOUTERJOIN接受partitioned_table或table_reference?!癙ARTITIONBY”子句如圖2A所描述的,partitioned_table引用包括table_reference和PARTITIONBY子句。由位于PARTITIONBY子句之前的table_reference所指定的表在此將被稱作PARTITIONBY子句的“目標表”。目標表可以是事實表或任何其它類型的表。PARTITIONBY子句中的表達式和列分別被稱作分區(qū)表達式和列。在執(zhí)行包括PARTITIONBY子句的語句的過程中,數(shù)據(jù)庫服務器將由表引用221指定的目標表分成分區(qū),其中,每一分區(qū)對應于由表達式222產(chǎn)生的列的維值。例如,如果目標表是SALES事實表,以及表達式是對應于PRODUCT維的列,那么SALES表按prod_id分區(qū)。如果有三個prod_id,即P1、P2、和P3,那么分區(qū)產(chǎn)品表的第一分區(qū)將是那些具有prod_idP1的行,第二分區(qū)是那些具有prod_idP2的行,以及第三分區(qū)是那些具有prod_idP3的行。類似地,使用逗號224,如果對于每一prod_id值存在具有兩個區(qū)域ID(regn_id),即R1和R2的區(qū)域維,那么分區(qū)表子句“SALESPARTITIONBY{prod_id,regn_id}”將把表分區(qū)成六個分區(qū)。第一分區(qū)具有產(chǎn)品IDP1和區(qū)域IDR1,第二分區(qū)具有產(chǎn)品IDP1和區(qū)域IDR2,第三分區(qū)具有產(chǎn)品IDP2和區(qū)域IDR1,第四分區(qū)具有產(chǎn)品IDP2和區(qū)域IDR2,第五分區(qū)具有產(chǎn)品IDP3和區(qū)域IDR1,以及第六分區(qū)具有產(chǎn)品IDP3和區(qū)域IDR2。因此,上面實施例中的分區(qū)的層次是列出的第一分區(qū)索引將目標表分區(qū)成較大分區(qū),以及下一個分區(qū)索引將每一個較大分區(qū)分區(qū)成較小的分區(qū)。然而,在其它實施例中,可以使用任何其它的分區(qū)層次。例如,列出的最后分區(qū)維可以被用于分區(qū)較大的分區(qū)以及列出的下一個分區(qū)維可以被用于將較大的分區(qū)分區(qū)成較小的分區(qū)。在該實施例中,分區(qū)表子句“SALESPARTITIONBY{prod_id,regn_id}”產(chǎn)生了具有產(chǎn)品IDP1和區(qū)域IDR1的第一分區(qū)、具有產(chǎn)品IDP2和區(qū)域IDR1的第二分區(qū)、具有產(chǎn)品IDP3和區(qū)域IDR1的第三分區(qū)、具有產(chǎn)品IDP1和區(qū)域IDR2的第四分區(qū)、具有產(chǎn)品IDP2和區(qū)域IDR2的第五分區(qū)、以及具有產(chǎn)品IDP3和區(qū)域IDR2的第六分區(qū)。OUTERJOIN類型圖2B是圖2C的外連接類型230的語法的框圖。外連接類型230包括選項242。在實施例中,OUTERJOIN的語法允許分區(qū)表或表引用出現(xiàn)在OUTERJOIN的任何一側(cè)。因此,如圖2B的選項242所指示的,根據(jù)所產(chǎn)生的表是否包含被指定在OUTERJOIN子句中的關(guān)鍵字“OUTERJOIN”的兩側(cè)的兩個表、被指定在左側(cè)的表、或被指定在右側(cè)的表的所有行,外連接類型可以是FULL(全)、LEFT(左)或RIGHTOUTERJOIN(右外連接)。特別地,在LEFTOUTERJOIN中,在“OUTERJOIN”關(guān)鍵字左側(cè)的表中的所有行被包含在所產(chǎn)生的表中,并且目標表出現(xiàn)在“OUTERJOIN”關(guān)鍵字的右側(cè)。如果分區(qū)表出現(xiàn)在右側(cè),則每一分區(qū)被分別地外連接到左側(cè)的table_reference或partitioned_table,以使“OUTERJOIN”關(guān)鍵字左側(cè)的table_reference或partitioned_table可以用于使“OUTERJOIN”關(guān)鍵字右側(cè)的目標partitioned_table稠密。類似地,在RIGHTOUTERJOIN中,“OUTERJOIN”關(guān)鍵字右側(cè)的表中的所有行被包括在所產(chǎn)生的表中,以及目標表出現(xiàn)在“OUTERJOIN”關(guān)鍵字的左側(cè)。如果partitioned_table出現(xiàn)在左側(cè),則每一分區(qū)被分別地外連接到“OUTERJOIN”關(guān)鍵字右側(cè)的table_reference或partitioned_table,使得“OUTERJOIN”右側(cè)的table_reference或partitioned_table可以用于使“OUTERJOIN”關(guān)鍵字左側(cè)的目標分區(qū)表稠密。在FULLOUTERJOIN中,所產(chǎn)生的表包括兩個表的所有行,這兩個表分別出現(xiàn)在“OUTERJOIN”關(guān)鍵字的右側(cè)和左側(cè)。如果partitioned_table出現(xiàn)在任意一側(cè),則每一分區(qū)被分別地外連接到“OUTERJOIN”關(guān)鍵字的另一側(cè)上的table_reference或partitioned_table。例如,假設有兩個表A和B,其中,表A具有用于(P1,S1)、(P3,S2)、(P3,S3)、(P5,-)和(P10,-)的行,以及表B具有用于S1、S2、S3和S4的行,假設以A.s_id=B.s_id為條件外連接這些表,將OUTERJOIN結(jié)果投影到列A.s_id和B.p_id上(其中,s_id指的是具有值S1、S2、S3、和S4的維,以及p_id指的是具有值P1、P3、P5、和P10的維)。如果沒有表是分區(qū)表,如果表A在關(guān)鍵字“OUTERJOIN”的左側(cè)并且表B在關(guān)鍵字“OUTERJOIN”的右側(cè),則LEFTOUTERJOIN的結(jié)果是具有用于(P1,S1)、(P3,S2)、(P3,S3)、(P5,-)和(P10,-)的行的表。類似地,RIGHTOUTERJOIN的結(jié)果是具有用于(P1,S1)、(P3,S2)、(P3,S3)、和(-,S4)的行的表。FULLOUTERJOIN的結(jié)果也是具有用于(P1,S1)、(P3,S2)、(P3,S3)、(P5,-)、(P10,-)和(-,S4)的行的表。如果表A按p_id分區(qū),那么LEFTOUTERJOIN的結(jié)果是具有用于(P1,S1)、(P3,S2)、(P3,S3)、(P5,-)和(P10,-)的行的表。LEFTOUTERJOIN的結(jié)果同表A未被分區(qū)時是相同的。由于表B未被分區(qū),因此表B沒發(fā)生稠化。RIGHTOUTERJOIN的結(jié)果是具有用于(P1,S1)、(P1,S2)、(P1,S3)、(P1,S4)、(P3,S1)、(P3,S2)、(P3,S3)、(P3,S4)、(P5,S1)、(P5,S2)、(P5,S3)、(P5,S4)、(P10,S1)、(P10,S2)、(P10,S3)和(P10,S4)的行的表。在RIGHTOUTERJOIN中,P1、P3、P5、和P10分區(qū)的每個都被稠密,以包括用于第二列(S1、S2、S3、和S4)的每個值的一行。FULLOUTERJOIN的結(jié)果是具有用于(P1,S1)、(P1,S2)、(P1,S3)、(P1,S4)、(P3,S1)、(P3,S2)、(P3,S3)、(P3,S4)、(P5,S1)、(P5,S2)、(P5,S3)、(P5,S4)、(P5,-)、(P10,S1)、(P10,S2)、(P10,S3)、(P10,S4)和(P10,-)的行的表。除了RIGHTOUTERJOIN中包括的行之外,F(xiàn)ULLOUTERJOIN的結(jié)果包括行(P5,-)和(P10,-),這兩行未被包括在RIGHTOUTERJOIN中。除了使表A的第二列的維稠密以包括包含表B中相同維的列的每個值之外,行(P5,-)和(P10,-)被添加,這是因為它們將被添加在LEFTOUTERJOIN中執(zhí)行的叉積中。實例為了闡明上文,首先將討論放置于規(guī)則ANSI兼容的JOIN表格的結(jié)果記錄中的列,然后將討論放置于PARTITIONEDOUTERJOIN表格的結(jié)果記錄中的列。在ANSI兼容表格中,假設有兩個表T1(c1,c2,c3)和T2(c1,c4),其中,c1、c2、c3和c4表示列。當使用指定的列JOIN(例如具有USING子句的JOIN或普通的JOIN)時,結(jié)果記錄包括(1)用作連接鍵的列,(2)來自JOIN操作數(shù)左側(cè)的非-連接鍵的列,以及(3)來自JOIN操作數(shù)的右側(cè)的非-連接鍵的列。例如,子句的結(jié)果T1RIGHTOUTERJOINT2USING(c1),或子句T1NATURALRIGHTOUTERJOINT2由列(c1、T1.C2、T1.C3、T2.c4)組成。盡管列c1在表T1和T2中都出現(xiàn),但由于列c1被用作連接鍵,所以僅僅有列c1的一個副本被放置于結(jié)果中。相反,對于其中連接條件由ON子句指定的ANSI兼容的連接,結(jié)果包括(1)來自T1的列,以及(2)來自T2的列,以及連接鍵的列將出現(xiàn)兩次,一次具有來自T1的列,以及一次具有來自T2的列。例如,子句的結(jié)果T1RIGHTOUTERJOINT2ONT1.c1=T2.c1,是其中行具有列(T1.c1,T1.c2,T1.c3,T2.c1,T2.c2)的表。然而,SELECT子句可以被用于突出所關(guān)注的列。例如,假設表T1是===T1===C1C2C3------------------------------A1B1C1A1B2C3A2B3C1A3B3C2同樣,假設表T2是===T2===C1C4--------------------A1D1A2D2A3D3作為一個指定的列連接的實例,語句SELECT*FROMT1NATURALRIGHTOUTERJOINT2;返回如下C1C2C3C4----------------------------------------A1B1C1D1A1B2C3D1A2B3C1D2A3B3C2D3在上面的結(jié)果中,除了即使有兩個C1列和兩個C2列(每個表中一個),C1和C4列僅僅出現(xiàn)一次之外,出現(xiàn)了來自兩個表T1和T2的所有列,這是因為C1和C4列是連接鍵。當使用SELECT子句突出列時,語句SELECTC1,T1.C3,T2.C4FROMT1NATURALRIGHTOUTERJOINT2;產(chǎn)生下面的表c1C3C4------------------------------A1C1D1A1C3D1A2C1D2A3C2D3由于選擇子句僅指定列C1、T1.C3、T2.C4,因此列C2不顯示在結(jié)果中。作為使用ON子句的實例,假設有語句SELECT*FROMT1RIGHTOUTERJOINT2ONT1.C1=T2.C1;由上面的語句返回的結(jié)果是C1C2C3C1C4--------------------------------------------------A1B1C1A1D1A1B2C3A1D1A2B3C1A2D2A3B3C2A3D3在上面的表中,不同于NATURALJOIN子句或USING子句,列c1出現(xiàn)兩次,這是由于出現(xiàn)了來自表T1的列c1以及來自表T2的列c1。作為在具有ON子句的語句中使用SELECT子句顯示列的實例,假設有語句SELECTT2.C1,T1.C2,T1.C3,T2.C4FROMT1RIGHTOUTERJOINT2ONT1.C1=T2.C1;上面的語句產(chǎn)生表C1C2C3C4----------------------------------------A1B1C1D1A1B2C3D1A2B3C1D2A3B3C2D3盡管來自T1表和T2表的C1列通常在使用ON子句時返回,但是由于選擇子句指定T2.C1、T1.C2、T1.C3、T2.C4以及列T1.C1未被指定,所以來自T1表的C1列未出現(xiàn)在結(jié)果中。返回到PARTITIONEDOUTERJOIN,不同于標準ANSI兼容的JOIN,指定的列分區(qū)的外連接的結(jié)果包括(1)來自左操作數(shù)的分區(qū)表達式的結(jié)果,如果有的話,(2)來自右操作數(shù)的分區(qū)表達式的結(jié)果,如果有的話,(3)連接列,(4)來自左操作數(shù)的非-分區(qū)和非-連接列,以及(5)來自右操作數(shù)的非-分區(qū)和非-連接列。例如,假設有子句T1PARTITIONBY(C2)NATURALRIGHTOUTERJOINT2上面的語句的結(jié)果重新編碼由列(T1.c2,c1,T1.c3,T2.c4)組成。類似地,來自具有通過ON子句指定的連接條件的分區(qū)的外連接的結(jié)果包括(1)來自左操作數(shù)的分區(qū)表達式,如果有的話,(2)來自右操作數(shù)的分區(qū)表達式,如果有的話,(3)來自左操作數(shù)的非-分區(qū)列,以及(4)來自右操作數(shù)的非-分區(qū)列。例如,假設有子句T1PARTITIONBY(C2)RIGHTOUTERJOINT2ONT1.C1=T2.C1該子句的結(jié)果包括列(T1.c2、T1.c1、T1.c3、T2.c1、T2.c4)。作為在SELECT子句中突出所關(guān)注的列的第一實例,假設有語句SELECT*FROMT1PARTITIONBY(C2)NATURALRIGHTOUTERJOINT2;該語句的結(jié)果是C2C1C3C4----------------------------------------B1A1C1D1B1A2D2B1A3D3B2A1C3D1B2A2D2B2A3D3B3A1D1B3A2C1D2B3A3C2D3在上面的結(jié)果中,表T1由列C2分區(qū)。那么表T1的每一分區(qū)使用列C1作為連接鍵被外連接到表T2。由于使用指定的連接,因此連接列C1僅在結(jié)果中出現(xiàn)一次?,F(xiàn)在假設有語句SELECT*FROMT1PARTITIONBY(C2)RIGHTOUTERJOINT2ONT1.C1=T2.C1;所產(chǎn)生的表是C2C1(T1的)C3C1(T2的)C4--------------------------------------------------B1A1C1A1D1B1A2D2B1A3D3B2A1C3A1D1B2A2D2B2A3D3B3A1D1B3A2C1A2D2B3A3C2A3D3由于在ON子句中指定連接條件,因此兩個C1列出現(xiàn)在上面的表中。C1列之一從表T1獲得,以及另一個從表C2獲得。作為使用SELECT子句以突出所關(guān)注的列的實例,假設有語句SELECTT1.C2,T1.C3,T2.C1FROMT1PARTITIONBY(C2)RIGHTOUTERJOINT2ONT1.C1=T2.C1;所產(chǎn)生的表是C2C3C1------------------------------B1C1A1B1A2B1A3B2C3A1B2A2B2A3B3A1B3C1A2B3C2A3由于表T1的列C1和表T2的列C4未被指定,因此它們未出現(xiàn)在所產(chǎn)生的表中。作為另一實例,假設表T1有兩行{(A1,B1,C1),(A1,B1,C2)}同樣假設表T2具有三行{(B1),(B2),(B3)}假設有語句SELECT*FROMT1PARTITIONBY(A)RIGHTOUTERJOINT2ONT1.B=T2.B;上面的語句的結(jié)果是表AB(T1.B的)CB(T2.B的)----------------------------------------A1B1C1B1A1B1C2B1A1B2A1B3類似地,假設有語句SELECTT1.A,T1.C,T2.BFROMT1PARTITIONBY(A)RIGHTOUTERJOINT2ONT1.B=T2.B;上面的聲明突出到列T1.a、T1.c和T2.b上,并且產(chǎn)生表ACB------------------------------A1C1B1A1C2B1A1B2A1B3分區(qū)的外連接圖2C是具有分支202和204的擴展的JOIN語法的框圖。分支204包括分區(qū)表206、分區(qū)表208、分區(qū)表210、外連接類型212、外連接類型214以及條件216,這些將在下面的討論中提到。分支202給出用于INNERJOIN和CROSSJOIN的語法。關(guān)于分支204,BNF格式的PARTITIONEDOUTERJOIN的相應的語法如下。join_table={partitioned_table|table_reference}{FULL|LEFT|RIGHT}[OUTER]JOIN{partitioned_table|table_reference}{ON<join_cond>|USING(col[,col]...)}|{partitioned_table|table_reference}NATURAL{FULL|LEFT|RIGHT}[OUTER]JOIN{partitioned_table|table_reference}因此,在分支204中,從左開始,用戶首先指定分區(qū)表206a或表引用206b,然后用戶可以在分支204b上指定關(guān)鍵字“NATURAL”,或者用戶可以使用分支204a而不使用關(guān)鍵字“NATURAL”。然后關(guān)鍵字在分支206a上指定外連接類型212或在分支206b上指定外連接類型214。外連接類型230是外連接類型212和214的實施例。在外連接類型212或外連接類型214之后是關(guān)鍵字JOIN。在分支204a上,分區(qū)表208a或表引用208b在JOIN關(guān)鍵字之后。在分支204b上,分區(qū)表210a或表引用210b跟隨JOIN關(guān)鍵字。由于在NATURALOUTERJOIN中沒有應用條件,因此在分支204b上,OUTERJOIN子句以分區(qū)表210a或表引用210b結(jié)束。在分區(qū)表208a或表引用208b之后的是用于指定連接條件的關(guān)鍵字“ON”或用于指定連接鍵的“USING”。類似于現(xiàn)有的ANSI連接算符,PARTITIONEDOUTERJOIN允許復雜的連接條件,其中,連接條件216(也就是在“ON”關(guān)鍵字之后的join_cond)可以是任意復雜的布爾表達式。join_cond或連接條件216可以應用到來自該連接的任意一側(cè)的表的列,包括分區(qū)表的分區(qū)表達式中的任何列。在“USING”關(guān)鍵字之后,如逗號224所指示的,可以有任何數(shù)量的表達式expr222對連接操作施加條件。每一expr222是一列或?qū)α星笾档谋磉_式。該連接的結(jié)果是對每一分區(qū)應用OUTERJOIN所產(chǎn)生的結(jié)果的UNION。在一實施例中,在執(zhí)行OUTERJOIN之后,分區(qū)表達式采用識別對應分區(qū)表的值。如果使用表引用206b而不是分區(qū)表206a,以及使用表引用208b而不是分區(qū)表208a或者使用表引用210b而不是分區(qū)表210a,那么PARTITIONEDOUTERJOIN回復到標準的OUTERJOIN。使用分支204a的合法的PARTITIONEDOUTERJOINS的一些實例是SALESV1PARTITIONBY(prod_id)RIGHTOUTERJOINTIMESV2ON(V1.time_id=V2.time_id)TIMESV2LEFTOUTERJOINSALESV1PARTITIONBY(prod_id)ON(V1.time_id=V2.time_id)SALESV1PARTITIONBY(prod_id)RIGHTOUTERJOINTIMESV2USING(time_id)上面的每一實例執(zhí)行SALES表的相同的稠化。第一個實例使用右外連接,而第二個實例使用左OUTERJOIN。因此,SALES事實表和TIME維表的位置相對于“OUTERJOIN”關(guān)鍵字顛倒,因此結(jié)果是一樣的。在第三個實例中,連接鍵由等價于前兩個實例的同等連接條件的名稱指定,而不是以方程式的形式表示同等連接條件。使用分支204b的OUTERJOIN表達式的語法的實例是SALESV1PARTITIONBY(prod_id)NATURALRIGHTOUTERJOINTIMESV2在該實例中,使用TIMES表和SALES表的共同列作為連接鍵。如果TIMES表和SALES表僅具有一個共同列,例如(time_id),結(jié)果將與上面的三個語句中的語句相同。在稠化操作中使用“PARTITIONBY”算符使用PARTITIONEDOUTERJOIN語法,查詢Q1可以重寫為Q1_newSELECTV1.prod_id,V2.time_id,V1.amount_soldFROMSALESV1PARTITIONBY(prod_id)RIGHTOUTERJOINTIMESV2ON(V1.time_id=V2.time_id);Q1_new查詢僅僅要求單個PARTITIONEDOUTERJOIN,因此與以前被需要來執(zhí)行稠化的Q1的代碼(在
背景技術(shù):
章節(jié)中)相比,簡化了執(zhí)行稠化所需要的編碼。類似地,使用PARTITIONEDOUTERJOIN語法,查詢Q2可以被重新寫為Q2_newSELECTV1.prod_id,V2.time_id,SUM(sales)OVER(PARTITIONBYV1.prod_id,V2.yearORDERBYV2.time_id)YTD_salesFROMSALESV1PARTITIONBY(prod_id)RIGHTOUTERJOIN(SELECTtime_id,calendar_yearyearFROMTIMES)V2ON(V1.time_id=V2.time_id);Q2_new查詢需要(1)具有TIMES的SALES的PARTITIONEDOUTERJOIN以及(2)對“(1)”中PARTITIONEDOUTERJOIN的結(jié)果的排序以計算YTD窗口函數(shù)。實現(xiàn)分區(qū)外連接的方法響應于接收到指定分區(qū)外連接的語句,數(shù)據(jù)庫服務器執(zhí)行一個或多個程序以執(zhí)行分區(qū)外連接操作。數(shù)據(jù)庫服務器可以使用多種技術(shù)來執(zhí)行分區(qū)外連接。根據(jù)一個實施例,數(shù)據(jù)庫服務器包括用于多個技術(shù)中的每一技術(shù)的程序,然后選擇哪一技術(shù)最適于包含分區(qū)外連接操作的每個語句。在一實施例中,被選擇用于特定查詢的方法取決于哪個方法將更加高效地用于執(zhí)行該查詢。雖然本發(fā)明不局限于任何特定的技術(shù),但在下文中將描述用于執(zhí)行分區(qū)外連接的三種技術(shù)。在所介紹的三種方法中的每一種方法中,一系列的“微-連接”(也就是,沒有立即對整個表執(zhí)行的連接)被執(zhí)行。三種方法中的每一方法可以彼此分離地使用而不用執(zhí)行估計有關(guān)的計算成本以決定三種方法中的另一方法是否更高效??蛇x地,上面方法中的任兩種方法可以彼此組合使用,其中,執(zhí)行成本計算來決定這兩種方法的哪一種方法用于特定查詢。嵌套循環(huán)圖3是示出方法300的流程圖,該方法將被稱作嵌套循環(huán)分區(qū)外連接。嵌套循環(huán)(例如do-循環(huán))是包括至少兩個嵌套關(guān)系的循環(huán)的代碼。例如,最外面的循環(huán)在一組值之間迭代,并且嵌套的循環(huán)用于在第一組值中的每個值的第二組值之間迭代。對于執(zhí)行稠化,嵌套循環(huán)的一個或多個最外面循環(huán)可以對應于分區(qū)維。每一最里面的循環(huán)可以對應于不同的稠密維。每一循環(huán)有一個索引。在循環(huán)的每次迭代期間,循環(huán)索引被設置到下一個值。對應于分區(qū)維的循環(huán)被稱作分區(qū)循環(huán),并且對應的循環(huán)索引被稱作分區(qū)索引。對應于稠密維的循環(huán)將被稱作稠密循環(huán)以及對應的循環(huán)索引被稱作稠密索引。對應于特定維的循環(huán)的索引在該循環(huán)的每次迭代期間將從該維被分配一新值。因此,分區(qū)循環(huán)的索引值對應于分區(qū)維的不同的維值。例如,如果表有三行,以及三行中的每一行具有用于分區(qū)維的相同的維值,那么分區(qū)循環(huán)對于該特定的維值僅僅執(zhí)行一次。稠密循環(huán)的索引值對應于稠密維的維值。因此,在稠密循環(huán)的每次迭代期間,循環(huán)的索引值對應于唯一的維值。當每一循環(huán)周期經(jīng)過它的維值時,“if”語句檢查輸入(例如,行)是否存在于數(shù)據(jù)(例如,目標表)中,該數(shù)據(jù)具有對應于循環(huán)的當前索引值組合的維值組合。如果該輸入存在,其被添加到一組輸出數(shù)據(jù)。如果對于該維值該輸入不存在,則創(chuàng)建具有對應于索引值組合的維值組合的空值輸入。例如,下面的算法可以被用于Q1_new查詢的基本代碼,其中,PRODUCT維被用于分區(qū)維并且TIME維用于稠密維。foreachprod_idfrom(I){foreachtime_idfrom(II){probeindexIusing(prod_id,time_id)returnthematchingrowsifthereisnomatchingrow,createadummyrow}}其中,索引I使用SALES表的Product維的不同值,以及索引II執(zhí)行對TIMES表的Times維的全掃描或使用已建立的Times維的索引。嵌套循環(huán)連接使用可用索引作為它的循環(huán)索引并且可以與非同等連接一起使用。如果不存在用作循環(huán)索引的索引,則有可能為能夠執(zhí)行嵌套循環(huán)外連接或歸并排序外連接而建立索引。然而,與建立索引相關(guān)的計算成本可能使得分區(qū)嵌套循環(huán)的效率低于執(zhí)行分區(qū)外連接的其它方法。參照圖3,在步驟302,分區(qū)循環(huán)的索引(索引I)初始被設置為Product維的第一不同值。在循環(huán)的隨后周期中,索引I被設置為當前值,其可以是Product維的下一個不同維值。獲得索引I的分區(qū)維的值的方法在下面加以討論。在實施例中,如果存在用于除了其中索引由維的不同值組成的稠密維之外的任何其它維的索引,則其可以用于索引I,分區(qū)索引。在步驟304,下一個循環(huán)的索引,索引II被設置為當前值,其可以是索引(事實表相對于其被稠密)的下一個不同的維值??梢杂腥魏螖?shù)量的分區(qū)和/或稠密循環(huán),每個循環(huán)分別對應于不同的分區(qū)維和/或稠密維。如果用于對數(shù)據(jù)進行分區(qū)的循環(huán)對應于數(shù)據(jù)相對于其被完全地稠密的維,那么對應的循環(huán)將具有對應于每一維值的索引值。在步驟306,確定(例如,通過“if”語句)是否存在具有對應于當前索引值的組合的維值組合的行??蛇x地,對于非-同等連接,確定當前行的維組合和索引值組合是否滿足連接條件(例如,條件216(圖2C)或join_cond)。如果不存在這樣的行(如果連接條件不被滿足),方法300進行到步驟308,在那兒創(chuàng)建具有用于其測量的空值的行。在步驟308之后,方法300進行到步驟310。返回到對步驟306的討論,如果行存在,則方法300進行到步驟310(不執(zhí)行步驟308)。在步驟310,在步驟306中找到的行或在步驟308中創(chuàng)建的行被添加到將被顯示的最終結(jié)果(或輸出表)。在步驟312,確定對于具有索引II的循環(huán)是否存在其它的索引值。如果有其它的索引II值,則方法300返回到步驟304以開始另外執(zhí)行具有索引II的循環(huán)。如果沒有更多的索引II值,則方法300進行到步驟314以檢查是否具有更多的索引I值。如果有更多的索引I值,則方法300進行到步驟302以開始另外執(zhí)行具有I索引的循環(huán)。如果沒有更多的索引I值,則方法300結(jié)束。如由步驟310和312之間的點所指示的,可以有任何數(shù)量的類似于步驟312和314的步驟,其中,每一步驟對應于不同的循環(huán),并且每一循環(huán)對應于不同的稠密維或分區(qū)維。因此,為了概述方法300的操作,分區(qū)索引,索引I周期地經(jīng)過不同的維值I。另外,對于索引I的特定值,對稠密維的所有值II執(zhí)行循環(huán),而對于每個值II應用“if”語句,因此使具有分區(qū)維值I的事實表的部分稠密。在方法300的算法的代碼中,可以用任何語句或語句組來代替“if”語句,其中語句或語句組能夠確定是否存在對應于當前索引值組合的行。在上面的實例中,外部索引可以基于PRODUCTS維。在上面的實例中,內(nèi)循環(huán)的索引是整個time_id集合。使用跳躍掃描來獲得值返回到方法300的步驟302,在實施例中,如果只有存在的索引使用分區(qū)維作為復合索引的一部分,其中,復合索引具有用于該復合索引的其它部分的其它維,則跳躍掃描被用于分區(qū)索引(例如,索引I),即使分區(qū)維不是復合索引的導向列(leadingcolumn)。在跳躍掃描期間,復合索引的分區(qū)維被存取用于一個或多個導向列的每個值。在實施例中,在找到分區(qū)索引的第一個值之后,具有該值的索引中的其它輸入被跳過,直到下一最高值被找到。在找到索引的下一個值之后,所有已被找到的索引值被跳過。重復該過程,以便分區(qū)索引的每個不同值可以被找到。在找到分區(qū)索引的新的不同值之后,分區(qū)循環(huán)被執(zhí)行。對于數(shù)據(jù)的某些集合而言,跳躍掃描比全表掃描更快的一個原因在于,索引以記住維值的順序的方式被組織??梢岳盟饕档慕M織來確定可以被跳過的索引組合。另外,儲存索引的磁盤空間的大小小于儲存全表的磁盤空間的大小,并且磁盤空間越小,存取時間越快。通過使用跳躍掃描,僅需要使用復合索引的一維來分區(qū)事實表。同樣通過使用跳躍掃描,維可以被用作索引,否則需要表掃描(例如,DISTINCT結(jié)構(gòu))來找到對應于維的任何給定的不同值的所有行。這樣,通過使用跳躍掃描,在外部循環(huán)的每一新值I處,事實表的對應分區(qū)(其中分區(qū)維具有維值I)被找到。在跳躍掃描中,循環(huán)在每次遇到在循環(huán)之前還未被執(zhí)行過新的prod_id時被重復。特別地,PARTITIONEDOUTERJOIN可以通過由跳躍掃描獲得使用該索引的所有不同的prod_id值來計算。然后,由每個prod_id值和time_id組成的元組(tuple)被用于掃描SALES表,其中,TIMES表的time_id值作為索引II。對于索引值I和II的每一組合,兩個嵌套循環(huán)內(nèi)的語句確定是否存在與對應的prod_id和time_id值匹配的行,以及如果找到匹配的行,其被返回。否則,如果沒有匹配被返回,則生成虛行。將事實表分成分區(qū)圖4示出執(zhí)行PARTITIONEDOUTERJOIN的第二方法,方法400的流程圖,其中,目標表被分成分區(qū),然后每一分區(qū)被外連接,如下所述。將事實表分成分區(qū)不取決于同等連接或索引,所以比其它兩種方法更靈活,但在某些情形下也更低效。在步驟402,目標表在除了數(shù)據(jù)正被稠密的維之外的維上被排序。目標表可以是事實表或任何其它表。例如,目標表可以是虛表,其中,行是由數(shù)據(jù)庫語句的表達式生成的。目標表(例如,SALES表)的排序具有將目標表分成分區(qū)的作用,其中,每一分區(qū)對應于目標表被排序所依據(jù)的不同的維值(例如,prod_id)。方法400需要支持檢測和處理分區(qū)的結(jié)束。所以,行的分區(qū)維的維值可以與當前的分區(qū)值相比較,以確定是否已經(jīng)超過分區(qū)邊界。然后,在步驟404,每一分區(qū)與稠密的維表(例如,TIMES表)外連接(OUTERJOIN)。將分區(qū)與稠密的維外連接包括,取稠密的維表的行(例如,TIMES行),然后,將其與每一分區(qū)中的行匹配。如果不匹配,對應于給定的維值組合(例如,prod_id,time_id)的虛行被創(chuàng)建。通過方法400的分區(qū)目標表的稠化是靈活的,并且可以在ON子句中存在非-同等條件(也就是,不是等式的條件)時使用。除了可用于非同等連接之外,方法400不需要使用索引。在實施例中,方法400可以被用于相對于多維進行稠密。步驟404的輸出也被分區(qū)。因此,使用步驟404的最新應用程序的輸出,并且相對于第二維重復步驟404將相對于第二維稠化數(shù)據(jù)。因此,步驟404可以被重復任意次以相對于多維進行稠密。歸并排序分區(qū)外連接圖5是執(zhí)行PARTITIONEDOUTERJOIN的第三種方法,方法500的流程圖,該方法可以被稱作歸并排序分區(qū)外連接。下面將對執(zhí)行在每一分區(qū)內(nèi)的歸并排序連接加以描述。歸并排序連接不需要索引,并且也使用同等連接。在歸并排序分區(qū)外連接的步驟502,目標表(例如,SALES表)相對于其所有維(例如,prod_id、time_id)被排序。稠密的維被最后排序,使得數(shù)據(jù)被分成分區(qū),其中,在每一分區(qū)中不再具有用于稠密維的每個維值的一個維值。所有其它維成為分區(qū)維。所有分區(qū)維的排序具有分區(qū)目標表的作用。然后,目標表(例如SALES表)的每一分區(qū)對應于維值的不同組合。換句話說,對于分區(qū)維值的每一唯一組合將存在一個分區(qū)。另外,每一分區(qū)將僅有分區(qū)維值的一種組合。例如,假設SALES表具有具有time_id的值的維TIMES,具有prod_id的值的維PRODUCTS,以及具有regn_id的值的維REGION。同樣假設僅存在兩個prod_id值“1”和“2”,僅存在兩個regn_id值“1”和“2”,以及僅存在三個time_id值“8”、“9”、和“10”。然后,在對所有的三個維排序之后,將有四個分區(qū)。使用元組(prod_id,regn_id,time_id),一個分區(qū)將包括元組(1,1,8)、(1,1,9)、和(1,1,10)。第二分區(qū)將包括元組(1,2,8)、(1,2,9)和(1,2,10)。第三分區(qū)將包括元組(2,1,8)、(2,1,9)、和(2,1,10)。最后,第四分區(qū)將包括元組(2,2,8)、(2,2,9)、和(2,2,10)。接下來在步驟504,用于使維稠密的稠密維表(例如,TIMES表)根據(jù)其維值(例如,time_id)被排序。在步驟506,目標表(例如,SALES表)的每一分區(qū)內(nèi)的每一行與被排序的稠密維表(例如,TIMES表)單獨地連接。當將目標表的行連接到維表時,包括稠化維(例如TIMES)的被排序的目標表的列可以被用作鍵,該鍵可以稱作連接鍵。如果未找到匹配,則返回虛行。由于所有的維已被排序,因此所有的維值被排序。這樣,通過比較連接鍵的連續(xù)值,確定是否已到達分區(qū)的結(jié)尾??蛇x地,分區(qū)的結(jié)尾可以通過檢測具有用于每一分區(qū)維的一個維值的維值組合中的變化來檢測。一旦到達分區(qū)的結(jié)尾并且到達對應于稠密維的索引的結(jié)尾,則為下一分區(qū)重復用于稠密維值的循環(huán)。目標表的單個行到正被稠密的維的連接可以通過在具有對應于稠密維的索引的循環(huán)中放置“if語句”或“if塊”來執(zhí)行。可選地,由于稠密維表(例如,TIMES維表)被排序,因此在每次對目標表(例如,SALES表)的行的連接條件的檢查之后,指針可以通過稠密維表前進到稠密維表的下一行。在歸并排序分區(qū)外連接的實施例中,用于連接鍵索引的指針在同等連接的同等條件每次被滿足時被移動到下一行,該同等條件是每次稠密維表的維鍵等于被排序的目標表的連接鍵。在使用索引的實施例中,用于連接鍵的指針在每次索引等于連接鍵時前進到下一行。因此,在本實施例中,指針沒有必要移回已經(jīng)被超過的位置。然而,在可選實施例中,可以使用非同等連接,但包括用于定位指針的算法,允許指針放置在用于稠密維的兩個不同值的同一連接鍵上或向后移動。優(yōu)化程序圖6是可以被包括在能夠運行PARTITIONEDOUTERJOIN的關(guān)系數(shù)據(jù)庫管理系統(tǒng)中的優(yōu)化程序的操作的方法600的流程圖。在實施例中,優(yōu)化程序被包括在運行PARTITIONEDOUTERJOIN的關(guān)系數(shù)據(jù)庫管理系統(tǒng)中。該優(yōu)化程序基于用于表的集合和正對其執(zhí)行操作的語句的每種方法的計算成本,在執(zhí)行多種不同操作的多種方法之間作出決定。在實施例中,該優(yōu)化程序根據(jù)哪一方法最高效來決定用于執(zhí)行PARTITIONEDOUTERJOIN的方法。例如,在步驟602,優(yōu)化程序可以首先檢查是否存在可用于目標表的維的索引,如果分區(qū)維或稠密維沒有可用的索引,則方法300不能被使用,以及方法600進行到步驟604。在步驟604,確定是否存在非同等連接。如果存在非同等連接,則方法500不能被使用,因此方法600進行到步驟606,其中,方法400執(zhí)行圖4的分區(qū)表的方法。返回到對步驟604的討論,如果沒有非同等連接,則方法600進行到步驟608,在此,確定是方法400還是方法500被認為更高效。如果方法400被認為更高效,則方法600進行到步驟606。如果方法500被認為更高效,則該方法進行到步驟610,在此,方法500的歸并排序外連接被實施。返回到對步驟602的討論,如果索引存在,則所有三種方法仍可使用,并且方法進行到步驟612。在步驟612(類似于步驟604),確定是否存在任何非同等連接。如果存在非同等連接,則方法500不能被使用,因此方法600進行到步驟614,在此,決定是方法300、400、還是500被認為更高效。如果方法500被認為更高效,則方法600前進到步驟610。如果方法400被認為更高效,則方法600進行到步驟606。如果方法300被認為更高效,則方法600進行到步驟616,在此方法300的嵌套循環(huán)外連接被實施。返回到對步驟612的討論,如果存在不同等連接,則歸并排序外連接不能被使用,并且方法600進行到步驟618。在步驟618,確定是方法300還是400被認為更高效。如果方法300被認為更高效,則方法600進行到步驟616,在此方法300被實施。如果方法400被確定更高效,則方法600進行到步驟620,在此方法400被實施。在實施例中,除了或者代替方法300、400、和500中的任一方法或任何組合,優(yōu)化程序可以在執(zhí)行PARTITONEDOUTERJOIN的其它方法之間進行選擇。在可選實施例中,在關(guān)系數(shù)據(jù)庫中僅僅包含執(zhí)行PARTIONEDOUTERJOIN的方法300、400、或500之一或其中兩種方法,并且如果所包括的一種或兩種方法不能被應用,則PARTIONEDOUTERJOIN不被執(zhí)行。分區(qū)外連接的優(yōu)化和增強通常與JOIN和OUTERJOIN一起使用的優(yōu)化也可以與PARTITIONEDOUTERJOIN一起使用。例如,謂詞推入和分區(qū)截斷也可以與PARTITIONEDOUTERJOIN一起被使用。關(guān)于謂詞推入,只有那些定義在分區(qū)表達式上的謂詞應該被下推或上推動以查看。換句話說,如果謂詞強加限制到某一維值集合的輸出的條件,則程序應用該謂詞并且執(zhí)行初始計算,使得與不感興趣的維值相關(guān)的不必要的計算不被執(zhí)行。在程序中的一個或多個點應用謂詞,而不是在指定的點應用謂詞,其中,該程序最小化或至少減少為取得相同結(jié)果而需要執(zhí)行的計算量。例如,給定下面的查詢SELECTV1.prod_id,V2.time_id,V1.amount_soldFROMSALESV1PARTITIONBY(prod_id)RIGHTOUTERJOINTIMESV2ON(V1.time_id=V2.time_id)WHEREprod_idin(1,2,3);謂詞prod_idin(1,2,3)可以作為篩選程序被推進SALES表的表掃描,使得僅僅SALES表的產(chǎn)品1、2、和3與TIMES表連接。因此,將不對SALES表的其它產(chǎn)品執(zhí)行計算。類似地,對于PARTITION截斷,外部查詢塊的謂詞可以被用于截斷內(nèi)部查詢塊,該內(nèi)部查詢塊是PARTITIONEDOUTERJOIN的分區(qū)的操作數(shù)。如果表的部分或分區(qū)與執(zhí)行計算的一部分無關(guān),則不對該分區(qū)執(zhí)行計算。謂詞推入的實例也是截斷的實例,這是因為與產(chǎn)品1、2、或3無關(guān)的表的所有部分在對目標表的數(shù)據(jù)進行任何操作之前從考慮中的數(shù)據(jù)中被去除。優(yōu)化程序也被增強以與PARTITIONEDOUTERJOIN一起來估計成本和基數(shù)。在實施例中,基于成本的優(yōu)化也被支持用于PARTITIONEDOUTERJOIN。分區(qū)外連接的并行評估上述的分區(qū)外連接執(zhí)行方案是可升級的,這是因為每一PARTITIONEDOUTERJOIN計算被授權(quán)給一組從屬裝置使得它們每個都可以獨立于其它從屬裝置執(zhí)行該連接操作。在這種環(huán)境下,從屬裝置指的是任何能夠并行于其它這樣的實體的處理指令的實體。例如,從屬裝置可以是另一處理器、進程、或線程。為了便于不同的從屬裝置獨立地處理分區(qū),JOIN的稠密維表被廣播給所有的從屬裝置。JOIN操作的分區(qū)的目標表可以在進程和/或從屬裝置上進行被散列分區(qū)或范圍分區(qū)。例如,如果計算裝置具有四個處理器,并且SALES表具有6個產(chǎn)品,具有產(chǎn)品ID1-6,則第一處理器可以接收對應于產(chǎn)品ID1和2的SALES表的分區(qū),第二處理器可以接收對應于產(chǎn)品ID3和4的分區(qū)的副本,第三處理器可以接收對應于產(chǎn)品ID5的產(chǎn)品表的分區(qū),以及第四處理器可以接收對應于產(chǎn)品ID6的SALES表的分區(qū)。然而,處理器1-6的每一個都將接收整個TIMES表。因此,每一從屬裝置和/或進程能夠訪問整個維表以及為分區(qū)的表的片段執(zhí)行PARTITIONEDOUTERJOIN操作所需要的目標表的分區(qū)。第一處理器可以首先外連接產(chǎn)品ID#1的分區(qū),然后可以外連接產(chǎn)品ID#2的分區(qū)。與第一進程的操作平行,第二處理器可以首先外連接產(chǎn)品ID#3的分區(qū),然后可以外連接產(chǎn)品ID#4的分區(qū)。同時,第三處理器可以外連接產(chǎn)品ID#5的分區(qū)。同樣并行地,第四處理器可以外連接產(chǎn)品ID#6的分區(qū)。例如,假設有語句SELECTV1.prod_id,V2.time_id,V1.amount_soldFROMSALESV1PARTITIONBY(prod_id)RIGHTOUTERJOINTIMESV2ON(V1.time_id=V2.time_id);在這種情況下,非-分區(qū)的維表“TIMES”可以被廣播給所有的從屬裝置,并且分區(qū)的目標表“SALES”可以是基于分區(qū)列(例如,prod_id)分區(qū)的散列或范圍。換句話說,在本實例中,不同的從屬裝置可以對表被分區(qū)成的每個prod_id起作用。每一從屬裝置能夠訪問整個TIMES表以及由prod_id識別的SALES表的一些分區(qū)。每一從屬裝置因此可以獨立于其它的從屬裝置執(zhí)行其PARTITIONEDOUTERJOIN的部分。用于根據(jù)分區(qū)的列來分區(qū)分區(qū)表的分區(qū)方案可以是散列分區(qū)或范圍分區(qū)??蛇x實施例可以使用為稠密設計的結(jié)構(gòu),而不是PARTITIONEDOUTERJOIN。例如,用于稠密的結(jié)構(gòu)可以有下面的語法DENSIFY(table_reference[,tablereference]...)BY(densifying_expr[,densifying_expr]...)USING(dimension_expr[,dimension_expr]...)在可選實施例中,稠密結(jié)構(gòu)可以有下面的語法DENSIFY(table_reference[,tablereference]...,dimension_expr[,dimension_expr]...)BY(densifying_expr[,densifying_expr]...)在上面的語句中,table_reference是指向目標表的引用,并且dimension_expr是列或?qū)τ米骶S的虛列求值的表達式,其中,虛列是對于表的每一行都有一個數(shù)字的一組數(shù)字。類似地,densifying_expr是數(shù)據(jù)相對于其被稠密的維或虛維。在實施例中,當進行稠密時,dimension_expr無需實際地被用于分區(qū)數(shù)據(jù),而是用作非稠密維。換句話說,由稠密的結(jié)構(gòu)生成的表將具有用于稠密維的每個值和分區(qū)維的每個不同值的叉積的一行。如方括號和橢圓所指示的,具有相同維的任何數(shù)量的表可以通過相同的語句被稠密,表可以具有任何數(shù)量的稠密維,以及任何數(shù)量的其它維,只要除了稠密維之外至少有一個其它維。作為實例,假設SALES表僅僅包括元組(regn_id,prod_id,time_id)用于維值組合(1,1,1)和(1,2,1),并且TIME表包括time_id1和2。然后DENSIFY(SALES)BY(time_id)USING(prod_id)將產(chǎn)生具有用于維值組合(1,1,1)、(1,2,1)、(1,1,2)和(1,2,2)的行的SALES表。相反地,DENSIFY(SALES,regn_id)BY(time_id)將產(chǎn)生具有用于維值組合(1,1,1)、(1,2,1)和(1,1,2)的行的SALES表。硬件綜述圖7是示出可以實施本發(fā)明的實施例的計算機系統(tǒng)700的框圖。本發(fā)明可以在多種類型的機器上實現(xiàn)。計算機系統(tǒng)700僅僅是這種機器的一個實例。計算機系統(tǒng)700包括總線702或用來傳遞信息的其它通信裝置,以及與總線702連接的用來處理信息的處理器704。計算機系統(tǒng)700還包括耦合至總線702的主存存儲器706,諸如隨機存取存儲器(RAM)或其它動態(tài)存儲設備,用來存儲信息和將由處理器704執(zhí)行的指令。在執(zhí)行將由處理器704執(zhí)行的指令過程中,主存儲器706還可用于存儲臨時變量或其它中間信息。計算機系統(tǒng)700進一步包括只讀存儲器(ROM)708或耦合至總線702的其它靜態(tài)存儲設備,用于存儲靜態(tài)信息和處理器704的指令。提供諸如磁盤或光盤的存儲設備710,并耦合至總線702用于存儲信息和指令。計算機系統(tǒng)700可以經(jīng)由總線702耦合至諸如陰極射線管(CRT)的顯示器712,用于向計算機用戶顯示信息。包括字母數(shù)字鍵和其它鍵的輸入設備714耦合至總線702,用于將信息和命令選擇傳遞到處理器704。另一種類型的用戶輸入設備是光標控制器716,諸如鼠標、跟蹤球、或光標方向鍵,用于將方向信息和命令選擇傳遞到處理器704并用于控制顯示器712上的光標移動。輸入設備通常在兩個軸上(第一個軸(例如,X軸)和第二個軸(例如,Y軸)具有兩個自由度,使設備能指定平面上的位置。本發(fā)明涉及計算機系統(tǒng)700的使用,用于執(zhí)行在此描述的技術(shù)。根據(jù)本發(fā)明的一個實施例,通過計算機系統(tǒng)700響應于執(zhí)行包括在主存儲器706中的一個或多個指令的一個或多個序列的處理器704,來執(zhí)行這些技術(shù)。這種指令可以從諸如存儲設備710的其它計算機可讀介質(zhì)讀入主存儲器706。包括在主存儲器706中的指令序列的執(zhí)行,使得處理器704執(zhí)行此處所述的處理步驟。在可選實施例中,可以使用硬連線電路來取代軟件指令或與軟件指令結(jié)合來實施本發(fā)明。因此,本發(fā)明的實施例不局限于硬件電路和軟件的任何特定組合。這里使用的術(shù)語“計算機可讀介質(zhì)”是指參與向處理器704提供指令用于執(zhí)行的任何介質(zhì)。由于計算機系統(tǒng)700僅僅是機器的一個實例,并且計算機可讀介質(zhì)僅僅是“機器可讀的介質(zhì)”的一個實例。這種介質(zhì)可以采取多種形式,包括但不限于非易失性介質(zhì)、易失性介質(zhì)、和傳遞介質(zhì)。非易失性介質(zhì)舉例來說包括光盤或磁盤,諸如存儲裝置710。易失性介質(zhì)包括動態(tài)存儲器,諸如主存儲器706。傳輸介質(zhì)包括同軸電纜、銅線、和光纖,包括組成總線702的導線。傳輸介質(zhì)還可采取聲波或光波形式,例如那些在無線電波和紅外線數(shù)據(jù)通信過程中產(chǎn)生的聲波和光波。通常形式的計算機可讀介質(zhì)包括,例如軟盤、軟性盤、硬盤、磁帶、或者任何其它磁性介質(zhì)、CD-ROM、任何其它光介質(zhì)、打孔紙、紙帶、任何帶孔圖樣的物理介質(zhì)、RAM、PROM、EPROM、FLASH-EPROM、任何其他存儲芯片或者盒式磁帶,以下提到的載波、或者計算機可讀的任何其他介質(zhì)。各種形式的計算機可讀介質(zhì)可參與將一個或者多個指令的一個或多個序列承載到處理器704用于執(zhí)行。例如,指令開始可被承載在遠程計算機的磁盤上。遠程計算機可以將指令加載到其動態(tài)存儲器中,然后使用調(diào)制解調(diào)器通過電話線發(fā)送指令。計算機系統(tǒng)700的本地調(diào)制解調(diào)器可接收電話線上的數(shù)據(jù),并使用紅外發(fā)射器將數(shù)據(jù)轉(zhuǎn)換成紅外信號。紅外探測器可以接收紅外信號中攜帶的數(shù)據(jù),并且合適的電路可以將數(shù)據(jù)放到總線702上??偩€702將數(shù)據(jù)承載到主存儲器706,處理器704從主存儲器取回并執(zhí)行這些指令。在由處理器704執(zhí)行這些指令之前或之后,由主存儲器706接收的指令可隨意地儲存在存儲裝置710上。例如,用于實施用于分區(qū)的結(jié)造或用于使數(shù)據(jù)稠密的結(jié)構(gòu)的指令可存儲到主存儲器706中和/或被此所述的任何計算機可讀介質(zhì)所承載。計算機系統(tǒng)700還包括耦合至總線702的通信接口718。提供雙向數(shù)據(jù)通信的通信接口718耦合到與局域網(wǎng)722連接的網(wǎng)絡鏈路720。例如,通信接口718可以是綜合業(yè)務數(shù)字網(wǎng)(ISDN)卡或者調(diào)制解調(diào)器,用于提供到相應類型的電話線的數(shù)據(jù)通信連接。作為另一實例,通信接口718可以是局域網(wǎng)(LAN)卡,用于提供至兼容LAN的數(shù)據(jù)通信連接。也可以采用無線鏈路。在任何這樣的實施中,通信接口718發(fā)送和接收承載表示各種類型的信息的數(shù)字數(shù)據(jù)流的電信號、電磁信號、和光學信號。網(wǎng)絡鏈路720通常通過一個或者多個網(wǎng)絡向其它數(shù)據(jù)裝置提供數(shù)據(jù)通信。例如,網(wǎng)絡鏈路720可通過局域網(wǎng)722提供到主機724的連接,或者到由互聯(lián)網(wǎng)服務提供商(ISP)726操作的數(shù)據(jù)設備的連接。ISP726又通過目前通常稱作“互聯(lián)網(wǎng)”728的全球分組數(shù)據(jù)通信網(wǎng)絡提供數(shù)據(jù)通信服務。局域網(wǎng)722和互聯(lián)網(wǎng)728都使用承載數(shù)字數(shù)據(jù)流的電信號、電磁信號、或光學信號。通過多種網(wǎng)絡的信號和網(wǎng)絡鏈路720上的信號以及通過通信接口718的信號,都傳送數(shù)字數(shù)據(jù)給計算機系統(tǒng)700或者傳送來自計算機系統(tǒng)的數(shù)字數(shù)據(jù),是傳輸信息的載波的示例性形式。計算機系統(tǒng)700能通過網(wǎng)絡、網(wǎng)絡鏈路720、和通信接口718發(fā)送消息和接收數(shù)據(jù)(包括程序代碼)。在互聯(lián)網(wǎng)的實例中,服務器730可通過互聯(lián)網(wǎng)728、ISP726、局域網(wǎng)722、和通信接口718,傳送用于應用程序的所請求的程序代碼。所接收的代碼可以在其接收時由處理器704執(zhí)行,和/或儲存在存儲裝置710或其它非易失性存儲器中用于隨后執(zhí)行。按照這種方式,計算機系統(tǒng)700可以以載波的形式獲得應用代碼。以上所述僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。權(quán)利要求1.一種由機器實現(xiàn)的方法,包括以下步驟基于與多個維相關(guān)的第一數(shù)據(jù)集合,生成相對于所述多個維的第一維比所述第一數(shù)據(jù)集合更稠密的第二數(shù)據(jù)集合;其中,所述第一數(shù)據(jù)集合包括多個數(shù)據(jù)子集;以及其中,所述生成步驟包括在每個所述數(shù)據(jù)子集和第三數(shù)據(jù)集合之間執(zhí)行外連接。2.根據(jù)權(quán)利要求1所述的方法,其中,所述第一數(shù)據(jù)集合包括與維值組合相關(guān)的行,其中,所述維值組合是從所述多個維選擇的維值的組合,其中,所述第二數(shù)據(jù)集合包括用于對應于所述第一數(shù)據(jù)集合的所述行的所述維值組合的對應行,其中,所述對應行與所述維值組合相關(guān),以及其中,所述生成的步驟包括以下步驟檢查在用于維值組合的集合的所述第二數(shù)據(jù)集合中是否存在對應的行,其中,所述維值組合的集合相對于一維而言是稠密的;以及如果所述對應的行不存在,則創(chuàng)建所述行。3.根據(jù)權(quán)利要求2所述的方法,其中,所述檢查步驟在一組嵌套的循環(huán)指令內(nèi)執(zhí)行,所述指令對于所述維值組合集合的每個維值組合執(zhí)行一次循環(huán)。4.根據(jù)權(quán)利要求1所述的方法,其中,每個所述數(shù)據(jù)子集是單個數(shù)據(jù)行。5.根據(jù)權(quán)利要求1所述的方法,其中,每個所述數(shù)據(jù)子集是所述第一數(shù)據(jù)集合的分區(qū),并且與從所述多個維的一個維中選擇的單一維值相關(guān)。6.根據(jù)權(quán)利要求1所述的方法,其中,響應于檢查數(shù)據(jù)操作語言語句來執(zhí)行所述生成步驟。7.根據(jù)權(quán)利要求1所述的方法,其中,所述生成步驟包括使用第一處理器對第一子集執(zhí)行所述外連接,以及使用不同于所述第一處理器的第二處理器對第二子集執(zhí)行所述外連接。8.根據(jù)權(quán)利要求7所述的方法,其中,所述外連接是右外連接。9.根據(jù)權(quán)利要求8所述的方法,其中,所述外連接是左外連接。10.根據(jù)權(quán)利要求1所述的方法,其中,所述生成步驟由SQL引擎執(zhí)行。11.根據(jù)權(quán)利要求1所述的方法,其中,所述生成步驟包括接收指示用于分區(qū)所述第一數(shù)據(jù)集合的分區(qū)鍵的表達式。12.根據(jù)權(quán)利要求1所述的方法,其中,所述外連接與包括布爾表達式的連接條件相關(guān)。13.根據(jù)權(quán)利要求1所述的方法,其中,所述第一數(shù)據(jù)集合包括行的第一集合;以及其中,所述外連接在所述行的第一集合和行的第二集合之間,以及所述生成步驟包括向多個進程中的每個進程發(fā)送所述行的第一集合的子集和所有所述行的第二集合。14.根據(jù)權(quán)利要求13所述的方法,其中,所述生成包括指定所述多個維的至少一個維;以及相對于所述指定的維散列分區(qū)所述第一數(shù)據(jù)集合。15.根據(jù)權(quán)利要求1所述的方法,進一步包括檢測包括條件的結(jié)構(gòu),所述條件限制哪些維值組合被包括在所述第二數(shù)據(jù)集合中;以及響應于檢測所述其它的結(jié)構(gòu),僅相對于所述第二數(shù)據(jù)集合被限制到的所述維值組合來執(zhí)行所述操作。16.根據(jù)權(quán)利要求1所述的方法,其中,所述第一數(shù)據(jù)集合與多個維相關(guān),所述第二集合與所述多個維相關(guān),以及所述第二數(shù)據(jù)集合相對于所述多個維中的一個維更加稠密。17.一種由機器實現(xiàn)的方法包括基于與多個維相關(guān)的第一數(shù)據(jù)集合,生成相對于所述多個維的第一維比所述第一數(shù)據(jù)集合更稠密的第二數(shù)據(jù)集合;其中,執(zhí)行所述生成,而不執(zhí)行用于所述多個維的第二維的不同值的所述第一數(shù)據(jù)集合的排序的組合,通過執(zhí)行所找到的所述不同值和所述第一維的維值集合的叉積,生成行的第一集合,以及為在所述行的第一集合中不存在行的所述行的第一集合添加對應于所述維值集合的維值的行。18.根據(jù)權(quán)利要求17所述的由機器實現(xiàn)的方法,其中,執(zhí)行所述生成,而不執(zhí)行所述第一數(shù)據(jù)集合的排序,其中,所述第一數(shù)據(jù)集合的所述排序被用于找到所述多個維的第二維的不同值。19.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求1中所述的方法。20.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求2中所述的方法。21.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求3中所述的方法。22.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求4中所述的方法。23.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求5中所述的方法。24.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求6中所述的方法。25.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求7中所述的方法。26.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求8中所述的方法。27.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求9中所述的方法。28.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求10中所述的方法。29.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求11中所述的方法。30.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求12中所述的方法。31.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求13中所述的方法。32.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求14中所述的方法。33.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求15中所述的方法。34.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求16中所述的方法。35.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求17中所述的方法。36.一種機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求18中所述的方法。37.一種系統(tǒng)包括一個或多個處理器;以及機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求1中所述的方法。38.一種系統(tǒng)包括一個或多個處理器;以及機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求17中所述的方法。39.一種系統(tǒng)包含一個或多個處理器;以及機器可讀介質(zhì),承載有一個或多個指令序列,當所述指令序列被一個或多個處理器執(zhí)行時,使所述一個或多個處理器執(zhí)行在權(quán)利要求18中所述的方法。全文摘要提供了一種用于數(shù)據(jù)的稠化的方法和裝置。提供了一種用于包括用于在DML語句內(nèi)分區(qū)數(shù)據(jù)的結(jié)構(gòu)的方法和裝置。用于分區(qū)數(shù)據(jù)的結(jié)構(gòu)不必執(zhí)行數(shù)據(jù)的稠化,以及數(shù)據(jù)的稠化不必包括用于分區(qū)數(shù)據(jù)的結(jié)構(gòu)。在實施例中,OUTERJOIN的語法被擴展為包括可以用于數(shù)據(jù)稠化的PARTITIONBY結(jié)構(gòu)。文檔編號G06F17/30GK1867912SQ200480024005公開日2006年11月22日申請日期2004年8月19日優(yōu)先權(quán)日2003年8月22日發(fā)明者阿比希納夫·古普塔,盛磊,??枴ぬK布拉馬尼亞恩,內(nèi)森·福爾克特申請人:甲骨文國際公司