專利名稱:在例程的執(zhí)行中降低副本數(shù)的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明總地涉及在數(shù)據(jù)庫中使用的過程語言,特別地,本發(fā)明涉及使用傳值語義(by-value semantics)來提供賦值(assignment)操作的過程語音。
背景技術(shù):
數(shù)據(jù)庫系統(tǒng)是用于大量數(shù)據(jù)的有效存儲和檢索(retrieval)的計算機程序。通常以高級編程語言,諸如由ISO/IEC標準9075定義的公知結(jié)構(gòu)查詢語言(SQL)表達用于將數(shù)據(jù)存儲到數(shù)據(jù)庫系統(tǒng)以及從數(shù)據(jù)庫系統(tǒng)檢索數(shù)據(jù)的命令或語句。
有時,在使用諸如IF-THEN-ELSE和WHILE-DO之類的、不是核心SQL語言的一部分的控制結(jié)構(gòu)的例程(routine)中組合數(shù)個SQL語句。這些控制結(jié)構(gòu)通稱為過程SQL。SQL標準定義一種這樣的過程語言,稱為SQL/PSM,但是數(shù)種其它類似的過程語言也是廣為人知的。
除了語句之外,例程通常包含變量聲明。變量允許語句來保存一個或多個臨時值,以便其它語句可以隨后使用它們。例程中每個語句具有零或更多個輸入變量(其使用的變量)和零或更多個輸出變量(其賦值的變量)。
當將例程輸入到數(shù)據(jù)庫系統(tǒng)時,它們經(jīng)歷稱為匯編的處理,通過該處理將它們從諸如SQL之類的人類可讀語言翻譯為便于系統(tǒng)有效執(zhí)行例程的低級表示。實現(xiàn)例程的匯編和執(zhí)行的數(shù)據(jù)庫系統(tǒng)各部分和它們中的語句分別已知為編譯器和運行時處理器。
將數(shù)據(jù)庫中諸如姓名、電話號碼和價格之類的數(shù)據(jù)項表示為諸如整數(shù)、字符串之類的數(shù)據(jù)類型的值。近些年來,許多數(shù)據(jù)庫系統(tǒng)已經(jīng)開始提供XML數(shù)據(jù)類型來表示復雜的數(shù)據(jù)值。正在開始廣泛使用根據(jù)XQuery1.0和XPath2.0數(shù)據(jù)模型(在http://www.w3.org/TR/xpath-datamodel/中定義的工業(yè)標準)或類似模型表示XML數(shù)據(jù)類型的值的數(shù)據(jù)庫系統(tǒng)。SQL標準的最新版本基于這樣的模型合并了XML類型。通稱為SQL/XML的SQL標準的部分14專門涉及SQL中的XML的使用。
每個數(shù)據(jù)類型提供可用在該類型的值上的一組操作。SQL/XML定義諸如XMLQUERY、XMLCONCAT之類的、具有作為輸入或輸出的XML值的多種XML操作。
XML數(shù)據(jù)模型根據(jù)XQuery1.0和XPath2.0數(shù)據(jù)模型,XML數(shù)據(jù)類型的值是零或更多項的有序序列,其中每項可以是原子值(atomic value)或節(jié)點。原子值是不具有子分量的值;例如整數(shù)或字符串。另一方面,節(jié)點形成由根節(jié)點加零或多個子節(jié)點組成的樹,其中每個子節(jié)點可以具有零或多個子節(jié)點等。每個節(jié)點具有唯一身份。在數(shù)據(jù)模型的實例中每個節(jié)點是唯一的節(jié)點等同其自身,而不等同任何其它節(jié)點。原子值不具有身份,例如整數(shù)值“5”的每個實例等同整數(shù)“5”的每個其它實例。給定節(jié)點可以在序列中出現(xiàn)多次。當使用諸如XQuery之類的語言操作XML值時,給定節(jié)點,則可能獲得其父節(jié)點。如果節(jié)點N是根節(jié)點,則其父節(jié)點是空序列。否則,N的父節(jié)點是在N所屬的樹中的N的直接父節(jié)點。
圖1是上述概念的圖示。在圖1的左上角的用逗號分開的表12是包含5項的XML序列的圖形表示。這些項中的每一個表示加拿大、墨西哥或美國的城市。注意在序列12中的小圓圈和從它們開始的虛線僅僅是有助于序列的圖形表示,序列的實際項則是在虛線末尾的項。用于美國國內(nèi)城市的項14和16是包含城市名和州的字符串,而用于加拿大或墨西哥的城市的項22和26是具有兩個子節(jié)點的節(jié)點。第一子節(jié)點18a和20a包含城市名和州或省,而第二子節(jié)點18b和20b包含國家名。圓圈22、24和26表示節(jié)點,而每個圓圈22、24和26中的數(shù)字表示節(jié)點的身份。可以發(fā)現(xiàn),序列12中的第一和第四項重復,二者指向表示多倫多的節(jié)點26。此外,可以發(fā)現(xiàn)表示Cancun的節(jié)點22具有父節(jié)點24,該父節(jié)點不是序列12的項。
XML復制操作在程序的執(zhí)行中,經(jīng)常需要創(chuàng)建正在接受操作的數(shù)據(jù)值的副本。特別地,正如將簡要解釋的那樣,特定賦值操作涉及副本的創(chuàng)建。根據(jù)SQL標準中的XML副本的定義,而且與SQL中可用的其它數(shù)據(jù)類型的值的情形不同,XML類型的值的副本可能不等同原始值。實際上,當產(chǎn)生非原子XML值的副本時,副本和原始值在數(shù)種方式上不同,包括1.在副本中的節(jié)點具有與原始值中的節(jié)點不同的身份。這只是根據(jù)數(shù)據(jù)模型不同的節(jié)點必須具有不同的身份這一事實的結(jié)果。
2.在副本中每項的根節(jié)點的父節(jié)點總為空。這是因為復制操作復制節(jié)點及其子節(jié)點而不是其父節(jié)點。
3.副本從不包含到給定節(jié)點的重復引用。這是因為獨立于其它項復制在序列中每一項。因此,如果序列包括兩個或多個到給定節(jié)點的重復引用,則副本將包含用于這些重復引用的每一個的新節(jié)點。
另一方面,當復制原子值時,在每個方面上副本和原始值都是等同的。
圖2是作為圖1中所述的XML值的副本的值的圖形表示。當比較圖1和圖2時,可以發(fā)現(xiàn)圖2中的所有節(jié)點都具有與圖1中的節(jié)點不同的身份。如所看見的那樣,現(xiàn)在有三個節(jié)點54、56和58。還可以發(fā)現(xiàn)圖2中的值的第一和第四項不再重復引用表示多倫多的節(jié)點。相反,它們引用用于多倫多的兩個不同的節(jié)點(節(jié)點54和58)。最終,如圖1所示,表示Cancun的節(jié)點56沒有父節(jié)點(在圖1中,節(jié)點24是節(jié)點22的父節(jié)點,但是在圖2中節(jié)點56不具有父節(jié)點)。
因此,圖2圖解了更早產(chǎn)生的三個點。即,1.在副本中的節(jié)點具有與原始值中的節(jié)點不同的身份。
2.在副本中每項的根節(jié)點的父節(jié)點總為空。
3.副本從不包括到給定節(jié)點的重復引用。
賦值操作在過程程序中頻繁執(zhí)行的操作是賦值,其將由表達式計算的值與變量相關(guān)聯(lián)。遵從標準編程語言術(shù)語,賦值操作包括兩部分,通常稱為左邊(LHS)和右邊(RHS)。LHS是變量名,而RHS是表達式,當估算時,其產(chǎn)生該變量的值。例如,在賦值語句中SETA=B+5A和B是整數(shù)變量,A是LHS,而“B+5”是RHS。
注意術(shù)語“賦值”包括向變量賦新值的所有操作。在SQL/PSM中,這樣的操作包括上述SET語句、FETCH-INTO語句、SELECT-INTO語句和具有OUT或INOUT參數(shù)的CALL語句。
在SQL語句中,向XML類型的變量賦值可以具有傳值(by-value)語義和傳引用(by-reference)語義。使用傳引用語義,賦予變量的值是表達式產(chǎn)生的值。另一方面,使用傳值語義,賦予變量的值是由表達式產(chǎn)生的值的副本。
在原則上,使用傳引用語義的賦值比使用傳值語義的賦值更有效,這是因為前者不需要副本。然而,通常認為使用傳值語義使程序更加容易理解和維護。因此,預期操作XML數(shù)據(jù)的許多程序?qū)⑹褂脗髦嫡Z義。因此,找到實現(xiàn)該操作的有效方式是非常重要的。
因此,需要降低值的副本數(shù),從而改善數(shù)據(jù)庫系統(tǒng)中過程語言的操作效率的系統(tǒng)和方法。應(yīng)該從現(xiàn)有數(shù)據(jù)庫中容易地采用和實現(xiàn)該方法和系統(tǒng)。該系統(tǒng)和方法還應(yīng)該是成本節(jié)約的。本發(fā)明解決了該需要。
發(fā)明內(nèi)容提供了方法和系統(tǒng)來降低在例程的執(zhí)行中的副本數(shù)。在例程匯編期間,根據(jù)例程包含的操作,將例程中的每個語句分類為是否對復制敏感。在例程執(zhí)行中,使用遲鈍復制策略來確定何時應(yīng)該復制變量不對變量賦值執(zhí)行復制,而是將其延遲直到在復制敏感的語句中使用變量為止。如果在復制敏感語句中從不使用變量,則將不復制它,因此節(jié)省了計算時間和存儲量。
圖1是包含5項的XML序列的圖形表示。
圖2是圖1中所示的XML序列的副本的圖形表示。
圖3是描述使用本發(fā)明中公開的方法的系統(tǒng)的主要功能部件的圖。
圖4是概括根據(jù)本發(fā)明公開的方法的主要步驟的流程圖。
圖5是圖解處理輸入變量的第一實施例的流程圖。
圖6是圖解處理輸出變量的流程圖。
圖7是圖解處理輸入變量的第二實施例的流程圖。
具體實施方式提供下面的描述來使本領(lǐng)域普通技術(shù)人員實施和使用本發(fā)明,并且在專利申請的上下文及其需求中提供下列描述。這里描述優(yōu)選實施例的各種修改以及一般原理和特征對于那些本領(lǐng)域技術(shù)人員來說是顯而易見的。因此,本發(fā)明不希望限于所示實施例,而是應(yīng)該和與這里描述的原理和特征一致的最寬范圍相一致。
本發(fā)明可以采用整體硬件實施方式、整體軟件實施方式或包含硬件和軟件組成部分的實施方式的形式。在優(yōu)選實施例中,以軟件實現(xiàn)本發(fā)明,其包括(但不限于)固件、駐留軟件、微碼等。
此外,本發(fā)明可以采用計算機可使用或計算機可讀介質(zhì)的形式,該介質(zhì)提供由計算機或任何命令執(zhí)行系統(tǒng)使用或結(jié)合它們使用的程序代碼。為了該描述的目的,計算機可使用或計算機可讀介質(zhì)可以是可以包含、存儲、通信、傳播或傳送由命令執(zhí)行系統(tǒng)、設(shè)備或裝置使用或結(jié)合它們使用的程序的任何設(shè)備。
介質(zhì)可以是電、磁、光、光電、紅外或半導體系統(tǒng)(或設(shè)備或裝置)或傳播介質(zhì)。計算機可讀介質(zhì)的實例包括半導體或固態(tài)存儲器、磁帶、可移除計算機磁盤、隨機存取存儲器(RAM)、只讀存儲器(ROM)、硬磁盤和光盤。光盤的當前實例包括緊湊盤只讀存儲器(CD-ROM)、緊湊盤-讀/寫(CD-R/W)和DVD。
適合存儲和/或執(zhí)行程序代碼的系統(tǒng)將包括至少一個通過系統(tǒng)總線直接或間接耦合到存儲器組成部分的處理器。存儲器組成部分可以包括在程序碼的實際執(zhí)行期間采用的本地存儲器、大容量存儲器和至少提供某些程序代碼的臨時存儲以便降低在執(zhí)行期間必須從大容量存儲器中取回的代碼的次數(shù)的高速緩存存儲器。
輸入/輸出或I/O裝置(包括鍵盤、顯示器、指向裝置等,但其不限于此)可以直接或通過居間I/O控制器耦合到系統(tǒng)。
還可以將網(wǎng)絡(luò)適配器耦合到系統(tǒng)來使系統(tǒng)能夠通過居間專用或公共網(wǎng)絡(luò)來耦合到其它系統(tǒng)或遠程打印機或存儲裝置。調(diào)制解調(diào)器、電纜調(diào)制解調(diào)器和以太網(wǎng)卡僅僅是幾種網(wǎng)絡(luò)適配器當前可用類型。
盡管存在XML值及其副本不同的事實,可以發(fā)現(xiàn)甚至當不執(zhí)行傳值賦值所需的某些副本時,包括向XML類型的變量的傳值賦值的許多程序也產(chǎn)生正確的結(jié)果。
因此本發(fā)明的目的在于識別可以避免傳值賦值中的復制操作而不影響包含它們的程序的正確性的條件。這些不必要的復制操作不利地影響其中執(zhí)行程序的數(shù)據(jù)庫系統(tǒng)的執(zhí)行性能。
概述公開了降低在使用傳值賦值語義的過程語言中正確地實現(xiàn)對數(shù)據(jù)類型的變量進行支持所需要的副本數(shù)的方法和系統(tǒng)。
該方法和系統(tǒng)包括在例程匯編時執(zhí)行分析來確定如果沒有產(chǎn)生傳值賦值所需的副本則例程中哪些語句將產(chǎn)生錯誤的結(jié)果。在匯編時將這樣的語句標記為“復制敏感”。
該方法和系統(tǒng)還包括在運行時使用“遲鈍復制”策略來避免不必要的副本而不是總是產(chǎn)生副本來作為賦值操作的一部分,賦值操作僅使變量引用由賦值的RHS產(chǎn)生的值,并且將變量標記為復制未決狀態(tài)。將復制延遲直到在復制敏感的語句中使用變量為止。如果在復制敏感的語句從中沒有使用變量,則將不會做出復制,這將導致性能改善。當在復制未決狀態(tài)中的變量要被用在復制敏感語句時,做出復制,更新變量來引用副本,并且將新值用作語句的自變量。
復制敏感和復制不敏感語句直觀地,當可以由在執(zhí)行語句前復制的其一個或多個XML自變量影響語句所計算的值或其產(chǎn)生的效果時,該語句是復制敏感的。
為了提供復制敏感語句的更加精確的定義,使用在“XQuery1.0和XPath2.0功能和操作符”標準(http://www.w3.org/TR/xquery-operators)中定義的兩個XML值之間的深度相等(deep equality)概念。簡單講,如果兩個XML值的內(nèi)容和結(jié)構(gòu)等同,則它們是深度相等的,但是它們的節(jié)點可能不具有相同的身份。
首先,定義復制敏感操作,然后將使用該定義來定義復制敏感語句是什么。
讓F(X)是使用XML參數(shù)的操作,并且讓V’表示XML值V的副本。如果對于某些XML值x,F(xiàn)(x)不是深度相等于F(x’),則操作F是復制敏感的。類似地,如果對于某些值x和y,值F(x,y)、F(x’,y)、F(x,y’)和F(x’,y’)在它們之間不是全都深度相等的,則使用兩個XML參數(shù)的XML操作F(X,Y)是賦值敏感的。對于具有三個或多個XML參數(shù)的XML操作也是如此。
另一方面,當語句包括復制敏感操作,并且在傳到該操作中的自變量中使用其一個或多個XML類型輸入變量時,語句是復制敏感的。否則。語句是復制不敏感的。
例如,讓V1和V2是XML類型的變量,它們的值分別為圖1和圖2中描述的值(因此,V2是V1的副本)??紤]下面的語句SETV3=XMLQUERY(‘$V1[1]is$V1[4]’passing V1 by ref as V1)BYVALUE;語句1語句1使用變量V1作為自變量來調(diào)用XMLQUERY函數(shù),并且將結(jié)果賦予變量V3。XMLQUERY是SQL/XML的一部分,并且其允許用戶使用XQuery表達式來操作XML值。在這種情況下,XQuery表達式(在單引號中包含的)使用“is”判定(predict)以比較V1的第一和第四項的身份,并且將比較結(jié)果(“真”或“假”)賦予變量V3。假定V1的第一和第四項重復(參照圖1),則賦予V3的值為“真”。
除了使用V2而不是V1作為輸入之外,下面顯示的語句2與語句1類似。
SETV3=XMLQUERY(‘$V2[1]is$V2[4]’passing V2 by ref as V2)BYVALUE;語句2在這種情況下,賦予V3的值為“假”,這是因為V2的第一和第四元素是具有不同身份的節(jié)點。
因此,這些實例說明XMLQUERY是復制敏感的操作。此外,由于變量V1和V2是用作XMLQUERY的自變量的輸入XML變量,因此語句1和語句2都是復制敏感的語句。
現(xiàn)在考慮下面的語句,該語句使用SQL/XML XMLCONCAT函數(shù)來連接兩個XML值SETV3=XMLCONCAT(V1,V2)BY VALUE;語句3由于對于任意值x和y,XMLCONCAT(x,y)總是與XMLCONCAT(x’,y)、XMLCONCAT(x,y’)和XMLCONCAT(x’,y’)深度相等,因此XMLCONCAT函數(shù)是復制敏感的。
因此,語句3也是復制敏感的。
類似地,當即使下面顯示的語句4和語句5具有XML輸入變量,它們也不包含XML操作時,它們也是復制敏感的。
INSETRT INTO xml_values VALUES(V1);語句4
SETV1=V2BBY VALUE;語句5在語句4中,假設(shè)xml_values是具有單列XML類型的表。語句4僅將V1的值插入到表xml_values。另一方面,語句5將V1復制到V2。
在SQL/XML標準的當前版本中復制敏感操作的子集包括XMLQUERY、XMLEXISTS和XMLTABLE。SQL/XML中復制不敏感的操作的子集包括XMLPARSE、XMLCONCAT和XMLELEMENT。
減少副本數(shù)的方法為了更加詳細地描述本發(fā)明的特征,現(xiàn)在結(jié)合附圖參照下面的論述。
首先,假設(shè)已經(jīng)按照上面給出的復制敏感操作的定義標識了語言中的復制敏感的XML操作,并且以數(shù)據(jù)結(jié)構(gòu)的形式,關(guān)于哪個操作是復制敏感的操作的信息對于編譯器是可用的。例如,該數(shù)據(jù)結(jié)構(gòu)可以具有用于語言中可用的XML操作的條目,并且如果操作是復制敏感的,則用于給定操作的條目將指示“真”,否則,指示“假”。
編譯器接收例程,并且處理例程中的每個語句。對于具有XML輸入變量的每個語句,編譯器分析語句中包含的每個操作。如果任何這些操作是復制敏感的,并且如果在傳到該操作的自變量中使用語句的任何XML輸入變量,則編譯器將該語句標記為復制敏感的。這種分析的執(zhí)行在編譯器可以進行的典型任務(wù)內(nèi),因此不進一步詳細描述,使得不會混淆整體描述。
注意從此處開始,除非另行說明,詞語“賦值”將指的是使用傳值語義的賦值。
參照圖3,一旦已經(jīng)經(jīng)由編譯器302匯編了例程,則將其傳到運行處理器304,其執(zhí)行例程中的語句。注意,實際數(shù)據(jù)庫系統(tǒng)中的編譯器一般將經(jīng)匯編的例程存儲到某種形式的例程庫或?qū)υ捴?。由于例程庫或?qū)υ挷挥绊懕菊f明,因此為了簡明,我們在圖中省略了該例程庫或?qū)υ挕?br> 圖4概括本發(fā)明中公開的方法的主要步驟。參照圖4,在步驟402,首先在例程匯編時確定例程的哪些語句是復制敏感的。接下來,在每個語句的運行時,執(zhí)行后續(xù)步驟。在步驟404,處理語句的輸入變量,其中如果語句是復制敏感的,則復制被標記為復制未決的輸入變量并將其標記為非復制未決。然后,在步驟406,在處理輸入變量之后執(zhí)行語句。最后,在步驟408,在已經(jīng)執(zhí)行語句后處理語句的輸出變量,其中將具有非原子值的XML變量標記為復制未決。
在圖5和6中所示的流程圖中分別進一步描述參照圖4的XML輸入和XML輸出變量的處理。
圖5是圖解輸入變量的處理的第一實施例的流程圖。正如所看到的那樣,在步驟502接收XML類型的輸入變量。接下來,在步驟504確定語句是否是復制敏感的。如果要執(zhí)行的語句不是復制敏感的,則將不需要創(chuàng)建其使用的任何XML變量的副本,由此提供明顯的性能提升。然后,在步驟506執(zhí)行語句。另一方面,如果在步驟504確定語句是復制敏感的,則在步驟508接收第一XML變量。然后在步驟510確定輸入的XML變量是否處于復制未決狀態(tài)。
在步驟512,如果變量處于復制未決狀態(tài),則在執(zhí)行該語句之前需要復制該變量。在步驟514,一旦創(chuàng)建變量的副本,則不再將變量標記為處于復制未決狀態(tài),因此該變量的未來使用將不觸發(fā)另一“遲鈍復制”。
然后在步驟516確定語句是否具有更多的XML輸入變量。如果沒有,則在步驟506執(zhí)行語句。如果有,則在步驟518接收下一XML輸入變量。返回到步驟510,如果在步驟510確定變量不處于復制未決狀態(tài),則在步驟516確定語句是否具有更多的XML輸入變量。如果沒有,則在步驟506執(zhí)行語句。如果有,則在步驟518接收下一XML輸入變量。這些步驟510-516繼續(xù)直到已經(jīng)處理了所有XML輸入變量為止,然后在步驟506執(zhí)行語句。
圖6是圖解語句輸出變量的處理流程圖。正如所看到的那樣,首先在步驟602接收語句的輸出變量。然后在步驟604確定語句是否具有一個或多個輸出XML變量。如果沒有,則在步驟606結(jié)束該語句的執(zhí)行。如果有,則在步驟608接收第一XML輸出變量的值。
接下來,在步驟610將值賦予變量,但是不制作副本。然后在步驟612確定正在賦予的值是否是原子(atomic)的。如果是,則在步驟614將變量標記為不處于復制未決狀態(tài),并且處理前進到步驟618來確定語句是否具有更多的XML輸出變量。
返回到步驟612,如果正在賦的值不是原子的,則在步驟616將變量標記為處于復制未決狀態(tài)。然后在步驟618確定語句是否具有更多的XML輸出變量。如果有,則在步驟620為下一XML輸出變量接收該值。如果沒有,則在步驟606執(zhí)行下一語句。注意,從不將包含原子XML值的變量標記為處于復制未決狀態(tài)。這些步驟610-618繼續(xù)直到已經(jīng)處理了所有XML輸出變量為止,然后在步驟606結(jié)束語句的執(zhí)行。
避免額外的復制當在例程中操作的XML值是節(jié)點(與具有多于一個項的序列相反)時,上述方法的簡單修改使得可以避免額外的復制,這將在下面解釋。
當復制沒有父節(jié)點的節(jié)點時,原始值和副本之間僅可能存在的差別是節(jié)點的身份。另一方面,僅當比較來自兩個不同樹的節(jié)點時,節(jié)點身份才能影響操作的結(jié)果。這是因為對身份僅有的操作是相等比較,而屬于同一樹的兩個節(jié)點的身份總是不同的。因此,當執(zhí)行具有單一輸入變量的語句時,如果變量的值是不具有父節(jié)點的節(jié)點,則即使變量處于復制未決狀態(tài),也需要在執(zhí)行語句之前來創(chuàng)建該變量的副本。不具有父節(jié)點的節(jié)點的示例是圖1的節(jié)點26,其表示多倫多城。
如果輸入變量的值是具有父節(jié)點的節(jié)點(參照圖1的節(jié)點22),則XML操作可以使用該父節(jié)點來計算其結(jié)果。因此,當輸入變量的值是節(jié)點的副本時,該操作將產(chǎn)生不同的結(jié)果(參照圖2的節(jié)點56)。
圖7是圖解處理輸入變量的第二實施例的流程圖。正如所看見的那樣,當與圖5比較時,圖7具有兩個附加的步驟702和704。如果語句是復制敏感的,則在步驟702確定語句是否確實具有一個輸入變量。如果語句具有多于一個變量,則前進到步驟508’并且以與圖5所述的方式相同的方式執(zhí)行流程圖。然而,如果確實存在一個輸入變量,則在步驟704確定變量的值是否是不具有父節(jié)點的節(jié)點。如果變量的值不是不具有父節(jié)點的節(jié)點,前進到步驟508’并且以與圖5所述的方式相同的方式執(zhí)行流程圖。然而,如果值是不具有父節(jié)點的節(jié)點,則在步驟506’執(zhí)行該語句。
雖然根據(jù)所示的實施例已經(jīng)描述了本發(fā)明,但是本領(lǐng)域普通技術(shù)人員將認識到可以對實施例做出變型,并且這些變型在本發(fā)明的宗旨和范圍中。例如,在SQL/XML和SQL/PSM的上下文中描述了根據(jù)本發(fā)明的系統(tǒng)和方法。本領(lǐng)域普通技術(shù)人員認識到可以使用大量其它的過程語言或其它數(shù)據(jù)類型,并且它們的使用在本發(fā)明的宗旨和范圍內(nèi)。具體地,任何具有關(guān)于XML的變量的傳值賦值語義的過程語言或具有復制操作使得值的副本在每個方面上都不等于原始值的類似數(shù)據(jù)類型都可以從根據(jù)本發(fā)明的系統(tǒng)和方法中獲得益處。
因此,本領(lǐng)域技術(shù)人員可以做出許多修改,而不背離所附權(quán)利要求
的宗旨和范圍。
權(quán)利要求
1.一種用于在例程的執(zhí)行中減少副本數(shù)的方法,該方法包括在例程匯編時確定例程中哪些語句是復制敏感的;和對例程中的每個語句在運行時處理語句的多個輸入變量,其中如果語句是復制敏感的,則復制被標記為復制未決的多個輸入變量并將其標記為非復制未決;在處理了多個輸入變量之后執(zhí)行語句;和在已經(jīng)執(zhí)行了語句之后處理語句的多個輸出變量,其中將具有非原子值的多個輸出變量標記為復制未決。
2.如權(quán)利要求
1所述的方法,其中處理關(guān)于復制敏感語句的多個輸入變量包括接收語句的輸入變量;確定變量是否處于復制未決狀態(tài);如果變量處于復制未決狀態(tài),則將變量的當前值替換為當前值的副本;將變量標記為不處于復制未決狀態(tài);確定語句是否具有更多的輸入變量;重復以上步驟直到處理了所有的輸入變量為止;和在處理了所有的輸入變量之后執(zhí)行語句。
3.如權(quán)利要求
1所述的方法,其中每個語句包括以SQL過程語言編寫的例程中的語句。
4.如權(quán)利要求
1所述的方法,其中被標記為復制未決的變量包括XML變量。
5.如權(quán)利要求
2所述的方法,其中處理關(guān)于每個語句的多個輸出變量包括如果語句不具有輸出變量,則結(jié)束語句的執(zhí)行;否則接收關(guān)于第一輸出變量的值;將值賦予變量,而不制作副本;如果正在賦予變量的值不是原子的,則將變量標記為處于復制未決狀態(tài);如果正在賦予變量的值是原子的,則將變量標記為不處于復制未決狀態(tài);確定語句是否具有更多的輸出變量;重復以上步驟直到處理了所有輸出變量為止;和當處理了所有輸出變量時結(jié)束語句的執(zhí)行。
6.如權(quán)利要求
5所述的方法,其中語句包括以SQL過程語言編寫的例程中的語句。
7.如權(quán)利要求
2所述的方法,其中如果輸入變量的值是不具有父節(jié)點的節(jié)點,則即使變量處于復制未決狀態(tài),也不需要在執(zhí)行語句之前創(chuàng)建變量的副本。
8.一種系統(tǒng),包括編譯器,該編譯器包括用于確定例程中哪些語句是復制敏感的機構(gòu);和運行時處理器,包括機構(gòu)來處理例程中語句的多個輸入變量,其中如果語句是復制敏感的,則復制被標記為復制未決的多個輸入變量并將其標記為非復制未決;在已經(jīng)處理了語句的輸入變量之后執(zhí)行例程中的語句;和在已經(jīng)執(zhí)行了語句之后處理例程中語句的多個輸出變量,其中將具有非原子值的輸出變量標記為復制未決。
9.如權(quán)利要求
8所述的系統(tǒng),其中用于處理關(guān)于語句的多個輸入變量的機構(gòu)包括機構(gòu),用于接收語句的輸入變量;確定輸入變量是否處于復制未決狀態(tài);如果輸入變量處于復制未決狀態(tài),則將變量的值替換為當前值的副本;將替換后的值標記為不處于復制未決狀態(tài);確定語句是否具有更多的輸入變量;重復以上步驟直到處理了所有的輸入變量為止;和在處理了所有的輸入變量之后執(zhí)行語句。
10.如權(quán)利要求
8所述的系統(tǒng),其中被標記為復制未決的變量包括XML變量。
11.如權(quán)利要求
8所述的系統(tǒng),其中語句包括以SQL過程語言編寫的例程中的語句。
12.如權(quán)利要求
9所述的系統(tǒng),其中用于處理關(guān)于語句的多個輸出變量的機構(gòu)包括機構(gòu),用于如果語句不具有輸出變量,則結(jié)束語句的執(zhí)行;否則接收用于第一輸出變量的值;將該值賦予變量,而不制作副本;如果正在賦予變量的值不是原子的,則將變量標記為處于復制未決狀態(tài);如果正在賦予變量的值是原子的,則將變量標記為不處于復制未決狀態(tài);確定語句是否具有更多的輸出變量;重復以上步驟直到處理了所有輸出變量為止;和當處理了所有輸出變量時結(jié)束語句的執(zhí)行。
13.如權(quán)利要求
12所述的系統(tǒng),其中語句包括以SQL過程語言編寫的例程中的語句。
14.如權(quán)利要求
8所述的系統(tǒng),其中如果變量的值是不具有父節(jié)點的節(jié)點,則即使變量處于復制未決狀態(tài),也不需要在執(zhí)行語句之前創(chuàng)建變量的副本。
專利摘要
提供用于使用傳值賦值語義來降低以過程語言編寫的例程的執(zhí)行中的副本數(shù)的方法和系統(tǒng)。在例程匯編期間,根據(jù)語句包含的操作,將例程中的每個語句被分為復制敏感或非復制敏感。在例程執(zhí)行期間,使用遲鈍復制策略來確定何時應(yīng)該復制變量不在變量賦值上執(zhí)行復制,而是將其延遲直到在復制敏感語句中使用變量為止。如果從不在復制敏感的語句中使用變量,則將不復制它,因此節(jié)省了計算時間和存儲。
文檔編號G06F9/45GK1996255SQ200710002132
公開日2007年7月11日 申請日期2007年1月4日
發(fā)明者古斯塔沃·阿羅塞納 申請人:國際商業(yè)機器公司導出引文BiBTeX, EndNote, RefMan