數(shù)據(jù)庫的模式是規(guī)定義如何構(gòu)建數(shù)據(jù)庫的數(shù)據(jù)的組織。例如,在關(guān)系數(shù)據(jù)庫中,模式規(guī)定如何通過定義表、字段、關(guān)系、視圖、索引、函數(shù)、隊列、觸發(fā)器、類型和其他方面來存儲和管理數(shù)據(jù)。對于半結(jié)構(gòu)化數(shù)據(jù)、多租戶數(shù)據(jù)庫以及許多其他情形期望管理具有靈活模式的數(shù)據(jù)。
目前,具有靈活模式的各種應(yīng)用遭遇模式常常未被良好定義并且可能隨時間演變的問題。諸如結(jié)構(gòu)化查詢語言(SQL)數(shù)據(jù)庫的傳統(tǒng)數(shù)據(jù)庫具有支持有效模式演變的困難。如已知的,模式演變可以例如當(dāng)將一對一關(guān)系演變?yōu)槎鄬σ魂P(guān)系時要求重新規(guī)范化和表重新分區(qū)。由于從舊表到新表的數(shù)據(jù)遷移,表重新分區(qū)是耗時的。額外地,該過程由于在舊表和新表上的互斥鎖,常常需要阻斷事務(wù)。為了避免這些問題,應(yīng)用通常不允許在線重新規(guī)范化和表重新分區(qū),由此在存在模式演變時引入相當(dāng)多的停機時間。
針對靈活模式的傳統(tǒng)解決方案常常在鍵值對的基礎(chǔ)上進行工作,以避免在模式演變時的重新規(guī)范化和表重新分區(qū)。例如,已經(jīng)提出了用于靈活模式的關(guān)聯(lián)數(shù)組。關(guān)聯(lián)數(shù)組是表示實體的原子字段以及稍后用于重新構(gòu)建數(shù)據(jù)的內(nèi)部/外部關(guān)系的鍵值對的集合。關(guān)聯(lián)數(shù)組可以將數(shù)據(jù)引擎從重新規(guī)范化和表重新分區(qū)解除。然而,在沒有數(shù)據(jù)規(guī)范化的情況下,將任何兩個實體或?qū)傩赃M行連接必須要求連接操作。作為結(jié)果,對關(guān)聯(lián)數(shù)組的使用將引入過多的連接操作,并且因此降低數(shù)據(jù)庫的查詢性能。具體地,已發(fā)現(xiàn)當(dāng)查詢超出簡單謂詞選擇時查詢性能動態(tài)地下降,并且它們的運行計劃涉及在鍵值存儲上的大量連接。另外,鍵值對在數(shù)據(jù)規(guī)范化不能夠被省略的情況下不適用于那些應(yīng)用。
技術(shù)實現(xiàn)要素:
本文中描述的主題的實施例大體涉及管理具有用于使模式演變中的數(shù)據(jù)遷移最小化的模式的數(shù)據(jù)。
一個實施例提供至少部分地由計算機實現(xiàn)的方法。該方法包括:提供針對數(shù)據(jù)庫的邏輯表的邏輯視圖;以及根據(jù)預(yù)定義映射約束來管理在邏輯表與物理表之間的映射,邏輯表中的每個被映射為物理表的一部分。映射約束至少規(guī)定:(i)邏輯表中的邏輯列被映射到物理表中的至少一個物理列,并且(ii)邏輯表中的一個中的不同邏輯列被映射到物理表中的不同物理列。
另一實施例提供一種計算機可讀介質(zhì)。該計算機存儲介質(zhì)具有計算機可執(zhí)行指令,該計算機可執(zhí)行指令當(dāng)運行時執(zhí)行包括以下各項的動作:提供針對數(shù)據(jù)庫的邏輯表的邏輯視圖;以及根據(jù)預(yù)定義映射約束來管理在邏輯表與物理表之間的映射,邏輯表中的每個被映射為物理表的一部分,映射約束至少規(guī)定:(i)邏輯表中的邏輯列被映射到物理表中的至少一個物理列,并且(ii)邏輯表中的一個中的不同邏輯列被映射到物理表中的不同物理列。
又一實施例提供一種計算環(huán)境中的系統(tǒng)。該系統(tǒng)包括:邏輯視圖管理器,其被配置為提供針對數(shù)據(jù)庫的邏輯表的邏輯視圖;以及映射管理器,其被配置為根據(jù)預(yù)定義映射約束來管理在邏輯表與物理表之間的映射,邏輯表中的每個被映射為物理表的一部分,映射約束至少規(guī)定:(i)邏輯表中的邏輯列被映射到物理表中的至少一個物理列,并且(ii)邏輯表中的一個中的不同邏輯列被映射到物理表中的不同物理列。
根據(jù)本文中描述的主題的實施例,針對數(shù)據(jù)庫的邏輯表的邏輯視圖被呈現(xiàn)給應(yīng)用。在內(nèi)部,這些邏輯表在某些約束下作為子表被映射到物理表中。以這種方式,對邏輯表的查詢可以就像表被存儲在傳統(tǒng)數(shù)據(jù)庫一樣以相同數(shù)目的物理連接來運行。在本公開的上下文中,術(shù)語“查詢”包括檢索操作和更新操作兩者。邏輯表的模式演變可以容易地通過具有最小化的數(shù)據(jù)遷移的一系列映射更新來實現(xiàn)。作為結(jié)果,模式演變的效率與傳統(tǒng)物理表重新分區(qū)相比較被顯著地改進。此外,在沒有數(shù)據(jù)和查詢引擎的重大重新設(shè)計的情況下,實現(xiàn)具有已知數(shù)據(jù)庫和應(yīng)用的良好兼容性。
要理解,本發(fā)明內(nèi)容被提供從而以簡化的形式介紹構(gòu)思的選擇。下面在具體實施方式中進一步描述這些構(gòu)思。本發(fā)明內(nèi)容不旨在標(biāo)識要求保護的主題的關(guān)鍵特征或必要特征,也不旨在用于限制要求保護的主題的范圍。
附圖說明
圖1圖示了本文中描述的主題的實施例可以被實現(xiàn)在其中的計算環(huán)境的框圖;
圖2圖示了根據(jù)本文中描述的主題的實施例的數(shù)據(jù)庫系統(tǒng)的框圖;
圖3圖示了根據(jù)本文中描述的主題的實施例的邏輯表和物理表的示例;
圖4圖示了根據(jù)本文中描述的主題的實施例的表示映射函數(shù)的表的示例;
圖5圖示了根據(jù)本文中描述的主題的實施例的垂直分區(qū)的示例;
圖6圖示了根據(jù)本文中描述的主題的實施例的在具有引用的垂直分區(qū)之后的物理表和映射函數(shù)的示例;
圖7圖示了根據(jù)本文中描述的主題的實施例的兩個重疊的事務(wù)的示例;
圖8圖示了根據(jù)本文中描述的主題的實施例的用于管理具有靈活模式的數(shù)據(jù)的方法的流程圖;以及
圖9圖示了根據(jù)本文中描述的主題的實施例的用于管理具有靈活模式的數(shù)據(jù)的系統(tǒng)的框圖。
具體實施方式
現(xiàn)在將參考幾個示例實施例討論本文中描述的主題。將理解,這些實施例僅僅出于使得本領(lǐng)域技術(shù)人員能夠更好地理解并且因此實現(xiàn)本文中描述的主題的目的來討論,而非暗示對本主題的范圍的任何限制。
如本文中所使用的,術(shù)語“包括”及其變型要被理解為意指“包括但不限于”的開放式術(shù)語。術(shù)語“或者”要被理解為“和/或”,除非上下文另行清楚指示。術(shù)語“基于”要被理解為“至少部分地基于”。術(shù)語“一個實施例”和“實施例”要被理解為“至少一個實施例”。術(shù)語“另一實施例”要被理解為“至少一個其他實施例”。下面可以包含顯式的和隱式的其他定義。
圖1圖示了所描述的主題的一個或多個實施例可以被實現(xiàn)在其中的計算環(huán)境100的示例。計算環(huán)境100不旨在暗示對本文中描述的主題的使用或功能的范圍的任何限制,因為各種實施例可以被實現(xiàn)在各種各樣的通用或?qū)S糜嬎悱h(huán)境中。
參考圖1,計算環(huán)境100包括至少一個處理單元(或處理器)110和存儲器120。處理單元110運行計算機可執(zhí)行指令并且可以為真實處理器或虛擬處理器。在多處理系統(tǒng)中,多個處理單元運行計算機可執(zhí)行指令以提高處理功率。存儲器120可以為易失性存儲器(例如,寄存器、高速緩存、RAM)、非易失性存儲器(例如,ROM、EEPROM、閃存)或這兩者的某種組合。存儲器120至少存儲用于管理具有靈活模式的數(shù)據(jù)的軟件170的部分。
計算環(huán)境100可以具有額外的組件或特征。在圖1中示出的示例中,計算環(huán)境100包括存儲裝置130、一個或多個輸入設(shè)備140、一個或多個輸出設(shè)備150以及一個或多個通信連接160。諸如總線、控制器或網(wǎng)絡(luò)的互連機構(gòu)(未示出)將計算環(huán)境100的組件相互連接。通常,操作系統(tǒng)軟件(未示出)提供針對在計算環(huán)境100中運行的其他軟件的操作環(huán)境,并且協(xié)同計算環(huán)境100的組件的活動。
存儲裝置130可以為可移除的或不可移除的,并且可以包括諸如閃速驅(qū)動器、磁盤、磁帶或磁帶盒、CD-ROM、CD-RW、DVD的計算機可讀存儲介質(zhì)、或者能夠被用于存儲信息并且能夠在計算環(huán)境100內(nèi)被訪問的任何其他介質(zhì)。存儲裝置130可以至少存儲針對軟件170的指令的部分。
(多個)輸入設(shè)備140可以為各種不同的輸入設(shè)備中的一個或多個。例如,(多個)輸入設(shè)備140可以包括用戶設(shè)備,例如鼠標(biāo)、鍵盤、軌跡球、等等。(多個)輸入設(shè)備140可以實現(xiàn)一種或多種自然用戶接口技術(shù),例如語音識別、觸摸和觸筆識別、與(多個)輸入設(shè)備140相接觸并且與(多個)輸入設(shè)備140相鄰的手勢的識別、空中手勢的識別、頭和眼跟蹤、聲音和語音識別、感測用戶大腦活動以及機器智能。作為其他示例,(多個)輸入設(shè)備140可以包括掃描設(shè)備;網(wǎng)絡(luò)適配器;CD/DVD閱讀器;或者提供到計算環(huán)境100的輸入的另一設(shè)備。(多個)輸出設(shè)備150可以為顯示器、打印機、揚聲器、CD/DVD刻錄機、網(wǎng)絡(luò)適配器、或提供來自計算環(huán)境100的輸出的另一設(shè)備。(多個)輸入設(shè)備140和(多個)輸出設(shè)備150可以被并入在單個系統(tǒng)或設(shè)備(例如觸摸屏或虛擬顯示系統(tǒng))中。
(多個)通信連接160使能通過通信介質(zhì)到另一計算實體的通信。額外地,計算環(huán)境100的組件的功能可以被實現(xiàn)在單個計算機器中或者被實現(xiàn)在能夠通過通信連接進行通信的多個計算機器中。因此,計算環(huán)境100可以操作于使用到一個或多個遠程計算設(shè)備的邏輯連接的網(wǎng)絡(luò)化環(huán)境中,一個或多個遠程計算設(shè)備例如為手持計算設(shè)備、個人計算機、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對等設(shè)備或另一公共網(wǎng)絡(luò)節(jié)點。通信介質(zhì)傳達諸如經(jīng)調(diào)制的數(shù)據(jù)信號中的數(shù)據(jù)或計算機可執(zhí)行指令或請求的信息。經(jīng)調(diào)制的數(shù)據(jù)信號是具有以使得在信號中編碼信息的方式設(shè)置或改變其特性中的一個或多個的信號。通過舉例而非限制的方式,通信介質(zhì)包括利用電氣載體、光學(xué)載體、RF載體、紅外載體、聲學(xué)載體或其他載體實現(xiàn)的有線或無線技術(shù)。
本主題的實施例能夠在計算機可讀介質(zhì)的總體上下文中進行描述,計算機可讀介質(zhì)可以為存儲介質(zhì)或通信介質(zhì)。計算機可讀存儲介質(zhì)是能夠在計算環(huán)境內(nèi)被訪問的任何可用存儲介質(zhì),但是術(shù)語計算機可讀存儲介質(zhì)不指代傳播的信號本身。通過舉例而非限制的方式,在計算環(huán)境100內(nèi),計算機可讀存儲介質(zhì)包括存儲器120、存儲裝置130及其組合。
本主題的實施例能夠在計算機可讀指令的總體上下文中進行描述,計算機可讀指令例如為包含于程序模塊中的在計算環(huán)境中被運行在目標(biāo)真實或虛擬處理器上的那些??傮w上,程序模塊包括例程、程序、庫、對象、類、組件、數(shù)據(jù)結(jié)構(gòu)、等等,其執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型。程序模塊的功能可以根據(jù)期望在各種實施例中在程序模塊之間被組合或被拆分。針對程序模塊的計算機可執(zhí)行指令可以被運行在本地或分布式計算環(huán)境內(nèi)。在分布式計算環(huán)境中,程序模塊可以被定位在本地和遠程計算機存儲介質(zhì)兩者中。
圖2圖示了根據(jù)本文中描述的主題的實施例的示例數(shù)據(jù)庫系統(tǒng)200。數(shù)據(jù)庫系統(tǒng)200可以被實現(xiàn)在任何底層數(shù)據(jù)庫之上,無論是當(dāng)前已知的還是未來開發(fā)的。盡管將在下文中結(jié)合SQL數(shù)據(jù)庫討論一些實施例,但是這僅僅是出于說明的目的而不暗示對本文中描述的主題的范圍的任何限制。本文中描述的主題可以以任何適當(dāng)?shù)臄?shù)據(jù)庫來體現(xiàn)。
參考圖2,數(shù)據(jù)庫系統(tǒng)200包括一個或多個邏輯表2101、2102、…、210n(統(tǒng)稱為(多個)邏輯表210)和物理表220。為了調(diào)和在數(shù)據(jù)規(guī)范化/表重新分區(qū)與模式演變之間的緊張,數(shù)據(jù)庫系統(tǒng)200將邏輯表210的邏輯視圖230提供到高級應(yīng)用。從應(yīng)用的視角,邏輯表210可以就像它們被物理地存儲在數(shù)據(jù)庫系統(tǒng)200中一樣地操作。(多個)應(yīng)用可以通過邏輯視圖230對邏輯表210進行操作。在數(shù)據(jù)庫系統(tǒng)200內(nèi)部,多個邏輯表210被映射到物理表220中,使得這些邏輯表210中的每個被映射為物理表220的一部分或“子表”。在操作時,對邏輯表210的查詢將至少部分地基于在邏輯表210與物理表220之間的映射240而被轉(zhuǎn)化為對物理表220的查詢。
在數(shù)據(jù)庫系統(tǒng)200中,根據(jù)預(yù)定義映射約束的集合來創(chuàng)建、維持和/或更新在邏輯表210與物理表220之間的映射240。在一個實施例中,映射約束可以是:邏輯表210中的每個邏輯列被映射到物理表220中的至少一個物理列,其中邏輯列和所映射的物理列具有相同的數(shù)據(jù)類型。在映射240上的另一約束可以是:在邏輯表210中的任何一個中的不同邏輯列應(yīng)當(dāng)被映射到物理表220中的不同物理列。即,一個邏輯表210中的任何兩列必須被映射到物理表220中的分開的物理列。
要理解,在本文中描述的主題的上下文中,邏輯表或物理表的“列”可以被定義在表的垂直維度或水平維度上。即,盡管傳統(tǒng)上在垂直維度上定義列,但是如所討論的將表的水平維度定義為列并對列進行映射也落入本文中描述的主題的范圍內(nèi)。
將認(rèn)識到,在邏輯表210與物理表220之間的映射240不必是單射的,因為來自兩個不同邏輯表210的相同數(shù)據(jù)類型的兩列可以被映射到物理表220中的單個物理列中。因此,邏輯表可以容易地被重建用于稍后將討論的模式演變。
圖3示出了邏輯表210和物理表220的示例。在該示例中,存在用于客戶關(guān)系管理(CRM)應(yīng)用的兩個邏輯表2101和2102。如所示出的,邏輯表“Rcust”2101利用主鍵CustID存儲客戶數(shù)據(jù),并且邏輯表“Rcont”2102利用主鍵ContID和引用邏輯表2101的外鍵CustID存儲合同數(shù)據(jù)。外鍵CustID呈現(xiàn)在合同與客戶之間的多對一關(guān)系。在該示例中,邏輯表Rcust 2101和Rcont 2102中的每個被映射為具有五個物理列的物理表“T”220中的一部分。能夠看出,映射符合如以上所討論的約束。即,每個邏輯列被映射到物理列,并且來自一個邏輯表的任何兩個邏輯列被映射到兩個分開的物理列。具體地,能夠看出,在該示例中,來自邏輯表Rcust2101的邏輯列310和來自邏輯表Rcont2102的邏輯列320(其具有相同數(shù)據(jù)類型)被映射到物理表220中的單個物理列330,即使邏輯列310和320在語義上不相關(guān)。
在圖3中示出的示例中,邏輯表210中的每個邏輯列被映射到物理表220中的單個物理列。要理解,本文中描述的主題在這一點上不受限制。在備選實施例中,邏輯列能夠被映射到不止一個物理列以便更好地支持將在稍后討論的模式演變。
物理表220中的物理列的數(shù)目可以基于邏輯表210中的邏輯列的數(shù)目和邏輯列的不同數(shù)據(jù)類型的數(shù)目來確定。例如,在一個實施例中,物理列的數(shù)目由TypeCount×max{width(R1),..,width(Rn)}限制,其中Ri表示第i個邏輯表210,TypeCount表示在邏輯表210中聲明的不同數(shù)據(jù)類型的數(shù)目,并且width(Ri)表示在邏輯表Ri中的列的數(shù)目。例如,在一個實施例中,物理列的數(shù)目的上限可以被確定為:
其中,ColumnCount(Ri,datatype)表示在類型datatype的邏輯表Ri中的列的數(shù)目。因此,物理表220的寬度可以由數(shù)據(jù)類型的數(shù)目及其在單個邏輯表210中的最大出現(xiàn)而非邏輯表210的數(shù)目限制。這將是有益的,因為具有靈活模式的應(yīng)用通常需要在數(shù)據(jù)被規(guī)范化的情況下維持大量邏輯表。
另外,隨著在邏輯表210中聲明的不同數(shù)據(jù)類型的數(shù)目增加,在物理表220中的物理列的數(shù)目將增加。當(dāng)在邏輯表210中存在許多不同數(shù)據(jù)類型時,物理表220可以很寬。將認(rèn)識到,在物理表220變得太寬的情況下,可能影響操作效率。此外,數(shù)據(jù)庫系統(tǒng)200可以具有關(guān)于物理表220的寬度的上限。為了防止物理列的數(shù)目變得太大,可以應(yīng)用類型轉(zhuǎn)換。例如,在一個實施例中,類型投射可以被用于將多個不同的類型轉(zhuǎn)換成一種類型。通過舉例的方式,所有基于字符串的類型可以被投射為可變字符(max)。任何額外的或備選的類型轉(zhuǎn)換技術(shù)也是可能的。
限制物理列的數(shù)目的另一可能方式是要使用多個物理表來托管邏輯表,使得一些邏輯列被映射到一個物理表,并且其他邏輯列被映射到另一物理表。在一個實施例中,兩個物理表可以被配置為兩者都將列填充為物理記錄的物理標(biāo)識符。以這種方式,來自兩個物理表的兩條記錄能夠被連接為一條記錄。
為了支持查詢處理和邏輯表重建,根據(jù)本文中描述的主題的實施例,在物理表220中的記錄與它們的原始邏輯表210之間的關(guān)聯(lián)可以例如基于邏輯表的標(biāo)識符來維持。標(biāo)識符可以是下面被描述為數(shù)字的適當(dāng)?shù)臉?biāo)識符。備選地或額外地,標(biāo)識符可以是任何參考字符、符號或其組合。具體地,仍然參考圖3,物理表220具有列“coltid”340。在一個實施例中,列340的每個字段被填充有從其映射對應(yīng)的記錄的邏輯表210的標(biāo)識符。通過舉例的方式,在記錄350中,列340的值“1”指示記錄350從其標(biāo)識符為“1”的邏輯表Rcust 2101被映射。基于映射和記錄關(guān)聯(lián),每個邏輯表210可以被完全重建。
具體地,在圖3的示例中,每個邏輯表210具有單個標(biāo)識符。然而,要理解,本文中描述的主題在這一點上不受限制。在備選實施例中,記錄關(guān)聯(lián)使得邏輯表210能夠具有不止一個標(biāo)識符。備選地或額外地,在一個實施例中,兩個或更多個邏輯表可以共享單個標(biāo)識符。作為結(jié)果,物理記錄可以包含來自不止一個邏輯表210的元素。以這種方式,模式演變可以在沒有數(shù)據(jù)遷移的情況下來完成。例如,當(dāng)將邏輯表分區(qū)成兩個或更多個新邏輯表時,映射使得新邏輯表中的每個在繼承初始邏輯表的舊標(biāo)識符的同時具有它自己的新標(biāo)識符。以這種方式,能夠避免數(shù)據(jù)遷移。將在稍后討論示例實施例。
在下文中,將參考圖3中示出的其中“coltid”340被用于將物理記錄與它們的原始邏輯表210相關(guān)聯(lián)的示例討論一些實施例。這僅僅出于說明的目的,而不暗示對本文中描述的主題的任何限制。代替使用物理表220中的專門的列,這樣的關(guān)聯(lián)可以以任何其他適當(dāng)?shù)姆绞絹眢w現(xiàn)。例如,在一個實施例中,在物理表220中的物理記錄與原始邏輯表210之間的關(guān)聯(lián)可以被維持在與物理表220分開的文件中,或者基于物理表220中的不為空的列的集合來推斷。
在實現(xiàn)方式中,在邏輯表210與物理表220之間的映射240可以以不同的方式來體現(xiàn)。通過舉例的方式,在一個實施例中,映射240通過兩個映射函數(shù)來實現(xiàn)。被表示為φ的第一映射函數(shù)將邏輯表210中的邏輯列映射到物理表220中的一個或多個物理列。被表示為ψ的第二映射函數(shù)返回給定邏輯表210的(多個)標(biāo)識符。例如,在圖3中示出的示例中,被存儲在列“coltid”340中的值可以由第二映射函數(shù)ψ獲得。
在一個實施例中,一起形成映射240的映射函數(shù)φ和ψ可以分別由如圖4中示出的兩個表Mφ和Mψ表示。如所示出的,表Mφ410被用于存儲第一映射函數(shù)φ,并且表Mψ420被用于表示第二映射函數(shù)ψ。在該示例中,表420呈現(xiàn)其中邏輯表210中的每個具有一個標(biāo)識符的一對一關(guān)系。然而,如以上所討論的,本文中描述的主題不限于此。隨著針對邏輯表210的模式演變,這樣的關(guān)系可以被改變使得每個邏輯表具有兩個或更多個標(biāo)識符。
在一些實施例的下面的討論中,映射240將被描述為包括第一映射函數(shù)φ和第二映射函數(shù)ψ。要理解,這僅僅出于說明的目的,而不暗示對本文中描述的主題的任何限制。映射240可以以任何其他適當(dāng)?shù)姆绞絹肀硎竞?或存儲。為討論起見,術(shù)語φ和Mφ能夠被互換地使用,并且術(shù)語ψ和Mψ能夠被互換地使用。
通過根據(jù)如以上所討論的約束將邏輯表210映射到物理表220中,得到的物理表220可以在一些情況下是稀疏的。將認(rèn)識到,針對物理表220中的任何物理記錄,非空字段的數(shù)目不多于其原始邏輯表210的寬度,其能夠比在物理表220中聲明的物理列的數(shù)目少得多。這樣寬的稀疏的物理表220不能夠在一些關(guān)系數(shù)據(jù)庫中得到有效地支持。例如,當(dāng)在物理列中存在大量空字段時,將浪費存儲空間。
為了更好地支持稀疏物理列,在一個實施例中,用于物理列的存儲空間可以基于物理列的密度來控制。如本文中所使用的,術(shù)語物理列的術(shù)語“密度”是指物理列中的非空值的百分比或數(shù)目。在一個實施例中,如果物理系列的密度被確定為在預(yù)定義閾值以下,則用于物理列的存儲空間可以被減少。為此,在一個實施例中,物理表220中的一個或多個物理列可以取決于它們的密度而被聲明為稀疏列或常規(guī)列。即,如果物理列的密度在預(yù)定義閾值以下,則物理列可以被聲明為稀疏,使得沒有存儲空間被分配給其中的空值。針對稀疏列,屬性值對被物理地用于表示每個非空值,并且空值被自動省略,由此節(jié)省存儲資源。當(dāng)記錄被檢索時,未出現(xiàn)的列可以被假設(shè)為空值。
聲明稀疏列具有相關(guān)聯(lián)的處理開銷。例如,與傳統(tǒng)列相比,稀疏列要求針對那些非空值的更多存儲空間。為了避免這樣的開銷,在另一實施例中,物理表220可以通過復(fù)用物理列來管理。例如,在一個實施例中,當(dāng)邏輯列被映射到物理表220時,能夠首先嘗試使用現(xiàn)有物理列,代替在物理表220中分配新物理列。以這種方式,更多的物理列能夠被保持致密并且因此可以被聲明為常規(guī)列。
在一個實施例中,為了加速查詢處理,過濾的索引可以被用于物理表220。通過舉例的方式,過濾的索引被構(gòu)建為使用WHERE子句來索引物理表220中的行的僅僅一部分的索引結(jié)構(gòu)。當(dāng)應(yīng)用例如通過以下來子句創(chuàng)建在邏輯表R的邏輯列Ai上的索引時:
CREATE INDEX indexName on R(Ai),
過濾的索引如下地排除物理表220中的屬于其他邏輯表210的那些記錄:
CREATE INDEX indexName on T(φ(Ai))
WHERE coltid=ψ(R)AND Ai IS NOT NULL
其中T表示物理表220。這樣的過濾的索引可以用于創(chuàng)建統(tǒng)計信息。過濾的索引和統(tǒng)計信息提供就像邏輯表被物理地創(chuàng)建一樣地將查詢優(yōu)化器引導(dǎo)到運行計劃的機制。
如以上所討論的,應(yīng)用可以就像(多個)邏輯表210被物理地存儲在數(shù)據(jù)庫系統(tǒng)200中一樣地在(多個)邏輯表210上進行操作。在數(shù)據(jù)庫系統(tǒng)200內(nèi)部,對邏輯表的查詢將至少部分地基于映射240來處理。具體地,響應(yīng)于通過邏輯視圖接收到對一個或多個邏輯表210的查詢,數(shù)據(jù)庫系統(tǒng)200至少部分地基于映射240來將接收到的邏輯查詢轉(zhuǎn)化為對物理表220的查詢。
一般地,查詢轉(zhuǎn)化通過經(jīng)由到其對應(yīng)物理表的引用替換到邏輯表的每個引用來完成。例如,在一個實施例中,針對查詢框中的每個邏輯表R 210,映射被用于利用物理表220的別名Tk來替換R。例如借助于WHERE子句確定R的記錄被映射到其的物理行來添加連接條件。之后,查詢中的邏輯列的引用利用其對應(yīng)的物理列來替換。
通過舉例的方式,考慮如圖3所示的對邏輯表210的邏輯查詢,其檢索與“James”相關(guān)聯(lián)的賬單的總量。查詢包括在Rcust.Name上的選擇、在Rcust與Rcont之間的外鍵連接以及在Rcont.Bill上的聚合。對邏輯表210的原始查詢可以為如下:
SELECT COUNT(Rcont.Bill)
FROM RcustJOIN Rcont on Rcust.CustlD=Rcont.CustlD
WHERE Rcust.Name=`James′
在一個實施例中,該原始查詢?nèi)缦碌乇晦D(zhuǎn)化為對物理表220的查詢:
SELECT COUNT(Rcont.col2)
FROM T AS Rcust JOIN T AS Rcont ON Rcust.col1=Rcontcol3
WHERE Rcust.coltid=1 AND Rcont.coltid=2AND
Rcustcol4=`James′
涉及DELETE和UPDATE的查詢可以與SELECT查詢類似地被轉(zhuǎn)化。針對INSERT查詢,轉(zhuǎn)化可以通過指示所查詢的邏輯表的記錄被映射到其的物理行來完成。例如,如在下面所示出的,列coltid可以被添加以將(以上的)原始語句轉(zhuǎn)化為物理查詢:
VALUES(ψ(R),v1,...,vm)
數(shù)據(jù)庫系統(tǒng)200允許具有最小的數(shù)據(jù)遷移的邏輯表210的有效模式演變。一般而言,至少部分地通過修改在邏輯表210與物理表220之間的映射240來使邏輯表210的模式演變。更具體地,當(dāng)通過邏輯視圖接收到的事務(wù)包括針對一個或多個邏輯表210的模式的演變的請求時,僅僅有必要更新映射(并且可能地在一些情況下更新物理表220本身)。利用如以上所討論的映射機制,在大多數(shù)情況下可以避免由模式演變引起的數(shù)據(jù)遷移。具體地,已知應(yīng)用可以請求使用模式演變原語的集合來使模式演變。在這樣的實施例中,模式演變原語被轉(zhuǎn)化為更新映射240的一組語句。以這種方式,模式能夠在確保與現(xiàn)有數(shù)據(jù)庫的良好兼容性的同時被有效地演變。
出于說明的目的,現(xiàn)在將討論模式演變的一些示例。在一個實施例中,模式演變包括將(多個)列添加到邏輯表210。在數(shù)據(jù)庫系統(tǒng)200中,通過將物理列分配到物理表并且通過更新用于根據(jù)映射約束來將所添加的邏輯列映射到物理列的映射來完成對(多個)列的添加。當(dāng)沒有物理列可用時,新物理列被添加到物理表220并被分配用于該新邏輯列。在一個實施例中,新列僅僅具有默認(rèn)未被填充在解釋的存儲中的空值。僅僅當(dāng)查詢更新列中的值時,經(jīng)更新的物理記錄被擴展。因此,將新物理列添加到物理表220不會引起物理擴展。
通過舉例的方式,當(dāng)數(shù)據(jù)庫系統(tǒng)200被構(gòu)建在SQL數(shù)據(jù)庫上時,應(yīng)用可以請求使用下面的原語將列Am+1添加到邏輯表R:
ALTER TABLERADD Am+1 dataType;
在一個實施例中,該原語被轉(zhuǎn)化為用于更新映射的下面的語句:
ALTER TABLE T ADDcolM+1 dataType;
INSERT INTO TABLEMφ VALUES(Am+1,R,colM+1);
另一種類的模式演變是從邏輯表210移除(多個)列。在一個實施例中,通過移除關(guān)于該邏輯列的映射來從邏輯表移除邏輯列。例如,應(yīng)用可以請求使用以下原語從邏輯表R移除列Am+1:
ALTER TABLE R DROP Am+1;
在一個實施例中,關(guān)于所移除的邏輯列和對應(yīng)的物理列的映射可以如下地從映射函數(shù)φ被刪除:
DELETE FROM TABLE Mφ
WHERE logCol=Am+1 AND logTab=`R′;
只要該DELETE語句提交,則可以使邏輯列Am+1被映射到其的物理列對應(yīng)用不可見。將認(rèn)識到,來自邏輯表的物理記錄可以在記錄在移除的列中具有非空值的情況下占用更多的空間。為此,在一個實施例中,如果數(shù)據(jù)庫未經(jīng)歷高工作負(fù)載量,則另一語句被發(fā)出以清除這些記錄。
模式演變還包括將一個邏輯表拆分成兩個或更多個邏輯表的垂直分區(qū)。在傳統(tǒng)數(shù)據(jù)庫中,垂直分區(qū)是代價非常高的,因為要被分區(qū)的表R中的物理記錄必須從盤被讀取,被拆分成兩個記錄,并且之后分開地被插入到兩個得到的表R1和R2中。該過程尤其當(dāng)表具有較大大小時是耗時的。相反,如以上所討論的,本文中描述的主題的實施例使得邏輯表210能夠具有不止一個標(biāo)識符。在分區(qū)的情況下,該能力使得垂直分區(qū)能夠具有引用現(xiàn)有物理模式的一個標(biāo)識符和引用新物理模式的另一標(biāo)識符。其還使得兩個或更多個邏輯表能夠共享使得兩個分區(qū)能夠引用現(xiàn)有物理模式的單個標(biāo)識符。此外,物理表220中的每個物理列可以對所有邏輯表210可見。這樣的映射機制使得能夠在沒有數(shù)據(jù)遷移的情況下進行垂直分區(qū)。
更具體地,邏輯表210可以通過邏輯表標(biāo)識符的繼承來分區(qū)。在一個實施例中,這樣的繼承通過更新映射函數(shù)ψ來實現(xiàn)。在這樣的實施例中,當(dāng)邏輯表R要被垂直地分區(qū)成兩個新邏輯表R1和R2時,新表R1和R2中的每個可以具有兩個標(biāo)識符。即,ψ(R1)和ψ(R2)兩者引用R的舊標(biāo)識符以及它們自己的新標(biāo)識符。因此,在對R1的查詢中,R1的選擇可以被轉(zhuǎn)化為選擇滿足coltid=ψ(R1)的物理記錄。例如,應(yīng)用可以發(fā)出用于如下地從R1選擇列A1的查詢:
SELECT A1
FROM R1
在一個實施例中,該查詢被轉(zhuǎn)化為下面的語句,其返回屬于舊表R的物理記錄以及在分區(qū)之后被插入到R1中的記錄。
通過舉例的方式,參考圖3,其中地址被原始地存儲在邏輯表Rcust中,假設(shè)應(yīng)用例如使用以下原語請求將邏輯表Rcust分區(qū)成兩個新表和Raddr:
PARTITION Rcust(CustlD,Name,Address)INTO
Raddr(Address)
在分區(qū)之后,和Raddr單獨地演變。之后,假設(shè)新客戶和新地址被插入到兩個表中。如圖5所示,在物理表T220中,新插入的元組(在圖中突出顯示)被標(biāo)注有兩個表的新標(biāo)識符“3”和“4”。圖5中的經(jīng)更新的表Mψ 420示出了對應(yīng)的經(jīng)更新的映射函數(shù)ψ。如所示出的,和Raddr兩者繼承舊表Rcust的標(biāo)識符“1”并且分別具有它們自己的新標(biāo)識符“3”和“4”。以這種方式,沒有數(shù)據(jù)需要被遷移。
在一個實施例中,新表可以使用以下語句來重建:
在操作時,應(yīng)用可以例如使用以下原語請求將表R分區(qū)成R1和R2:
PARTITION R(A1,A2)INTO R1(A1),R2(A2);
在一個實施例中,從以上原語轉(zhuǎn)化的并且更新映射的完整SQL語句被示出如下:
其中第一查詢q1針對R1復(fù)制R的(多個)現(xiàn)有標(biāo)識符(繼承),并且q2將新標(biāo)識符分配到R1。查詢q3針對R2復(fù)制R的(多個)現(xiàn)有標(biāo)識符(繼承),并且q4將新標(biāo)識符分配到R2。查詢q5將R從Mψ移除,并且查詢q6和q7將Mφ中的R改變?yōu)镽1或R2。
另一模式演變是利用引用的垂直分區(qū)??紤]具有一對一關(guān)系的兩個實體。通過規(guī)范化,它們被存儲在一個表中。當(dāng)這樣的關(guān)系演變?yōu)槎鄬σ幌嚓P(guān)時,有必要在多側(cè)上將實體分區(qū)成單獨的表,其中外鍵列引用一側(cè)表。應(yīng)用可以例如使用以下原語請求這樣的利用引用的垂直分區(qū):
PARTITIONR(A1,A2)INTO R1(A1),R2(A2,fk REFERENCES R1(A1))
該原語涉及將邏輯表R垂直分區(qū)成兩個表的步驟,將列fk添加到R2并且填充列fk中的外鍵值。頭兩個步驟可以通過更新映射240(例如,映射函數(shù)φ和ψ)來有效地完成。然而,最后的步驟必須填充外鍵值,其可能引起相當(dāng)大的記錄擴展。為了改進效率并減少成本,在一個實施例中,外鍵值未被填充。作為結(jié)果,列fk在分區(qū)之后立即是空值,并且僅僅在其后插入的元組顯式地維持外鍵。
缺失的外鍵可以被重建。要理解,盡管在邏輯層處A1是邏輯表R1的列并且對邏輯表R2不可見,但是物理列φ(A1)對物理表220中的R2的物理記錄可見。因此,如果R2的物理元組缺失它的外鍵,則該元組必須引用共同位于物理表220中的相同物理行的R1元組。因此,缺失的外鍵可以根據(jù)相同物理記錄中的列φ(A1)來導(dǎo)出。在操作時,應(yīng)用可以如下地發(fā)出查詢:
SELECT A2,fk
FROM R2
在一個實施例中,在分區(qū)之后重建R2(A2,fk)的語句可以為如下:
將認(rèn)識到,通過使用CASE子句,針對具有空外鍵值的R2的元組,它的外鍵值將從物理表220中的相同物理行中的列φ(A1)提取。在分區(qū)之后插入的元組具有被直接檢索的非空外鍵。
將認(rèn)識到,當(dāng)使用CASE子句時,真實外鍵可以被隱藏。難以從子句推斷邏輯列的值分布。為了更好地支持列統(tǒng)計信息,在備選實施例中,查詢重建可以通過使用其他適當(dāng)?shù)淖泳鋪韺崿F(xiàn)。在一個實施例中,查詢R2(A2,fk)可以通過WHERE子句來重建。例如,針對兩個子查詢的兩個WHERE子句可以被串聯(lián)如下:
SELECT φ(A2)AS A2,φ(A1)AS fk
FROM T
WHERE coltid INψ(R2)AND φ(fk)IS NULL
UNION ALL
SELECT φ(A2)AS A2,φ(fk)AS fk
FROM T
WHERE coltid IN ψ(R2)AND φ(fk)IS NOT NULL
以這種方式,當(dāng)重建的R2在外鍵上與R1連接時,φ(A1)和φ(fk)的統(tǒng)計信息可以被用于選擇物理計劃。
通過舉例的方式,仍然對圖3進行參考。合同和客戶最初具有多對一關(guān)系。即,一個合同具有僅僅一個客戶,并且一個客戶可以具有多個合同。該關(guān)系由外鍵列Rcont(CustID)捕獲。假設(shè)應(yīng)用使該關(guān)系演變?yōu)槎鄬Χ嘞嚓P(guān),使得一個合同可以具有不止一個客戶。在一個實施例中,應(yīng)用可以使用以下原語來請求這樣的演變:
PARTITION Rcont(ContlD,Bill.Cust1D)INTO
新邏輯表Rref將客戶和合同連接,并且表示在客戶與合同之間的多對多關(guān)系。在演變之后,假設(shè)應(yīng)用將額外的客戶添加到現(xiàn)有合同102。在圖6中示出了在演變之后的物理表T220。T(col3,col6)對應(yīng)于Rref,其中ψ(Rref)={2,5},并且列“col6”為外鍵列。能夠看出,列“col6”大多數(shù)為空值,除了在演變之后插入的元組。假設(shè)應(yīng)用發(fā)出檢索多于$1,500的合同中的客戶的查詢,例如如下:
SELECT DISTINCTRref.CustID
在一個實施例中,該邏輯查詢被轉(zhuǎn)化為如下語句:
數(shù)據(jù)庫系統(tǒng)200使得能夠進行其他模式演變操作,例如邏輯表的垂直合并,將邏輯表分區(qū)成具有相同主鍵的多個表,邏輯表的聯(lián)合,等等。通過更新在邏輯表210與物理表220之間的映射240并且可能地在一些情況下更新物理表220本身,在模式演變期間的數(shù)據(jù)遷移可以在大多數(shù)情況下被避免。因此,與模式演變相關(guān)聯(lián)的開銷被顯著減少。
根據(jù)本文中描述的主題的實施例,數(shù)據(jù)庫系統(tǒng)200可操作用于管理事務(wù),尤其是重疊的或交錯的事務(wù)的并發(fā)性。通過舉例的方式,圖7示出了兩個重疊的事務(wù)710和720。第一事務(wù)710和第二事務(wù)720中的每個包括兩個階段,查詢轉(zhuǎn)化(被標(biāo)記為“QT”)和物理運行(被標(biāo)記為“Exec”)。假設(shè)第一事務(wù)710涉及在時刻730處針對(多個)邏輯表210的模式演變。如所示出的,第二事務(wù)720在第一事務(wù)710之前被啟動并且與第一事務(wù)710重疊,并且由第一事務(wù)710的模式演變在第二事務(wù)720完成之前發(fā)生。
如果第一事務(wù)710不使由第二事務(wù)720訪問的任何邏輯表210的模式演變,則事務(wù)710和720不干擾彼此并且它們的并發(fā)性可以例如使用底層數(shù)據(jù)庫機制照??刂?。相反,如果第一事務(wù)710使由第二事務(wù)720訪問的邏輯表210的模式演變,則數(shù)據(jù)沖突和不一致性可能發(fā)生。
在數(shù)據(jù)庫200中,一般而言,可以取決于模式演變是否引起數(shù)據(jù)遷移來控制事務(wù)并發(fā)性。仍然參考圖7,如果由第一事務(wù)710的模式演變不引起數(shù)據(jù)遷移,則事務(wù)710和720的并發(fā)性可以例如基于隔離的各自的水平來控制。例如,通過允許針對查詢轉(zhuǎn)化的快照隔離,每個事務(wù)僅僅在它自己的模式快照上進行操作。作為結(jié)果,重疊的事務(wù)的所有經(jīng)轉(zhuǎn)化的物理語句在演變之前處于舊模式上。
具體地,假設(shè)第一事務(wù)將邏輯表Rold演變?yōu)樾卤鞷new。當(dāng)?shù)诙聞?wù)720訪問Rold時,Rold的物理元組由謂詞coltid IN ψ(Rold)定位,并且ψ(Rold)在第二事務(wù)720的生命周期期間是恒定值。額外地,當(dāng)使邏輯表Rold演變時,第一事務(wù)710將不改變物理表220中的coltid的值。因此,第二事務(wù)720可以繼續(xù)在舊物理元組上進行操作。假定第一事務(wù)710不會當(dāng)從Rold演變到新表Rnew時引起數(shù)據(jù)遷移,來自Rold的物理元組是Rnew的一部分。盡管由第一事務(wù)710在這些元組上的更新可以對第二事務(wù)720可見,但是Rnew的任何新填充的元組對第二事務(wù)720不可見。作為結(jié)果,將不會引起數(shù)據(jù)沖突,并且因此第一事務(wù)710和第二事務(wù)720能夠都提交。
另一方面,如果由第一事務(wù)710的模式演變引起從在第二事務(wù)720中涉及的邏輯表R 210的數(shù)據(jù)的遷移,則在一個實施例中,可以通過防止第二事務(wù)720(以及除了第一事務(wù)710的任何事務(wù))在數(shù)據(jù)遷移期間修改或遷移邏輯表R中的數(shù)據(jù)來控制并發(fā)性。在一些情況下,這能夠借助于底層數(shù)據(jù)庫并發(fā)性控制機制來完成。通過舉例的方式,假設(shè)第一事務(wù)710利用數(shù)據(jù)遷移將邏輯表Rold演變到新表Rnew。模式演變包括兩個步驟。在第一步驟處,來自Rold的數(shù)據(jù)被讀出并被寫入到Rnew。之后,在第二步驟處從Rold刪除數(shù)據(jù)。如果第二事務(wù)720在數(shù)據(jù)遷移開始之前寫入邏輯表Rold,則在一個實施例中,能夠針對模式演變的第一步驟和第二步驟設(shè)置“可串行化”,使得第一步驟被阻斷直到第二事務(wù)720提交。
然而,在一些情況下,由底層數(shù)據(jù)庫提供的并發(fā)性控制機制可能是不夠的,例如當(dāng)由第一事務(wù)710的模式演變較早地開始時。因此,并發(fā)性管理可以通過使用邏輯表210上的一個或多個鎖來實現(xiàn)。通過舉例的方式,在一個實施例中,邏輯查詢中的邏輯語句中的每個可以在該邏輯語句(i)不遷移來自R的數(shù)據(jù)并且(ii)修改R或處于可串行化或可重復(fù)讀取的隔離水平下的情況下,在要被演變的邏輯表R上放置共享鎖。在該邏輯語句(i)不引起來自R的數(shù)據(jù)遷移并且(ii)不修改R或處于讀取未提交、讀取提交或快照的隔離水平下的情況下,不在R上發(fā)出鎖。另外,每個邏輯語句可以在邏輯語句將引起來自R的數(shù)據(jù)遷移的情況下,在R上放置互斥鎖。
對鎖的使用創(chuàng)建針對模式演變的“可串行化”語義。以這種方式,一次僅僅允許一個事務(wù)遷移來自邏輯表R的數(shù)據(jù),并且在該時間段期間邏輯表R不能夠被修改。如果隔離水平允許,則一些讀取操作能夠在數(shù)據(jù)遷移期間訪問表R。將認(rèn)識到,在表R上具有共享鎖的事務(wù)在轉(zhuǎn)化階段中不阻斷彼此時,它們的并發(fā)性行為將例如在運行階段中通過底層SQL數(shù)據(jù)庫來進一步控制。
通過以上討論,要理解,根據(jù)本文中描述的主題的實施例,不涉及數(shù)據(jù)遷移的模式演變的大多數(shù)實例可以與其他事務(wù)共存。僅僅在遷移不可避免或存在數(shù)據(jù)沖突的情況下,阻斷發(fā)生。與通常放置互斥鎖來阻斷并發(fā)事務(wù)的傳統(tǒng)模式演變相比,提高并發(fā)性。
圖8示出了用于管理具有靈活模式的數(shù)據(jù)的至少部分地由計算機實現(xiàn)的方法的流程圖。要理解,步驟不必按圖8中示出的順序來執(zhí)行。相反,那些步驟可以以任何其他適當(dāng)?shù)捻樞蚧虿⑿械乇粓?zhí)行。
方法800在步驟810處進入,其中提供針對邏輯表的邏輯視圖。在步驟820處根據(jù)預(yù)定義映射約束來管理在邏輯表與物理表之間的映射。管理映射包括創(chuàng)建、維持和/或更新映射。邏輯表中的每個被映射為物理表的一部分。該映射約束至少規(guī)定:(i)邏輯表中的邏輯列被映射到物理表中的一個或多個物理列,并且(ii)一個邏輯表中的不同邏輯列被映射到物理表中的不同物理列。
在一個實施例中,管理映射包括基于邏輯表的標(biāo)識符來管理在物理表中的記錄與邏輯表之間的關(guān)聯(lián)。具體地,關(guān)聯(lián)可以使得邏輯表能夠具有不止一個標(biāo)識符。備選地或額外地,關(guān)聯(lián)可以使得不止一個邏輯表能夠共享標(biāo)識符。
在一個實施例中,物理表的寬度至少部分地基于邏輯表中的邏輯列的數(shù)目和邏輯列的不同數(shù)據(jù)類型的數(shù)目來確定。
在一個實施例中,在步驟825處,管理物理表。在一個實施例中,響應(yīng)于確定物理列的密度在預(yù)定義閾值以下而減少用于物理表中的物理列的存儲空間。例如,這可以通過將物理列聲明為稀疏列來完成。備選地或額外地,當(dāng)邏輯表的邏輯列被映射到物理表中時,能夠首先嘗試復(fù)用(多個)現(xiàn)有物理列,代替直接分配新物理列。
在一個實施例中,在步驟830處,至少部分地基于映射來處理對邏輯表的一個或多個查詢。例如,在一個實施例中,響應(yīng)于接收到對(多個)邏輯表的查詢,接收到的查詢至少部分地基于映射而被轉(zhuǎn)化到對物理表的查詢。
在一個實施例中,在步驟840處,至少部分地基于用于使模式演變中的數(shù)據(jù)遷移最小化的映射來使針對一個或多個邏輯表的(多個)模式演變。在一個實施例中,響應(yīng)于接收到包括針對模式演變的請求的事務(wù),模式可以通過更新映射來演變以避免數(shù)據(jù)遷移。例如,在一個實施例中,由應(yīng)用發(fā)出的演變原語可以被轉(zhuǎn)化為更新映射的一組語句,例如SQL語句。
在一個實施例中,在步驟850處控制事務(wù)的并發(fā)性。例如,在一個實施例中,并發(fā)性控制包括確定模式演變是否引起數(shù)據(jù)遷移。如果是的話,則防止演變的邏輯表中的數(shù)據(jù)在數(shù)據(jù)遷移期間被任何其他事務(wù)修改或遷移。否則,可以例如基于快照隔離來控制并發(fā)性。
圖9示出了計算環(huán)境(例如計算環(huán)境100)中的系統(tǒng)900的框圖。如所示出的,系統(tǒng)900包括邏輯視圖管理器910,其被配置為提供針對邏輯表的邏輯視圖。系統(tǒng)900還包括映射管理器920,其被配置為根據(jù)預(yù)定義映射約束來管理在邏輯表與物理表之間的映射。如以上所討論的,邏輯表中的每個被映射為物理表的一部分。該映射約束至少規(guī)定:(i)邏輯表中的邏輯列被映射到物理表中的一個或多個物理列,并且(ii)邏輯表中的一個中的不同邏輯列被映射到物理表中的不同物理列。
在一個實施例中,映射管理器920被配置為基于邏輯表中的標(biāo)識符來管理在物理表中的記錄與邏輯表之間的關(guān)聯(lián)。在一個實施例中,關(guān)聯(lián)可以使得邏輯表能夠具有不止一個標(biāo)識符。備選地或額外地,關(guān)聯(lián)可以使得不止一個邏輯表能夠共享標(biāo)識符。
在一個實施例中,系統(tǒng)900還包括物理表管理器925,其被配置為管理物理表。在一個實施例中,物理表管理器925可以被配置為響應(yīng)于確定物理列的密度在預(yù)定義閾值以下而減少用于物理表中的物理列的存儲空間。備選地或額外地,物理表管理器925可以被配置為當(dāng)邏輯表的邏輯列被映射到物理表中時復(fù)用物理列。
在一個實施例中,系統(tǒng)900包括查詢管理器930,其被配置為至少部分地基于映射來處理對邏輯表的一個或多個查詢。例如,在一個實施例中,響應(yīng)于接收到對(多個)邏輯表的查詢,接收到的查詢至少部分地基于映射而被轉(zhuǎn)化到對物理表的查詢。
在一個實施例中,系統(tǒng)900包括模式管理器940。模式管理器940被配置為至少部分地基于用于使模式演變中的數(shù)據(jù)遷移最小化的映射來使針對一個或多個邏輯表的(多個)模式演變。在一個實施例中,響應(yīng)于接收到包括針對模式演變的請求的事務(wù),模式可以通過更新映射來演變以避免數(shù)據(jù)遷移。例如,在一個實施例中,由應(yīng)用發(fā)出的演變原語可以被轉(zhuǎn)化為更新映射的一組語句,例如SQL語句。
在一個實施例中,系統(tǒng)900包括事務(wù)管理器950,其被配置為控制在各事務(wù)之間的并發(fā)性。例如,在一個實施例中,事務(wù)管理器950被配置為確定模式演變是否引起數(shù)據(jù)遷移。如果是的話,則防止演變的邏輯表中的數(shù)據(jù)在數(shù)據(jù)遷移期間被任何其他事務(wù)修改或遷移。否則,可以例如基于快照隔離來控制并發(fā)性。
所描述的主題的實施例可應(yīng)用于許多情形。例如,數(shù)據(jù)庫200可以被體現(xiàn)為多租戶數(shù)據(jù)庫以將來自不同租戶的數(shù)據(jù)整合成一個實例以減少每個租戶的擁有成本。在這樣的實施例中,每個租戶的表是邏輯表210,并且表的數(shù)據(jù)被物理地維持在物理表220中。由于僅僅維持物理表220和映射240是必要的,所以避免每個租戶的表的存儲器和緩沖池開銷。此外,不同的租戶不需要共享任何共性,并且物理數(shù)據(jù)庫能夠擴展到大量租戶。額外地,在一個實施例中,數(shù)據(jù)庫200可以被構(gòu)建在云數(shù)據(jù)庫之上以提供云多租戶數(shù)據(jù)庫。
作為另一示例,本文中描述的主題的實施例可以被應(yīng)用于處理半結(jié)構(gòu)化數(shù)據(jù),例如JavaScript對象表示(JSON)數(shù)據(jù)。給定規(guī)范化的模式,在一個實施例中,JSON文檔被切碎成被存儲為邏輯表210的表。整數(shù)列可以被添加到每個邏輯表以表示文檔的標(biāo)識符。文檔的列的所有標(biāo)識符可以被映射到物理表220中的相同的物理列。假設(shè)該列被命名為“colobjID”。之后,在物理層處,聚集的索引可以被構(gòu)建在T(colobjID,coltid)上。聚集的索引克服文檔重建的問題,其是傳統(tǒng)的基于SQL的半結(jié)構(gòu)化的數(shù)據(jù)庫的主要缺陷。此外,在一個實施例中,當(dāng)從非數(shù)組值到數(shù)組演變時可以使用具有引用的垂直分區(qū)。因此,當(dāng)模式演變時,JSON數(shù)據(jù)庫免于數(shù)據(jù)遷移。額外地,只要底層數(shù)據(jù)庫能夠自動地向外擴展,其就能夠支持分片。
盡管已經(jīng)以對結(jié)構(gòu)特征和/或方法動作特定的語言描述了本主題,但是應(yīng)理解在權(quán)利要求中限定的主題不必限于以上描述的特定特征或動作。相反,以上描述的特定特征和動作被公開為實施權(quán)利要求的示例形式。