專利名稱:用于數(shù)據(jù)庫系統(tǒng)中大對象基礎結構的系統(tǒng)和方法
技術領域:
本發(fā)明一般涉及數(shù)據(jù)庫系統(tǒng)領域,尤其涉及用于提供大對象基礎結構的系統(tǒng)和方法,該基礎結構可用于大對象數(shù)據(jù)類型(文本、n文本和圖像)的重新實現(xiàn)以支持大的用戶定義類型以及諸如XML的其它新的數(shù)據(jù)類型。
背景技術:
在包括微軟SQL Server先前發(fā)布版本的數(shù)據(jù)庫存儲平臺中,由于復制小值對象所涉及額外成本相對較小,無需考慮這些額外成本。然而,對于大值對象,額外成本就高得多且可負面地影響整體性能。
迄今為止使用大對象(LOB)數(shù)據(jù)類型-文本、n文本和圖像數(shù)據(jù)類型-來存儲大對象以克服varchar(字符串變量)、nvarchar(n字符串變量)和varbinary(二進制變量)類型的尺寸限制,因為大對象值對這些最適合小數(shù)據(jù)對象的數(shù)據(jù)類型而言太大。然而,對帶有大對象的編程模型所允許的以及導致大對象的易錯誤實現(xiàn)的基礎結構都有很多限制。例如,對LOB不允許大多數(shù)字符串功能和操作符,并且特別是有關插入和刪除中的文本指針功能也有缺點。(文本指針是SQL Server先前版本中用作行定位符的物理引用。)此外,沒有用于一次更改LOB的一個或多個行的有效方法,也不支持LOB變量或任意類型的LOB的復制功能。這些和其它限制導致LOB明顯地與其它數(shù)據(jù)類型不同且因此更難使用。
需要的是一種大對象基礎結構,其中用戶/編程人員可用處理較小值的相同方法來處理較大值(數(shù)據(jù)塊),從而在較小值和較大值的處理中消除用戶可感知的差異,以便提供單個綜合性的編程模型。
發(fā)明內容
本發(fā)明的各個實施例涉及用于提供一種基礎結構的系統(tǒng)和方法,該基礎結構可用于將文本、n文本和圖像數(shù)據(jù)類型重新實現(xiàn)為新的varchar(MAX)、nvarchar(MAX)、varbinary(MAX)和XML數(shù)據(jù)類型,并支持較大的用戶定義類型(UDT),還使能對其它新數(shù)據(jù)類型和編程模型結構的支持。本發(fā)明的若干實施例還涉及提供一數(shù)據(jù)處理基礎結構,其中用戶/編程人員可用處理較小值的相同方法來處理較大值(數(shù)據(jù)對象),從而消除較小值和較大值之間的差異,以便提供單個綜合性的編程模型。
這些不同的實施例利用作為較大值內部表示的二進制大型對象句柄(BlobHandle,BH)。BH是對較大數(shù)據(jù)的不可變和無狀態(tài)的引用。BH的結構包含返回IlockBytes接口的足夠信息以便提供對相應大數(shù)據(jù)塊的訪問,并且BH還可返回有關它自己壽命描述的信息。這些概念和元素如下作更詳細描述。
結合附圖閱讀前面的發(fā)明內容和以下較佳實施例的詳細描述,能得到更好的理解。為了說明本發(fā)明各實施例,在附圖中示出本發(fā)明的示例性結構;然而,本發(fā)明并不限于所揭示的特定方法和裝置。在附圖中圖1是示出本發(fā)明各方面可結合其中的計算機系統(tǒng)的框圖;圖2是示出本發(fā)明各方面可結合其中的網絡的示意圖;圖3A是示出在本發(fā)明個實施例中二進制大型對象句柄(BH)的一般組件的框圖;圖3B是根據(jù)本發(fā)明各實施例示出一值完全包含其中的BH的框圖;圖4A是示出均指向用于讀取類型操作的同一數(shù)據(jù)塊的原始BH和表示虛擬副本的第二BH的框圖;圖4B是來自圖4A的BH的框圖,其中寫操作由任一BH調用而第二BH指向數(shù)據(jù)塊的新創(chuàng)建副本。
具體實施例方式
本發(fā)明的主題是專門為滿足法定需求而進行描述的。然而,該描述本身并不是要限制本專利的范圍。相反,發(fā)明者已經預期到已聲明主題也能結合其它現(xiàn)有或以后的技術用其它方式體現(xiàn),以包括不同的步驟或類似于本文檔中所述步驟的組合。此外,盡管術語“步驟”在此可用以暗示所用方法的不同元素,該術語不應被解釋為暗示在此揭示的不同步驟之間或當中的任何特定次序,除非明確地說明各個步驟的次序時。
計算機環(huán)境本發(fā)明的眾多實施例可在計算機上執(zhí)行。圖1和以下討論旨在提供一種本發(fā)明可在其中實現(xiàn)的適當計算環(huán)境的簡要一般說明。盡管不是必需的,本發(fā)明可在由諸如客戶機工作站或服務器的計算機執(zhí)行的諸如程序模塊的計算機可執(zhí)行指令的一般上下文中進行說明。通常,程序模塊包括執(zhí)行特定任務或實現(xiàn)具體抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結構等等。此外,本領域技術人員將理解本發(fā)明可在其它計算機系統(tǒng)配置中實踐,包括手持式裝置、多處理器系統(tǒng)、基于微處理器的或可編程的電器消費品、網絡PC、小型計算機、大型計算機等等。本發(fā)明還可在任務由經通信網絡鏈接的遠程處理裝置執(zhí)行的分布式計算環(huán)境中實踐。在分布式計算環(huán)境中,程序模塊可被置于本地和遠程存儲器存儲設備中。
如圖1所示,示例性通用計算系統(tǒng)具有常規(guī)個人計算機20等,包括處理單元21、系統(tǒng)存儲器22以及把包括系統(tǒng)存儲器的各種系統(tǒng)組件耦合到處理單元21的系統(tǒng)總線23。系統(tǒng)總線23可以是若干總線結構類型中的任何一種,包括存儲器總線或存儲器控制器、外圍總線、以及使用多種總線體系結構的任一種的局部總線。系統(tǒng)存儲器包括只讀存儲器(ROM)24和隨機存儲器(RAM)25。含有幫助如啟動期間在個人計算機20中元件之間信息交換的基本例程的基本輸入/輸出系統(tǒng)(BIOS)26存儲在ROM 24中。個人計算機20還包括讀取和寫入硬盤(未示出)的硬盤驅動器27、讀取或寫入可移動磁盤29的磁盤驅動器28、以及讀取或寫入諸如CD ROM或其它光學介質等可移動光盤31的光盤驅動器30。硬盤驅動器27、磁盤驅動器28和光盤驅動器30分別通過硬盤驅動器接口32、磁盤驅動器接口33和光盤驅動器接口34連接至系統(tǒng)總線23。諸驅動器及其相關聯(lián)計算機可讀介質為個人計算機20提供計算機可執(zhí)行指令、數(shù)據(jù)結構、程序模塊和其它數(shù)據(jù)的非易失性儲存。盡管在此所述示例性環(huán)境采用了硬盤、可移動磁盤29和可移動光盤31,但本領域技術人員應理解也可在示例性操作環(huán)境中使用其它類型計算機可訪問的能夠存儲數(shù)據(jù)的計算機可讀介質,諸如磁盒、閃存卡、數(shù)字視頻盤、Bernoulli卡、隨機存取存儲器(RAM)、只讀存儲器(ROM)等。
包括操作系統(tǒng)35、一個或多個應用程序36、其它程序模塊37和程序數(shù)據(jù)38的眾多程序模塊,可存儲在硬盤、磁盤29、光盤31、ROM 24或RAM 25中。用戶可通過諸如鍵盤40和定位裝置42的輸入裝置把命指令和信息輸入個人計算機20。其它輸入裝置(未示出)可包括諸如話筒、操縱戲桿、游戲墊、衛(wèi)星接收天線、掃描儀等等。這些和其它輸入裝置常常通過與系統(tǒng)總線相耦合的串行端口接口46連接到處理單元21,但是它也可通過其它接口相連,如并行端口、游戲端口或通用串行總線(USB)。監(jiān)視器47或其它類型的顯示裝置也通過諸如視頻適配器48的接口和系統(tǒng)總線23相連。除了顯示器47,個人計算機通常包括其它外圍輸出裝置(未示出),如揚聲器和打印機。圖1的示例性系統(tǒng)還包括主機適配器55、小型計算機系統(tǒng)接口(SCSI)總線56、以及與SCSI總線56相連的外部存儲裝置62。
個人計算機20可以在使用與一臺或多臺遠程計算機,諸如遠程計算機49的邏輯連接的網絡化環(huán)境中運行。遠程計算機49可以是另一臺個人計算機、服務器、路由器、網絡PC、對等裝置或其它公共網絡節(jié)點,而且通常包括上述與個人計算機20相關的許多或全部元件,盡管在圖1中僅顯示了存儲器存儲裝置50。圖1中所描繪的邏輯連接包括局域網(LAN)51和廣域網(WAN)52。這樣的網絡化環(huán)境在辦公室、企業(yè)范圍計算機網絡、內聯(lián)網和因特網上是常見的。
當用于LAN網絡環(huán)境中時,個人計算機20通過網絡接口或適配器53與LAN51連接。當用于WAN網絡環(huán)境中時,個人計算機20通常包括調制解調器54或其它用于在諸如因特網的廣域網52上建立通信的裝置。可以是內置式或外置式的調制解調器54,與系統(tǒng)總線23通過串行端口接口46連接。在網絡化環(huán)境中,所述與個人計算機20相關的程序模塊或其一部分,可以存儲在遠程存儲器存儲裝置中??梢岳斫猓揪W絡連接是示例性的,也可以使用其它在計算機之間建立通信連接的裝置。此外,盡管可以想像本發(fā)明的許多實施例都特別適于計算機化系統(tǒng),本文檔中并無旨在將本發(fā)明限制在這些實施例的內容。
網絡化環(huán)境圖2示出了其中可采用本發(fā)明的示例性網絡環(huán)境。當然,實際的網絡和數(shù)據(jù)庫環(huán)境可以各種配置安排;然而,在此示出的示例性環(huán)境提供用于理解本發(fā)明在其中進行操作的環(huán)境類型的框架。
本網絡可包括客戶機計算機20a、服務器計算機20b、數(shù)據(jù)源計算機20c和數(shù)據(jù)庫70、72a和72b。客戶機計算機20a和數(shù)據(jù)源計算機20c通過例如因特網的通信網絡80與服務器計算機20b進行電子通信??蛻魴C計算機20a和數(shù)據(jù)源計算機20c通過通信接口82與通信網絡相連。通信接口82可以是眾所周知通信接口的任一種,諸如以太網連接、調制解調器連接等。
服務器計算機20b通過數(shù)據(jù)庫服務器系統(tǒng)軟件來提供數(shù)據(jù)庫70的管理,如下進行更全面描述。這樣,服務器20b作為來自各種各樣數(shù)據(jù)源的數(shù)據(jù)倉庫,并向各種各樣的數(shù)據(jù)消費者提供數(shù)據(jù)。
在圖2示例中,數(shù)據(jù)源由數(shù)據(jù)源計算機20c提供。數(shù)據(jù)源計算機20c經可能是LAN、WAN、內聯(lián)網、以太網等的通信網絡80將數(shù)據(jù)傳送給服務器計算機20b。數(shù)據(jù)源計算機20c將數(shù)據(jù)本地存儲在可能是關系數(shù)據(jù)庫服務器、excel電子表格、文件等的數(shù)據(jù)庫72a和72b中。例如,數(shù)據(jù)庫72a顯示數(shù)據(jù)存儲在表格150、152和154中。由數(shù)據(jù)源20c提供的數(shù)據(jù)被組合并存儲在較大數(shù)據(jù)庫中,諸如由服務器20b維護的數(shù)據(jù)倉庫中。
想要使用由服務器計算機20b存儲的數(shù)據(jù)時,客戶計算機20a經通信網絡80訪問數(shù)據(jù)庫70??蛻粲嬎銠C20a通過對存儲于數(shù)據(jù)庫70的數(shù)據(jù)的SQL查詢(例如更新、插入和刪除)來請求數(shù)據(jù)。
二進制大型對象句柄本發(fā)明各實施例涉及二進制大型對象句柄(BH)。BH(以及其接口IBlobhandle)是對較大對象(LOB)(此后為“數(shù)據(jù)塊”)的不可變和無狀態(tài)引用的內部表示。使用BH,系統(tǒng)中所有LOB實例(包括二進制大型對象BLOB)可被合并成單個表示。實際上,BH是定位數(shù)據(jù)塊的引用,其中BH完整地描述該數(shù)據(jù)塊。BH本身可用(a)指向BH數(shù)據(jù)開始處的指針和(b)BH的字節(jié)長度來描述。
例如,在C++中,BH使用指向緩存區(qū)開始處的指針來支持類似常規(guī)C++對象的方法調用。BH的結構包含返回IlockBytes接口的足夠信息以便提供對相應數(shù)據(jù)塊的訪問,并且部分BH可支持消除相關聯(lián)存儲的“刪除”方法。BH還可返回有關其自己壽命描述的信息。此外,對于較小值BH將能把值包含于其本身,從而繞過對IlockBytes接口和虛擬方法調用的檢索以從獨立的數(shù)據(jù)塊中讀取。
圖3A是示出本發(fā)明各實施例中BH的一般組件的框圖。BH 300包括(a)對存儲在存儲器或盤存儲(“存儲”)310某處的相應數(shù)據(jù)塊312的開始位置的指針304的偏移302,以及(b)與存儲310中數(shù)據(jù)塊312的尺寸對應的長度306。該BH還包括單個比特的壽命描述(未示出)。
圖3B是示出圖3A相同BH的框圖,但其中所述BH 300的偏移302不指向外部引用的LOB,而是指向(304)完全包含于所述BH 310內的較小值320。
BH基礎結構在BH基礎結構中,較大值參數(shù)通過使用BH副本(而非數(shù)據(jù)塊副本)來處理以按命令將副本提供為輸入?yún)?shù)。通過使用由BH基礎結構提供的BH佚名機制,該經復制BH被作為指針引用傳遞。然而,如果數(shù)據(jù)塊的改變對該BH的一個部分是必需的,則復制該較大值且寫入BH會單獨指向該新副本;因而通常該復制功能在必要時會對輸出參數(shù)發(fā)生。
圖4A是一框圖,示出指向(404)數(shù)據(jù)塊412的起點BH 402以及創(chuàng)建表示數(shù)據(jù)塊412的虛擬副本412’但實際上指向(404’)同一數(shù)據(jù)塊412的第二BH 402’。然而,如圖4B所示,如果由第二BH 402’表示的“副本”中的數(shù)據(jù)(或相反,如果由BH 402表示的數(shù)據(jù))要通過寫操作改變,則數(shù)據(jù)塊412將被真正復制到新的數(shù)據(jù)塊412”中,而第二BH 402’將指向(404’)這個第二數(shù)據(jù)塊412”。
然而,對于各個實施例,該BH基礎結構還可支持對數(shù)據(jù)塊的“部分更新”-即僅改變較大值一部分而不影響整個數(shù)據(jù)值的全副本的能力-以排除復制整個數(shù)據(jù)塊的某些必要性。操作中,部分更新確定(a)對應于數(shù)據(jù)塊的“組塊”(組塊是所述數(shù)據(jù)塊子部分)的替換值,(b)對數(shù)據(jù)塊中組塊開始處的“偏移”,和(c)要替換的組塊的字節(jié)長度(也對應于替換值的字節(jié)長度)。在邏輯上,該方法簡單地將數(shù)據(jù)塊偏移位置上字節(jié)長度數(shù)的字節(jié)(基本定義了主題組塊的邊界和范圍)替換成具有相同字節(jié)長度的前述替換值。在可選實施例中,替換值無需與要與被替換組塊具有相同字節(jié)長度,而可使用本領域技術人員眾所周知的各種方法(例如基于指針的方法)將較小或較大值置入該組塊。此外,這些技術的任一種都可用于前述并如圖4A和4B所示的虛擬副本概念。
在內部,部分更新可呈現(xiàn)為欄更新(可與其它部分或常規(guī)更新組合)的特定形式,且在可能時變化被置于盤存儲中而僅更改所需的B-樹特定部分。然而,在某些情形中,由于效率和魯棒性的原因系統(tǒng)可選擇將部分更新按全副本來實現(xiàn),而在其它情形中更新將不部分地執(zhí)行,而是執(zhí)行全部的替換。在出現(xiàn)例如對劃分或群集鍵更新那樣需要將數(shù)據(jù)行移到不同物理位置的更新時,系統(tǒng)將部分更新按全副本來實現(xiàn)(即新值替換舊值)。這樣的理由是將行移到不同位置需要全副本,且在一個步驟中完成操作更為有效。應注意,系統(tǒng)不將包含部分更新的更新語句作為不可行而加以拒絕,但相反在前述情形中將選擇作為全副本實現(xiàn)。
部分更新基礎結構還考慮“萬圣節(jié)保護”(即被用作UPDATE(更新)中自變量的值也可更新它們自己)。
該部分更新基礎結構呈現(xiàn)出比先前基于文本指針技術的一大進步。假設部分更新是查詢處理器(QP)的已知操作,現(xiàn)在能夠使用過去在文本指針實現(xiàn)中受限的若干特征,包括但不限于索引和被索引視圖維護、劃分、復制、和約束確認。
作為本發(fā)明若干實施例的BH基礎結構的一部分,底層存儲基礎結構還會具有欄的行內限制的概念。該限制確定與給定值被保留在主要頁面中相反的給定值被選定從行中移除的尺寸邊界。行內限制越小則從行中移除一欄越快,而較大的限制則具有相反效果。如本領域技術人員所理解和認識的,這反映了一種折衷,其中較小限制使較大數(shù)量的行能插入每一頁面,從而增加行密度和掃描性能,但較大值欄不是掃描的一部分。這樣,BH基礎結構允許內部可配置的每類行內限制。因而MAXV類可基于特定的行內限制展現(xiàn)一給定行為,而UDT或XML類型可選擇不同限制,并獲取更適于其尺寸和結構的不同的密度和掃描性能特征。
BH方法和API對于本發(fā)明各實施例,BH可支持一個或多個以下方法,如下作更詳細描述interface IBlobHandle{publicvirtual const CBlobHandleProperties *PbhpGet( ) const=0;//返回二進制大型對象屬性virtual ILockBytesSS *PilbGetILockBytes(_IN_IlbGetFlags flags)const=0;//使用常規(guī)釋放以重新分配ILockBytesSS//ILockBytesSS可具有對AddRef的有限支持(例如,可不返回經更新的引用計數(shù))virtual void Delete( ) const=0;//允許取消與臨時句柄(如果有)相關聯(lián)的存儲virtual BOOL FGetPointer(_OUT__OPT_LPCVOID *ppv,_OUT__OPT_ULONG *pcbLength) const=0;//如果為真,則向只讀數(shù)據(jù)返回指針+長度(提供不為空的參數(shù))//如果為假,則存儲器內指針不可用。
};BH結構的典型實現(xiàn)從帶有在某些實例中附加的可選數(shù)據(jù)的IblobHandle接口中繼承。由于BH是自包含的且不具有指向它自己的內嵌指針,無需有關其駐留的存儲器的假設。因此,要復制BH僅需簡淺的副本。這使系統(tǒng)能以與處理常規(guī)欄的相同方法來處理BH。
盡管BH被用以查找相應的數(shù)據(jù)塊,它并不提供接口來處理該數(shù)據(jù)塊的LOB數(shù)據(jù)。相反,對某些實施例可使用PilbGetILockBytes方法來檢索用于數(shù)據(jù)處理的ILockBytesSS。所支持的精確IlockBytesSS方法集在BH實現(xiàn)上會變化但通常分成兩類(i)僅支持讀取操作的只讀LOB,諸如表示來自用戶表格且通常為只讀的數(shù)據(jù)(部分更新情形例外);以及(ii)支持對數(shù)據(jù)塊讀取和更新的讀寫LOB,諸如用以存儲臨時LOB值的臨時BH。
在某些實施例中,可調用BH上的刪除方法以便刪除與該BH相關聯(lián)的LOB值。然而,僅有部分BH會支持該操作(例如臨時BH)而其它不會支持(例如來自用戶表格的BH)。無論如何,刪除操作是無故障的,這對于處理清空以確保自動解構器不出故障是有用的。
某些實施例中的BH還支持FgetPointer方法,它作為IlockBytesSS的替代方法可被用以返回指向LOB數(shù)據(jù)塊的指針及其長度,因而提供了用于訪問較小只讀數(shù)據(jù)的一種較快速方法。然而,如果該數(shù)據(jù)塊不包括較小只讀數(shù)據(jù),該方法可返回“假”以指示應替代地使用PilbGetILockBytes方法來訪問數(shù)據(jù)。
對于各個實施例,除刪除外的BH API方法都可產生例外。
BH屬性在若干實施例中PbhpGet方法返回作為BH屬性封裝的CblobHandleProperties。通常許多BH共享公共屬性,而經指針(CBlobHandleProperties*)對屬性的比較可被用以辨別BH的“傾向選擇”(例如,BH指向用戶表格中的數(shù)據(jù)還是指向“定制”數(shù)據(jù)塊;BH傾向選擇在后面進行更詳細描述)。
若干實施例利用“壽命”屬性用作BH引用有效的時間長度。例如,BH在某些種類的事件之后可不再與現(xiàn)有的LOB值相關聯(lián)。對于某些實施例,可簡便地分配給該屬性兩值“查詢壽命”或“行壽命”(或其它二進制等效表示)之一?!靶袎勖北硎荆嚓P聯(lián)的LOB值僅在查詢執(zhí)行(QE)迭代器在處理當前行時才能訪問,且一旦迭代器繼續(xù)到下一行該BH就不再與該LOB值相關聯(lián)(因而經該BH的任何其它訪問都被禁用)。另一方面,“查詢壽命”將表示直到查詢結束之前(或者在其它非查詢情形中直到消除或關閉“BH工廠”之前,BH工廠在其它地方詳細討論)該LOB值都是有效的。
BH傾向選擇(Favor)本發(fā)明若干實施例包括BH的一種或多種“傾向選擇”,所述傾向選擇包括以下BH實現(xiàn)變體·“表格”BH,指向用戶表格中數(shù)據(jù)塊(且通常具有“查詢壽命”)。
·“臨時”BH,使用BH工廠(在其它地方討論)創(chuàng)建用于臨時利用。
·“內嵌”BH,對于充分小的數(shù)據(jù)塊在BH主體中包含整個的數(shù)據(jù)塊。對于該傾向選擇,ILockBytesSS接口也可在BH主體之內從而PilbGetILockBytes方法將非??焖俸陀行У馗淖儭?br>
·“佚名”BH,將方法調用重新指向另一BH,它在某些操作中特別有用,諸如將比TEMPBLOBHANDLE_SIZE(預定義尺寸限制)大的BH轉換成小于或等于TEMPBLOBHANDLE_SIZE的BH(如下進行更詳細描述)。
·“包裝器”BH,使訪問重新指向現(xiàn)有ILockBytesSS對象。這在用來將現(xiàn)有的IlockBytes對象從另一源中(例如從OLEDB)“投射”入BH時特別有用。
·“孤立”BH,屬于特定文件組且在后來可與用戶表格鏈接。在操作中,當較大值流入系統(tǒng)時,該較大值可被直接復制到孤立BH中,且一旦數(shù)據(jù)全部流入,該BH可變成無需附加副本而插入(或“采用”)的表格的一部分。因而這類BH可用來最小化副本并改進諸如BULK INSERT(批量插入)語句的高性能批量操作的性能。
BH最大尺寸對于某些實施例,包含BH需要有關最大緩存區(qū)尺寸的假設。對于這些實施例,QE通常會使用從查詢優(yōu)化器(QO)導出的最大尺寸,盡管最大的BH尺寸也可被定義為常數(shù),例如const BLOBHANDLE_SIZE=8000。然而,“臨時”BH可具有基于處理器結構的限制,例如對32比特體系結構定義為const TEMPBLOBHANDLE_SIZE=0x40。該方法背后的主要概念是,大部分組件會通過引用來訪問BH(而不分配它們自己的緩沖區(qū))或使用臨時BH來輸出數(shù)據(jù)塊的較大值。因此,如果BH將持續(xù)則需要分配較小的緩沖區(qū)(即TEMPBLOBHANDLE_SIZE的尺寸)。另一方面,QE通常將使用大得多的BH。然而,要著重考慮的是幾乎任何組件可處理TEMPBLOBHANDLE_SIZE尺寸的BH,但如果BH比該值大且對查詢執(zhí)行之外的組件可見,則它必須通過其相關聯(lián)指針訪問。例如,如果QE向語言處理和執(zhí)行組件(LPE)展現(xiàn)較大BH,則LPE通常不將較大BH復制到它自己的緩沖區(qū)內,因而必須使用指向QE緩沖區(qū)的指針。
BH工廠(Factory)BH工廠(BHF)是一個創(chuàng)建新BH的對象。一般而言,可能沒有所有BF工廠都支持的公共接口,但有“臨時BH工廠”(TBHF)所支持的公共接口,從而臨時數(shù)據(jù)塊被用以存儲較大數(shù)據(jù)由一個或多個組件處理。在后者情形中,IBlobHandleFactory指針從一個組件被傳送到另一組件用于繼續(xù)處理,而TBHF使表示較小值(例如小于8K)的數(shù)據(jù)塊處理更有效的最優(yōu)化(如上所述)。還有支持來自多線程的并行訪問的特定BHF(如下進行更詳細描述)。
以下方法使用TBHF創(chuàng)建BH//函數(shù)在特定緩存區(qū)內創(chuàng)建BH。緩存區(qū)尺寸是輸入/輸出參數(shù)并返回被創(chuàng)建的句柄尺寸。
virtual void CreateNewBlobHandle(IBlobHandle *pbh,ULONG& cbBufferSize,CreateNewBlobHandleFlags flags)=0;在某些實施例中,該方法創(chuàng)建與“空”LOB值相關聯(lián)的新的BH,然后使用ILockBytesSS將數(shù)據(jù)寫入該BH,并可使用關閉和釋放BH(ILockBytesSS∷Close和ILockBytesSS∷Release)的其它方法。
一般而言,BHF可服務多個線程,即使創(chuàng)建該BHF的特定線程擁有該特定BHF并且是到時允許清空BHF的僅有線程。BHF還可通過用給定組標號來標記成員BH從而在組合中創(chuàng)建BH。這使BHF能提供服務用于以單個操作釋放與給定組相關聯(lián)的所有BH。
取決于BHF,由BH創(chuàng)建的BH可由盤或存儲器備份。BHF開始時(并最好)不具有與其相關聯(lián)的特定盤存儲,但一般而言在第一次使用時或通過顯式請求按命令創(chuàng)建存儲。這樣,本發(fā)明各個實施例利用一類或多類BHF,包括但不小于以下·快速BHF這些BHF創(chuàng)建僅存儲器內的BH,它通過使用存儲器備份而不是永久的盤存儲來支持較小值。一般而言,BH基礎結構會在可能時嘗試使用快速BHF,但在需要時可回到較慢的盤備份存儲。
·盤備份BHF這些BHF創(chuàng)建由盤存儲備份的BH,且可保存任意大的值(盤空間允許時)。
MAX指示符和MAXV類型使用BH,本發(fā)明各實施例還涉及使用varchar、nvarchar和varbinary數(shù)據(jù)類型(此后一起稱為“V類”)的MAX指示符。例如,表格列和TSQL變量在定義/聲明時間可指定varchar(MAX)、nvarchar(MAX)或varbinary(MAX)(此后一起稱為“MAXV類”)。操作中,MAXV類列和變量會將“MAX”關鍵字用作類型尺寸的指示符,且這樣的值可基于系統(tǒng)可支持的尺寸來定義-例如varchar(MAX)?。絭archar(<有效數(shù)字>)-即使在聲明時可用以指定varchar或varbinary的最大尺寸的最大面值對于nvarchar而言可持續(xù)到8000和4000。(通常varchar或varbinary列具有最大尺寸8000,但MAX關鍵字使用BH基礎結構準予其最大尺寸等于系統(tǒng)可支持最大值的列。)在各個可選實施例中,一個或多個下列操作和功能將可對MAXV類支持比較;TSQL變量;串聯(lián);某些字符串功能;全部的SELECT(選擇)語句支持,包括DISTINCT(獨特的)、ORDER BY(按其排序)、GROUP BY(按其分組)、累計、結合、子查詢等等;CHECK(檢查)約束、RULES(規(guī)則)和DEFAULTS(缺省)(對于當前LOB發(fā)生時大于8K的不再被默認地截短);成為索引視圖定義的一部分;AFTER(之后)觸發(fā)器上插入/刪除表格的可見性;以及數(shù)據(jù)類型轉換;允許在FFO光標中;FETCH…INTO…@variable(變量);SET ANSI_PADDING;SETCONCAT_NULL_YIELDS_NULL;全文本搜索;以及CREATE TYPE(以替換sp_addtype)等等。然而,由于真正和實質的尺寸差異,對于本發(fā)明部分實施例MAXV類和V類之間的微弱差異會繼續(xù)存在,包括但不小于以下sql_variant仍不包含MAXV類;MAXV類列在索引中不能被指定為關鍵詞列(盡管允許它們被用作索引子鍵);以及MAXV類列不能被用作劃分關鍵詞列。然而,將列的前綴指定為索引或索引視圖關鍵詞是被允許的。這可使系統(tǒng)能自動考慮索引以便快速檢索符合某些類型的涉及MAXV類列的謂詞的行。例如,形式為[Varchar(MAX)column]=Value(值)的謂詞可由系統(tǒng)自動分成Prefix([Varchar(MAX)column])=Prefix(Value)AND[Varchar(MAX)column]=Value。在該列前綴上的隱含謂詞可允許索引的使用。
為了確保反向的兼容性,當將數(shù)據(jù)往下層發(fā)送給不支持MAXV類的客戶機時,varchar(MAX)、nvarchar(MAX)和varbinary(MAX)數(shù)據(jù)類型將分別作為LOB類文本、n文本和圖像類型發(fā)送。相反,遷移支持對于來自客戶機從上層接收的LOB類文本、n文本和圖像數(shù)據(jù)形式的數(shù)據(jù),將被分別轉換成varchar(MAX)、nvarchar(MAX)和varbinary(MAX)數(shù)據(jù)類型。
結論在此所述的各種系統(tǒng)、方法和技術可用硬件或軟件,或在適當時結合兩者的組合來實現(xiàn)。因而,本發(fā)明的方法和裝置,或者其中的某些方面和部分,可取諸如軟盤、CD-ROM、硬盤驅動器、或任何其它機器可讀存儲介質的有形介質中包含程序代碼(即指令)形式,其中當程序代碼由諸如計算機的機器載入并執(zhí)行時,該機器成為用于實踐本發(fā)明的裝置。在可編程計算機上的程序代碼執(zhí)行情形中,計算機通常包括處理器、處理器可讀的存儲介質(包括易失性和非易失性存儲器和/或存儲元件)、至少一個輸入設備、和至少一個輸出設備。一個或多個程序最好用高級過程或面向對象編程語言來與計算機通信。然而,如果需要這些程序可用匯編或機器語言實現(xiàn)。在任一情形中,語言可以是編譯或解釋語言,并可與硬件實現(xiàn)相結合。
本發(fā)明的方法和裝置也可以用通過傳輸介質傳輸?shù)某绦蚓幋a形式來體現(xiàn),諸如通過電線或電纜、通過光纖、或通過任何其它傳輸方式傳輸,其中,當程序編碼被諸如EPROM、門陣列、可編程邏輯器件(PLD)、客戶計算機、視頻記錄儀等接收、載入并執(zhí)行時,這種機器就變成實踐發(fā)明的裝置了。當在通用處理器上實現(xiàn)時,程序代碼結合處理器來提供一種能操作來實現(xiàn)本發(fā)明索引功能的獨特裝置。
盡管本發(fā)明已結合各種情形的優(yōu)選實施例進行了描述,要理解可使用其它類似實施例,或者可對所述實施例作更改和添加用于執(zhí)行本發(fā)明的系統(tǒng)功能,而沒有偏離本發(fā)明。例如,盡管是在仿真?zhèn)€人計算機功能的數(shù)字裝置的環(huán)境中描述本發(fā)明示例性實施例的,本領域技術人員間理解本發(fā)明并不限于這樣的數(shù)字裝置,因為在本申請中所述的可適用于任何數(shù)量的現(xiàn)有的或將出現(xiàn)的計算裝置或環(huán)境,諸如無論是有線或是無線的游戲控制臺、手持式計算機、便攜式計算機等,還可適用于任何數(shù)量的經通信網絡連接或通過網絡交互的計算裝置。此外,應強調專利考慮到包括手持式裝置操作系統(tǒng)和其它應用專用的硬件/軟件接口系統(tǒng)的各種計算機平臺,特別是當無限網絡裝置的數(shù)量持續(xù)激增時。因此,不應把本發(fā)明限制在任一單個實施例中,而應當根據(jù)所附權利要求在廣度和范圍中進行解釋。
最后,在此所述的已揭示實施例可適于在其它處理器體系結構、基于計算機的系統(tǒng)、或系統(tǒng)虛擬化中使用,而這樣的實施例可由在此所作的揭示明確地預期到,因此,本發(fā)明不應受限于在此所述的特定實施例,而相反應最廣泛地加以解釋。
權利要求
1.一種用于在計算機系統(tǒng)中處理較大數(shù)據(jù)對象的方法,其特征在于,所述方法包括創(chuàng)建表示所述較大數(shù)據(jù)對象的一處理結構,其中所述處理結構可通過可用于較小數(shù)據(jù)對象但不能處理所述較大數(shù)據(jù)對象的功能、操作等由所述計算機系統(tǒng)來處理。
2.如權利要求1所述的方法,其特征在于,指向第一較大數(shù)據(jù)對象的第一處理結構通過創(chuàng)建指向所述同一第一較大數(shù)據(jù)對象的第二處理結構來虛擬地復制,假設所述第一處理結構和所述第二處理結構不將變化寫入所述第一較大數(shù)據(jù)對象。
3.如權利要求2所述的方法,其特征在于,如果所述第一處理結構必須將變化寫入所述第一較大數(shù)據(jù)對象,則所述第一較大數(shù)據(jù)對象被復制到第二較大數(shù)據(jù)對象中且所述第二處理結構在所述第一處理結構將所述變化寫入所述第一較大數(shù)據(jù)對象之前就指向所述第二較大數(shù)據(jù)對象。
4.如權利要求2所述的方法,其特征在于,如果所述第二處理結構必須將變化寫入所述第一較大數(shù)據(jù)對象,則所述第一較大數(shù)據(jù)對象被復制到第二較大數(shù)據(jù)對象中且所述第二處理結構指向所述第二較大數(shù)據(jù)對象,且所述第二處理結構將把所述變化寫入所述第二較大數(shù)據(jù)對象。
5.如權利要求1所述的方法,其特征在于,用相應處理結構將具有一類型的數(shù)據(jù)對象轉換成較大數(shù)據(jù)對象,該類型來自包括文本、n文本和圖像數(shù)據(jù)類型(或其等效實體)的類型組。
6.如權利要求5所述的方法,其特征在于,類型為文本、n文本、或圖像數(shù)據(jù)類型(或等效數(shù)據(jù)類型)的數(shù)據(jù)對象被分別轉換成類型varchar(MAX)、nvarchar(MAX)和varbinary(MAX)的數(shù)據(jù)對象,其中varchar(MAX)、nvarchar(MAX)和varbinary(MAX)包括一處理結構而MAX對應于預定的最大尺寸值。
7.如權利要求1所述的方法,其特征在于,所述處理結構對應于較小值數(shù)據(jù)對象,且所述較小值數(shù)據(jù)對象完全存儲于所述處理結構中。
8.如權利要求1所述的方法,其特征在于,還包括用于所述處理結構的刪除操作,其中如果所述處理結構是第一類型的,則刪除所述處理結構和相應的較大數(shù)據(jù)對象,且其中如果所述處理結構是第二類型的,則刪除所述處理結構而不刪除所述相應的較大數(shù)據(jù)對象。
9.如權利要求1所述的方法,其特征在于,所述處理結構具有壽命,且所述處理結構包括具有與所述壽命相對應的值的一字段。
10.如權利要求1所述的方法,其特征在于,所述處理結構響應于處理結構的需要由處理結構工廠創(chuàng)建。
11.一種用于在計算機系統(tǒng)中處理較大數(shù)據(jù)對象的系統(tǒng),其特征在于,所述方法包括用于創(chuàng)建表示所述較大數(shù)據(jù)對象的一處理結構的子系統(tǒng),其中所述處理結構可通過可用于較小數(shù)據(jù)對象但不能處理所述較大數(shù)據(jù)對象的功能、操作等由所述計算機系統(tǒng)來處理。
12.如權利要求11所述的系統(tǒng),其特征在于,指向第一較大數(shù)據(jù)對象的第一處理結構通過創(chuàng)建指向所述同一第一較大數(shù)據(jù)對象的第二處理結構來虛擬地復制,假設所述第一處理結構和所述第二處理結構不將變化寫入所述第一較大數(shù)據(jù)對象。
13.如權利要求12所述的系統(tǒng),其特征在于,如果所述第一處理結構必須將變化寫入所述第一較大數(shù)據(jù)對象,則所述第一較大數(shù)據(jù)對象被復制到第二較大數(shù)據(jù)對象中且所述第二處理結構在所述第一處理結構將所述變化寫入所述第一較大數(shù)據(jù)對象之前就指向所述第二較大數(shù)據(jù)對象。
14.如權利要求12所述的系統(tǒng),其特征在于,如果所述第二處理結構必須將變化寫入所述第一較大數(shù)據(jù)對象,則所述第一較大數(shù)據(jù)對象被復制到第二較大數(shù)據(jù)對象中且所述第二處理結構指向所述第二較大數(shù)據(jù)對象,且所述第二處理結構將把所述變化寫入所述第二較大數(shù)據(jù)對象。
15.如權利要求11所述的系統(tǒng),其特征在于,用相應處理結構將具有一類型的數(shù)據(jù)對象轉換成較大數(shù)據(jù)對象,該類型來自包括文本、n文本和圖像數(shù)據(jù)類型(或其等效實體)的類型組。
16.如權利要求15所述的系統(tǒng),其特征在于,類型為文本、n文本、或圖像數(shù)據(jù)類型(或等效數(shù)據(jù)類型)的數(shù)據(jù)對象被分別轉換成類型varchar(MAX)、nvarchar(MAX)和varbinary(MAX)的數(shù)據(jù)對象,其中varchar(MAX)、nvarchar(MAX)和varbinary(MAX)包括一處理結構而MAX對應于預定的最大尺寸值。
17.如權利要求11所述的系統(tǒng),其特征在于,所述處理結構對應于較小值數(shù)據(jù)對象,且所述較小值數(shù)據(jù)對象完全存儲于所述處理結構中。
18.如權利要求11所述的系統(tǒng),其特征在于,還包括用于所述處理結構的刪除操作,其中如果所述處理結構是第一類型的,則刪除所述處理結構和相應的較大數(shù)據(jù)對象,且其中如果所述處理結構是第二類型的,則刪除所述處理結構而不刪除所述相應的較大數(shù)據(jù)對象。
19.如權利要求11所述的系統(tǒng),其特征在于,所述處理結構具有壽命,且所述處理結構包括具有與所述壽命相對應的值的一字段。
20.如權利要求11所述的系統(tǒng),其特征在于,所述處理結構響應于處理結構的需要由處理結構工廠創(chuàng)建。
21.一種包括用于在計算機系統(tǒng)中處理較大數(shù)據(jù)對象的計算機可讀指令的計算機可讀介質,其特征在于,所述計算機可讀指令包括各指令,用于創(chuàng)建表示所述較大數(shù)據(jù)對象的一處理結構,并處理帶有可用于較小數(shù)據(jù)對象但不能處理所述較大數(shù)據(jù)對象的功能、操作等的所述處理結構。
22.如權利要求21所述的計算機可讀介質,其特征在于,還包括指令,通過所述指令,指向第一較大數(shù)據(jù)對象的第一處理結構通過創(chuàng)建指向所述同一第一較大數(shù)據(jù)對象的第二處理結構來虛擬地復制,假設所述第一處理結構和所述第二處理結構不將變化寫入所述第一較大數(shù)據(jù)對象。
23.如權利要求22所述的計算機可讀介質,其特征在于,還包括指令,通過所述指令,如果所述第一處理結構必須將變化寫入所述第一較大數(shù)據(jù)對象,則所述第一較大數(shù)據(jù)對象被復制到第二較大數(shù)據(jù)對象中且所述第二處理結構在所述第一處理結構將所述變化寫入所述第一較大數(shù)據(jù)對象之前就指向所述第二較大數(shù)據(jù)對象。
24.如權利要求22所述的計算機可讀介質,其特征在于,還包括指令,通過所述指令,如果所述第二處理結構必須將變化寫入所述第一較大數(shù)據(jù)對象,則所述第一較大數(shù)據(jù)對象被復制到第二較大數(shù)據(jù)對象中且所述第二處理結構指向所述第二較大數(shù)據(jù)對象,且所述第二處理結構將把所述變化寫入所述第二較大數(shù)據(jù)對象。
25.如權利要求21所述的計算機可讀介質,其特征在于,還包括指令,通過所述指令,用相應處理結構將具有一類型的數(shù)據(jù)對象轉換成較大數(shù)據(jù)對象,該類型來自包括文本、n文本和圖像數(shù)據(jù)類型(或其等效實體)的類型組。
26.如權利要求25所述的計算機可讀介質,其特征在于,還包括指令,通過所述指令,類型為文本、n文本、或圖像數(shù)據(jù)類型(或等效數(shù)據(jù)類型)的數(shù)據(jù)對象被分別轉換成類型varchar(MAX)、nvarchar(MAX)和varbinary(MAX)的數(shù)據(jù)對象,其中varchar(MAX)、nvarchar(MAX)和varbinary(MAX)包括一處理結構而MAX對應于預定的最大尺寸值。
27.如權利要求21所述的計算機可讀介質,其特征在于,還包括指令,通過所述指令,所述處理結構對應于較小值數(shù)據(jù)對象,且所述較小值數(shù)據(jù)對象完全存儲于所述處理結構中。
28.如權利要求21所述的計算機可讀介質,其特征在于,還包括指令用于所述處理結構的刪除操作,其中如果所述處理結構是第一類型的,則刪除所述處理結構和相應的較大數(shù)據(jù)對象,且其中如果所述處理結構是第二類型的,則刪除所述處理結構而不刪除所述相應的較大數(shù)據(jù)對象。
29.如權利要求21所述的計算機可讀介質,其特征在于,還包括指令,通過所述指令,所述處理結構具有壽命,且所述處理結構包括具有與所述壽命相對應的值的一字段。
30.如權利要求21所述的計算機可讀介質,其特征在于,還包括指令,通過所述指令,所述處理結構響應于處理結構的需要由處理結構工廠創(chuàng)建。
全文摘要
本發(fā)明各實施例涉及利用作為較大值內部表示的二進制大型對象句柄(BH)。BH是對較大數(shù)據(jù)對象的不可變和無狀態(tài)的引用。BH的結構包含返回ILockBytes接口的足夠信息以便提供對相應大數(shù)據(jù)塊的訪問,并且BH還可返回有關它自己壽命描述的信息??墒褂?a)指向BH數(shù)據(jù)開始處的指針和(b)BH的字節(jié)長度來完整地描述BH。
文檔編號G06F17/30GK1723462SQ200480001703
公開日2006年1月18日 申請日期2004年7月29日 優(yōu)先權日2004年2月10日
發(fā)明者S·阿施威恩, J·A·布萊克雷, P·卡林, J·方, A·卡爾漢, C·科蘭納曼, S·斯特凡尼, A·瑟納, H·張 申請人:微軟公司