專利名稱:在例程的執(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ù)種其它類似的過程語言也是廣為人知的。
除了語句之外,例程通常包含變量聲明。變量允許語句來保存一個或多個臨時值,以便其它語句可以隨后使用它們。例程中每個語句具有零或更多個輸入變量(其使用的變量)和零或更多個輸出變量(其賦值的變量)。
當(dāng)將例程輸入到數(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ù)類型來表示復(fù)雜的數(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)多次。當(dāng)使用諸如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é)點的身份??梢园l(fā)現(xiàn),序列12中的第一和第四項重復(fù),二者指向表示多倫多的節(jié)點26。此外,可以發(fā)現(xiàn)表示Cancun的節(jié)點22具有父節(jié)點24,該父節(jié)點不是序列12的項。
XML復(fù)制操作在程序的執(zhí)行中,經(jīng)常需要創(chuàng)建正在接受操作的數(shù)據(jù)值的副本。特別地,正如將簡要解釋的那樣,特定賦值操作涉及副本的創(chuàng)建。根據(jù)SQL標準中的XML副本的定義,而且與SQL中可用的其它數(shù)據(jù)類型的值的情形不同,XML類型的值的副本可能不等同原始值。實際上,當(dāng)產(chǎn)生非原子XML值的副本時,副本和原始值在數(shù)種方式上不同,包括1.在副本中的節(jié)點具有與原始值中的節(jié)點不同的身份。這只是根據(jù)數(shù)據(jù)模型不同的節(jié)點必須具有不同的身份這一事實的結(jié)果。
2.在副本中每項的根節(jié)點的父節(jié)點總為空。這是因為復(fù)制操作復(fù)制節(jié)點及其子節(jié)點而不是其父節(jié)點。
3.副本從不包含到給定節(jié)點的重復(fù)引用。這是因為獨立于其它項復(fù)制在序列中每一項。因此,如果序列包括兩個或多個到給定節(jié)點的重復(fù)引用,則副本將包含用于這些重復(fù)引用的每一個的新節(jié)點。
另一方面,當(dāng)復(fù)制原子值時,在每個方面上副本和原始值都是等同的。
圖2是作為圖1中所述的XML值的副本的值的圖形表示。當(dāng)比較圖1和圖2時,可以發(fā)現(xiàn)圖2中的所有節(jié)點都具有與圖1中的節(jié)點不同的身份。如所看見的那樣,現(xiàn)在有三個節(jié)點54、56和58。還可以發(fā)現(xiàn)圖2中的值的第一和第四項不再重復(fù)引用表示多倫多的節(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é)點的重復(fù)引用。
賦值操作在過程程序中頻繁執(zhí)行的操作是賦值,其將由表達式計算的值與變量相關(guān)聯(lián)。遵從標準編程語言術(shù)語,賦值操作包括兩部分,通常稱為左邊(LHS)和右邊(RHS)。LHS是變量名,而RHS是表達式,當(dāng)估算時,其產(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)生的值的副本。
在原則上,使用傳引用語義的賦值比使用傳值語義的賦值更有效,這是因為前者不需要副本。然而,通常認為使用傳值語義使程序更加容易理解和維護。因此,預(yù)期操作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ù)例程包含的操作,將例程中的每個語句分類為是否對復(fù)制敏感。在例程執(zhí)行中,使用遲鈍復(fù)制策略來確定何時應(yīng)該復(fù)制變量不對變量賦值執(zhí)行復(fù)制,而是將其延遲直到在復(fù)制敏感的語句中使用變量為止。如果在復(fù)制敏感語句中從不使用變量,則將不復(fù)制它,因此節(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ì)可以是電、磁、光、光電、紅外或半導(dǎo)體系統(tǒng)(或設(shè)備或裝置)或傳播介質(zhì)。計算機可讀介質(zhì)的實例包括半導(dǎo)體或固態(tài)存儲器、磁帶、可移除計算機磁盤、隨機存取存儲器(RAM)、只讀存儲器(ROM)、硬磁盤和光盤。光盤的當(dāng)前實例包括緊湊盤只讀存儲器(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ò)適配器當(dāng)前可用類型。
盡管存在XML值及其副本不同的事實,可以發(fā)現(xiàn)甚至當(dāng)不執(zhí)行傳值賦值所需的某些副本時,包括向XML類型的變量的傳值賦值的許多程序也產(chǎn)生正確的結(jié)果。
因此本發(fā)明的目的在于識別可以避免傳值賦值中的復(fù)制操作而不影響包含它們的程序的正確性的條件。這些不必要的復(fù)制操作不利地影響其中執(zhí)行程序的數(shù)據(jù)庫系統(tǒng)的執(zhí)行性能。
概述公開了降低在使用傳值賦值語義的過程語言中正確地實現(xiàn)對數(shù)據(jù)類型的變量進行支持所需要的副本數(shù)的方法和系統(tǒng)。
該方法和系統(tǒng)包括在例程匯編時執(zhí)行分析來確定如果沒有產(chǎn)生傳值賦值所需的副本則例程中哪些語句將產(chǎn)生錯誤的結(jié)果。在匯編時將這樣的語句標記為“復(fù)制敏感”。
該方法和系統(tǒng)還包括在運行時使用“遲鈍復(fù)制”策略來避免不必要的副本而不是總是產(chǎn)生副本來作為賦值操作的一部分,賦值操作僅使變量引用由賦值的RHS產(chǎn)生的值,并且將變量標記為復(fù)制未決狀態(tài)。將復(fù)制延遲直到在復(fù)制敏感的語句中使用變量為止。如果在復(fù)制敏感的語句從中沒有使用變量,則將不會做出復(fù)制,這將導(dǎo)致性能改善。當(dāng)在復(fù)制未決狀態(tài)中的變量要被用在復(fù)制敏感語句時,做出復(fù)制,更新變量來引用副本,并且將新值用作語句的自變量。
復(fù)制敏感和復(fù)制不敏感語句直觀地,當(dāng)可以由在執(zhí)行語句前復(fù)制的其一個或多個XML自變量影響語句所計算的值或其產(chǎn)生的效果時,該語句是復(fù)制敏感的。
為了提供復(fù)制敏感語句的更加精確的定義,使用在“XQuery1.0和XPath2.0功能和操作符”標準(http://www.w3.org/TR/xquery-operators)中定義的兩個XML值之間的深度相等(deep equality)概念。簡單講,如果兩個XML值的內(nèi)容和結(jié)構(gòu)等同,則它們是深度相等的,但是它們的節(jié)點可能不具有相同的身份。
首先,定義復(fù)制敏感操作,然后將使用該定義來定義復(fù)制敏感語句是什么。
讓F(X)是使用XML參數(shù)的操作,并且讓V’表示XML值V的副本。如果對于某些XML值x,F(xiàn)(x)不是深度相等于F(x’),則操作F是復(fù)制敏感的。類似地,如果對于某些值x和y,值F(x,y)、F(x’,y)、F(x,y’)和F(x’,y’)在它們之間不是全都深度相等的,則使用兩個XML參數(shù)的XML操作F(X,Y)是賦值敏感的。對于具有三個或多個XML參數(shù)的XML操作也是如此。
另一方面,當(dāng)語句包括復(fù)制敏感操作,并且在傳到該操作中的自變量中使用其一個或多個XML類型輸入變量時,語句是復(fù)制敏感的。否則。語句是復(fù)制不敏感的。
例如,讓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的第一和第四項重復(fù)(參照圖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是復(fù)制敏感的操作。此外,由于變量V1和V2是用作XMLQUERY的自變量的輸入XML變量,因此語句1和語句2都是復(fù)制敏感的語句。
現(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ù)是復(fù)制敏感的。
因此,語句3也是復(fù)制敏感的。
類似地,當(dāng)即使下面顯示的語句4和語句5具有XML輸入變量,它們也不包含XML操作時,它們也是復(fù)制敏感的。
INSETRT INTO xml_values VALUES(V1);語句4
SETV1=V2BBY VALUE;語句5在語句4中,假設(shè)xml_values是具有單列XML類型的表。語句4僅將V1的值插入到表xml_values。另一方面,語句5將V1復(fù)制到V2。
在SQL/XML標準的當(dāng)前版本中復(fù)制敏感操作的子集包括XMLQUERY、XMLEXISTS和XMLTABLE。SQL/XML中復(fù)制不敏感的操作的子集包括XMLPARSE、XMLCONCAT和XMLELEMENT。
減少副本數(shù)的方法為了更加詳細地描述本發(fā)明的特征,現(xiàn)在結(jié)合附圖參照下面的論述。
首先,假設(shè)已經(jīng)按照上面給出的復(fù)制敏感操作的定義標識了語言中的復(fù)制敏感的XML操作,并且以數(shù)據(jù)結(jié)構(gòu)的形式,關(guān)于哪個操作是復(fù)制敏感的操作的信息對于編譯器是可用的。例如,該數(shù)據(jù)結(jié)構(gòu)可以具有用于語言中可用的XML操作的條目,并且如果操作是復(fù)制敏感的,則用于給定操作的條目將指示“真”,否則,指示“假”。
編譯器接收例程,并且處理例程中的每個語句。對于具有XML輸入變量的每個語句,編譯器分析語句中包含的每個操作。如果任何這些操作是復(fù)制敏感的,并且如果在傳到該操作的自變量中使用語句的任何XML輸入變量,則編譯器將該語句標記為復(fù)制敏感的。這種分析的執(zhí)行在編譯器可以進行的典型任務(wù)內(nèi),因此不進一步詳細描述,使得不會混淆整體描述。
注意從此處開始,除非另行說明,詞語“賦值”將指的是使用傳值語義的賦值。
參照圖3,一旦已經(jīng)經(jīng)由編譯器302匯編了例程,則將其傳到運行處理器304,其執(zhí)行例程中的語句。注意,實際數(shù)據(jù)庫系統(tǒng)中的編譯器一般將經(jīng)匯編的例程存儲到某種形式的例程庫或?qū)υ捴小S捎诶處旎驅(qū)υ挷挥绊懕菊f明,因此為了簡明,我們在圖中省略了該例程庫或?qū)υ挕?br>
圖4概括本發(fā)明中公開的方法的主要步驟。參照圖4,在步驟402,首先在例程匯編時確定例程的哪些語句是復(fù)制敏感的。接下來,在每個語句的運行時,執(zhí)行后續(xù)步驟。在步驟404,處理語句的輸入變量,其中如果語句是復(fù)制敏感的,則復(fù)制被標記為復(fù)制未決的輸入變量并將其標記為非復(fù)制未決。然后,在步驟406,在處理輸入變量之后執(zhí)行語句。最后,在步驟408,在已經(jīng)執(zhí)行語句后處理語句的輸出變量,其中將具有非原子值的XML變量標記為復(fù)制未決。
在圖5和6中所示的流程圖中分別進一步描述參照圖4的XML輸入和XML輸出變量的處理。
圖5是圖解輸入變量的處理的第一實施例的流程圖。正如所看到的那樣,在步驟502接收XML類型的輸入變量。接下來,在步驟504確定語句是否是復(fù)制敏感的。如果要執(zhí)行的語句不是復(fù)制敏感的,則將不需要創(chuàng)建其使用的任何XML變量的副本,由此提供明顯的性能提升。然后,在步驟506執(zhí)行語句。另一方面,如果在步驟504確定語句是復(fù)制敏感的,則在步驟508接收第一XML變量。然后在步驟510確定輸入的XML變量是否處于復(fù)制未決狀態(tài)。
在步驟512,如果變量處于復(fù)制未決狀態(tài),則在執(zhí)行該語句之前需要復(fù)制該變量。在步驟514,一旦創(chuàng)建變量的副本,則不再將變量標記為處于復(fù)制未決狀態(tài),因此該變量的未來使用將不觸發(fā)另一“遲鈍復(fù)制”。
然后在步驟516確定語句是否具有更多的XML輸入變量。如果沒有,則在步驟506執(zhí)行語句。如果有,則在步驟518接收下一XML輸入變量。返回到步驟510,如果在步驟510確定變量不處于復(fù)制未決狀態(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將變量標記為不處于復(fù)制未決狀態(tài),并且處理前進到步驟618來確定語句是否具有更多的XML輸出變量。
返回到步驟612,如果正在賦的值不是原子的,則在步驟616將變量標記為處于復(fù)制未決狀態(tài)。然后在步驟618確定語句是否具有更多的XML輸出變量。如果有,則在步驟620為下一XML輸出變量接收該值。如果沒有,則在步驟606執(zhí)行下一語句。注意,從不將包含原子XML值的變量標記為處于復(fù)制未決狀態(tài)。這些步驟610-618繼續(xù)直到已經(jīng)處理了所有XML輸出變量為止,然后在步驟606結(jié)束語句的執(zhí)行。
避免額外的復(fù)制當(dāng)在例程中操作的XML值是節(jié)點(與具有多于一個項的序列相反)時,上述方法的簡單修改使得可以避免額外的復(fù)制,這將在下面解釋。
當(dāng)復(fù)制沒有父節(jié)點的節(jié)點時,原始值和副本之間僅可能存在的差別是節(jié)點的身份。另一方面,僅當(dāng)比較來自兩個不同樹的節(jié)點時,節(jié)點身份才能影響操作的結(jié)果。這是因為對身份僅有的操作是相等比較,而屬于同一樹的兩個節(jié)點的身份總是不同的。因此,當(dāng)執(zhí)行具有單一輸入變量的語句時,如果變量的值是不具有父節(jié)點的節(jié)點,則即使變量處于復(fù)制未決狀態(tài),也需要在執(zhí)行語句之前來創(chuàng)建該變量的副本。不具有父節(jié)點的節(jié)點的示例是圖1的節(jié)點26,其表示多倫多城。
如果輸入變量的值是具有父節(jié)點的節(jié)點(參照圖1的節(jié)點22),則XML操作可以使用該父節(jié)點來計算其結(jié)果。因此,當(dāng)輸入變量的值是節(jié)點的副本時,該操作將產(chǎn)生不同的結(jié)果(參照圖2的節(jié)點56)。
圖7是圖解處理輸入變量的第二實施例的流程圖。正如所看見的那樣,當(dāng)與圖5比較時,圖7具有兩個附加的步驟702和704。如果語句是復(fù)制敏感的,則在步驟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的變量的傳值賦值語義的過程語言或具有復(fù)制操作使得值的副本在每個方面上都不等于原始值的類似數(shù)據(jù)類型都可以從根據(jù)本發(fā)明的系統(tǒng)和方法中獲得益處。
因此,本領(lǐng)域技術(shù)人員可以做出許多修改,而不背離所附權(quán)利要求的宗旨和范圍。
權(quán)利要求
1.一種用于在例程的執(zhí)行中減少副本數(shù)的方法,該方法包括在例程匯編時確定例程中哪些語句是復(fù)制敏感的;和對例程中的每個語句在運行時處理語句的多個輸入變量,其中如果語句是復(fù)制敏感的,則復(fù)制被標記為復(fù)制未決的多個輸入變量并將其標記為非復(fù)制未決;在處理了多個輸入變量之后執(zhí)行語句;和在已經(jīng)執(zhí)行了語句之后處理語句的多個輸出變量,其中將具有非原子值的多個輸出變量標記為復(fù)制未決。
2.如權(quán)利要求1所述的方法,其中處理關(guān)于復(fù)制敏感語句的多個輸入變量包括接收語句的輸入變量;確定變量是否處于復(fù)制未決狀態(tài);如果變量處于復(fù)制未決狀態(tài),則將變量的當(dāng)前值替換為當(dāng)前值的副本;將變量標記為不處于復(fù)制未決狀態(tài);確定語句是否具有更多的輸入變量;重復(fù)以上步驟直到處理了所有的輸入變量為止;和在處理了所有的輸入變量之后執(zhí)行語句。
3.如權(quán)利要求1所述的方法,其中每個語句包括以SQL過程語言編寫的例程中的語句。
4.如權(quán)利要求1所述的方法,其中被標記為復(fù)制未決的變量包括XML變量。
5.如權(quán)利要求2所述的方法,其中處理關(guān)于每個語句的多個輸出變量包括如果語句不具有輸出變量,則結(jié)束語句的執(zhí)行;否則接收關(guān)于第一輸出變量的值;將值賦予變量,而不制作副本;如果正在賦予變量的值不是原子的,則將變量標記為處于復(fù)制未決狀態(tài);如果正在賦予變量的值是原子的,則將變量標記為不處于復(fù)制未決狀態(tài);確定語句是否具有更多的輸出變量;重復(fù)以上步驟直到處理了所有輸出變量為止;和當(dāng)處理了所有輸出變量時結(jié)束語句的執(zhí)行。
6.如權(quán)利要求5所述的方法,其中語句包括以SQL過程語言編寫的例程中的語句。
7.如權(quán)利要求2所述的方法,其中如果輸入變量的值是不具有父節(jié)點的節(jié)點,則即使變量處于復(fù)制未決狀態(tài),也不需要在執(zhí)行語句之前創(chuàng)建變量的副本。
8.一種系統(tǒng),包括編譯器,該編譯器包括用于確定例程中哪些語句是復(fù)制敏感的機構(gòu);和運行時處理器,包括機構(gòu)來處理例程中語句的多個輸入變量,其中如果語句是復(fù)制敏感的,則復(fù)制被標記為復(fù)制未決的多個輸入變量并將其標記為非復(fù)制未決;在已經(jīng)處理了語句的輸入變量之后執(zhí)行例程中的語句;和在已經(jīng)執(zhí)行了語句之后處理例程中語句的多個輸出變量,其中將具有非原子值的輸出變量標記為復(fù)制未決。
9.如權(quán)利要求8所述的系統(tǒng),其中用于處理關(guān)于語句的多個輸入變量的機構(gòu)包括機構(gòu),用于接收語句的輸入變量;確定輸入變量是否處于復(fù)制未決狀態(tài);如果輸入變量處于復(fù)制未決狀態(tài),則將變量的值替換為當(dāng)前值的副本;將替換后的值標記為不處于復(fù)制未決狀態(tài);確定語句是否具有更多的輸入變量;重復(fù)以上步驟直到處理了所有的輸入變量為止;和在處理了所有的輸入變量之后執(zhí)行語句。
10.如權(quán)利要求8所述的系統(tǒng),其中被標記為復(fù)制未決的變量包括XML變量。
11.如權(quán)利要求8所述的系統(tǒng),其中語句包括以SQL過程語言編寫的例程中的語句。
12.如權(quán)利要求9所述的系統(tǒng),其中用于處理關(guān)于語句的多個輸出變量的機構(gòu)包括機構(gòu),用于如果語句不具有輸出變量,則結(jié)束語句的執(zhí)行;否則接收用于第一輸出變量的值;將該值賦予變量,而不制作副本;如果正在賦予變量的值不是原子的,則將變量標記為處于復(fù)制未決狀態(tài);如果正在賦予變量的值是原子的,則將變量標記為不處于復(fù)制未決狀態(tài);確定語句是否具有更多的輸出變量;重復(fù)以上步驟直到處理了所有輸出變量為止;和當(dāng)處理了所有輸出變量時結(jié)束語句的執(zhí)行。
13.如權(quán)利要求12所述的系統(tǒng),其中語句包括以SQL過程語言編寫的例程中的語句。
14.如權(quán)利要求8所述的系統(tǒng),其中如果變量的值是不具有父節(jié)點的節(jié)點,則即使變量處于復(fù)制未決狀態(tài),也不需要在執(zhí)行語句之前創(chuàng)建變量的副本。
全文摘要
提供用于使用傳值賦值語義來降低以過程語言編寫的例程的執(zhí)行中的副本數(shù)的方法和系統(tǒng)。在例程匯編期間,根據(jù)語句包含的操作,將例程中的每個語句被分為復(fù)制敏感或非復(fù)制敏感。在例程執(zhí)行期間,使用遲鈍復(fù)制策略來確定何時應(yīng)該復(fù)制變量不在變量賦值上執(zhí)行復(fù)制,而是將其延遲直到在復(fù)制敏感語句中使用變量為止。如果從不在復(fù)制敏感的語句中使用變量,則將不復(fù)制它,因此節(jié)省了計算時間和存儲。
文檔編號G06F9/45GK1996255SQ20071000213
公開日2007年7月11日 申請日期2007年1月4日 優(yōu)先權(quán)日2006年1月6日
發(fā)明者古斯塔沃·阿羅塞納 申請人:國際商業(yè)機器公司