專利名稱:動態(tài)和自動內(nèi)存管理的制作方法
背景技術(shù):
在典型數(shù)據(jù)庫系統(tǒng)中,用戶通過把命令提交給諸如Oracle之類的數(shù)據(jù)庫應(yīng)用,來存儲、更新和檢索信息。當(dāng)進(jìn)行事務(wù)處理時,數(shù)據(jù)庫應(yīng)用把信息存儲在內(nèi)存中和盤上。為了使性能最佳,除了盤之外,還必須把盡可能多的信息存儲在內(nèi)存中。但是,由于內(nèi)存資源是有限的,數(shù)據(jù)庫應(yīng)用必須協(xié)調(diào)涉及到把可用內(nèi)存分配給數(shù)據(jù)庫應(yīng)用使用的結(jié)構(gòu)的內(nèi)存分配。
正如可從Oracle公司和因特網(wǎng)上網(wǎng)址htt//oradoc.photo.net/ora81/DOC/server.815/a67781/toc.htm獲得的圖書《Oracle8i概念》(將該圖書的全文插在本文中,以供參考)所述的那樣,數(shù)據(jù)庫應(yīng)用Oracle所使用的兩種結(jié)構(gòu)是稱為系統(tǒng)全局區(qū)(SGA)和程序全局區(qū)(PGA)的內(nèi)存區(qū)。SGA包含有關(guān)Oracle進(jìn)程需要訪問的數(shù)據(jù)庫和實例的狀態(tài)的一般信息。在SGA中不存儲用戶數(shù)據(jù)。SGA的尺寸在啟動Oracle的時候確定。為了使大多數(shù)系統(tǒng)的性能最佳,整個SGA應(yīng)該與實內(nèi)存相適應(yīng)。數(shù)據(jù)庫管理器(DBA)通過發(fā)出SQL語句“SHOW SGA”??梢钥吹蕉嗌賰?nèi)存被分配給SGA和它的每個內(nèi)部結(jié)構(gòu)。
PGA是當(dāng)進(jìn)程開始時,為保存數(shù)據(jù)和控制每個進(jìn)程的信息而創(chuàng)建的。PGA專用于Oracle中的每個進(jìn)程,但這樣的PGA可以處在共享內(nèi)存中。PGA初始尺寸在啟動相應(yīng)進(jìn)程的時候是固定的,并且是操作系統(tǒng)專用的。當(dāng)前,在Oracle8i中,DBA可以利用像SORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZE和CREATE_BITMAP_AREA_SIZE那樣的各種參數(shù),控制PGA內(nèi)存利用。有關(guān)這樣參數(shù)的更多信息,請參閱可從網(wǎng)址htt//oradoc.photo.net/ora81/DOC/server.815/a67775/toc.htm獲得的圖書《Oracle8i Tuning》(將該圖書的全文插在本文中,以供參考)。
還可以參閱名稱為“按照指定值或閾值為存儲來自排序操作的數(shù)據(jù)分配專用或共享緩沖內(nèi)存的方法(Method for allocating either private or sharedbuffer memory for storing data from sort operations in accordance with anassigned value or threshold value)”、授予Cohen等人的美國專利第5,799,210號、名稱為“串行可重用執(zhí)行內(nèi)存(Serially reusable execution memory)”、授予Jasuja等人的美國專利第5,987,144號、名稱為“允許大量進(jìn)程訪問巨型物理內(nèi)存緩沖區(qū)的尋址方法和系統(tǒng)(Addressmg method and system for providingaccess of a very large size physical memory buffer to a number of processes)”、授予Frank等人的美國專利第5,860,144號,以及名稱為“利用位圖索引在計算機(jī)中進(jìn)行動態(tài)內(nèi)存分配(Dynamic memory allocation in a computer using a bitmap index)”、授予McMahon等人的美國專利第5,784,699號,所有這些專利都與數(shù)據(jù)庫進(jìn)程使用內(nèi)存有關(guān)。
有關(guān)附加信息,請參閱Luc Bouganim、Olga Kapitskaia和Patrick Valduriez發(fā)表在Networking and Information Systems 1(6)629-652(1998)上的論文《大型查詢執(zhí)行的動態(tài)內(nèi)存分配》(“Dynamic Memory Allocation for Large QueryExecution”)。還可以參閱這三位作者發(fā)表在pages 105-115 of Proceedings ofConference on Information and Knowledge Manage- ment,1998 published byAssociation for Computing Machinery,Inc上的論文《大型查詢執(zhí)行的內(nèi)存自適應(yīng)調(diào)度》(“Memory-Adaptive Scheduling for Large Query Execution”)。這個領(lǐng)域中的另一篇論文是Diane L.Davison和Goetz Graefe發(fā)表在SIGMODConferene 1995281-292上的論文《多用戶查詢執(zhí)行的動態(tài)資源中介代理》(“Dynamic Resource Brokering for Multi-User Query Execution”)。
發(fā)明概述按照本發(fā)明編程的計算機(jī)對定義供諸如數(shù)據(jù)庫之類的應(yīng)用使用的總內(nèi)存量的值敏感。在一個例子中,數(shù)據(jù)庫管理器(DBA)提供這樣的值(也稱為“外部設(shè)置全局值”)。在另一個例子中,外部設(shè)置全局值是根據(jù)例如系統(tǒng)中當(dāng)前可用的內(nèi)存量自動確定的。此后,計算機(jī)按照(全部或至少部分)從外部設(shè)置全局值中導(dǎo)出的量值分配內(nèi)存(例如,供數(shù)據(jù)庫查詢用)。
編程計算機(jī)的一個實施例從外部設(shè)置全局值中導(dǎo)出用在為應(yīng)用分配內(nèi)存(例如,實現(xiàn)數(shù)據(jù)庫查詢的操作符所需的內(nèi)存中的內(nèi)部值(稱為“內(nèi)存限度”)。內(nèi)存限度可以以對于本領(lǐng)域普通技術(shù)人員來說顯而易見的任何方式例如取決于實現(xiàn)數(shù)據(jù)庫的進(jìn)程和結(jié)構(gòu)導(dǎo)出。
在一個實施例中,編程計算機(jī)根據(jù)完成的內(nèi)存分配,動態(tài)地修改內(nèi)存限度,從而形成反饋回路??蛇x地,在確定內(nèi)存限度時,編程計算機(jī)可以對應(yīng)用之外的信息(諸如非數(shù)據(jù)庫進(jìn)程分配的內(nèi)存量敏感),以便有效地使用計算機(jī)中的有限內(nèi)存。
附圖簡述
圖1A以數(shù)據(jù)流圖的形式例示了按照本發(fā)明編程的計算機(jī)中的數(shù)據(jù)和邏輯塊;圖1B例示了如圖1A所示那種類型的計算機(jī)中的一種應(yīng)用執(zhí)行的步驟;圖2以高級方塊圖的形式例示了如圖1B所示那種類型的多服務(wù)器進(jìn)程對共享內(nèi)存的使用;圖3以流程圖的形式例示了在圖1B的服務(wù)器進(jìn)程執(zhí)行的比較步驟的一個詳細(xì)描述當(dāng)計算機(jī)被基于本發(fā)明的軟件編程時,它對定義供諸如數(shù)據(jù)庫之類的應(yīng)用使用的總內(nèi)存量的值11(圖11A)敏感。請注意,盡管在如下的描述中涉及數(shù)據(jù)庫應(yīng)用,但是,取決于實施例,也可以以本文所述的方式編程其它應(yīng)用。值11(也稱為“外部設(shè)置全局值”)可以由例如數(shù)據(jù)庫管理器(DBA)提供,或者可以根據(jù)例如計算機(jī)中當(dāng)前可用的內(nèi)存自動確定。取決于實施例,外部設(shè)置全局值11可以被應(yīng)用用作極限值(不能超過它),或者被用作目標(biāo)值(有時可以達(dá)到,或者大多數(shù)時間不可以達(dá)到例如未達(dá)到或已超過)。
在一個實施例中,數(shù)據(jù)庫系統(tǒng)10(圖1A)通過對不適用于例如進(jìn)行查詢的應(yīng)用進(jìn)程的內(nèi)存量12(圖1A)加以考慮,計算數(shù)據(jù)庫軟件內(nèi)部的值14(下文稱為“全局內(nèi)部值”)。具體地說,邏輯塊13(圖1A)對已分配但未使用的內(nèi)存(稱為“空閑內(nèi)存”)和與實現(xiàn)查詢的操作符(諸如排序、散列連接和位圖合并)無關(guān)的內(nèi)存(稱為“其它內(nèi)存”)加以考慮。
取決于實施例,數(shù)據(jù)庫系統(tǒng)10(圖1A)利用全局內(nèi)部值14來計算(參見邏輯塊15)用在為每個操作符分配內(nèi)存中的另一個內(nèi)部值17(也稱為“內(nèi)存限度”)。內(nèi)存限度17是用于每個操作符工作區(qū)的、定義可以每個進(jìn)程18分配的內(nèi)存量的操作符級值。每個進(jìn)程18將內(nèi)存限度17與操作符所需的內(nèi)存量20相比較,以確定要分配的內(nèi)存量,然后,分配適當(dāng)?shù)膬?nèi)存量。但是,取決于數(shù)據(jù)庫的類型(例如,分層)和/或?qū)崿F(xiàn)數(shù)據(jù)庫的結(jié)構(gòu)和進(jìn)程,可以直接從外部設(shè)置全局值中,即,無需計算如上所述的全局內(nèi)部值14就可以導(dǎo)出內(nèi)存限度。此外,在可替代實施例中,不使用操作符級值14,而是每個進(jìn)程在對有關(guān)實現(xiàn)反饋回路的內(nèi)存使用的統(tǒng)計表加以考慮的同時,根據(jù)全局內(nèi)部值14,或甚至根據(jù)外部設(shè)置全局值11(取決于實現(xiàn))確定要分配給操作符的內(nèi)存量。
在一個這樣的實施例中,數(shù)據(jù)庫系統(tǒng)10(圖1A)按如下實現(xiàn)反饋回路如果數(shù)據(jù)庫系統(tǒng)10當(dāng)前分配的總內(nèi)存超過外部設(shè)置全局值,那么,數(shù)據(jù)庫系統(tǒng)降低內(nèi)存限度(反之亦然),以便使數(shù)據(jù)庫系統(tǒng)10分配的總內(nèi)存接近作為如上所述的目標(biāo)值或極限值的外部設(shè)置全局值11。如果不使用內(nèi)存限度,那么,即使值11保持不變,這樣的實施例也可以改變?nèi)謨?nèi)部值14。
上述操作可以以就公開文件而言,對于本領(lǐng)域普通技術(shù)人員來說顯而易見的任何方式實現(xiàn)。例如,反饋回路可以以周期性地或異步地,或周期性地和異步地修改內(nèi)存限度17(和/或全局內(nèi)部值14)為基礎(chǔ)。在一個實施例中,數(shù)據(jù)庫系統(tǒng)10根據(jù)與內(nèi)存使用有關(guān)的統(tǒng)計表,周期性地(例如,每3秒鐘一次)修改內(nèi)存限度17。當(dāng)分配內(nèi)存時例如如果數(shù)據(jù)庫系統(tǒng)10分配的總內(nèi)存超過外部設(shè)置全局值11達(dá)預(yù)定值(可以是例如零或值11的10%),數(shù)據(jù)庫系統(tǒng)17也可以異步地修改內(nèi)存限度17。此外,如果認(rèn)為操作符的優(yōu)先級比其它操作符的優(yōu)先級高,分配的內(nèi)存量21可以是所需的量20,或者可以是內(nèi)存限度17或從這些量之一或兩者中導(dǎo)出的某個量例如內(nèi)存限度的倍數(shù),或估計值的倍數(shù)。在剛剛描述過的例子中,代替優(yōu)先級,可以把某個量的“貨幣”分配給每個操作符,而內(nèi)存限度17可以是利用貨幣“購買”內(nèi)存支付的價格。在這樣的情況下,分配給每個操作符的“貨幣”量決定操作符接受的內(nèi)存量。
在一個實施例中,數(shù)據(jù)庫系統(tǒng)10包括計算上述內(nèi)存限度17的指令序列(下文稱之為“內(nèi)存中介器”)。內(nèi)存中介器22可以當(dāng)作與實現(xiàn)數(shù)據(jù)庫查詢的進(jìn)程分立和不同的進(jìn)程來實現(xiàn)。在這種情況下,數(shù)據(jù)庫查詢進(jìn)程18將內(nèi)存限度17與一個或多個估計值相比較,并且分配適當(dāng)?shù)膬?nèi)存量。信息在內(nèi)存中介器22和數(shù)據(jù)庫查詢進(jìn)程18之間的傳送可以通過消息,或通過共享內(nèi)存實現(xiàn)。
在一個可選實施例中,內(nèi)存中介器的指令序列不是被建立成分立進(jìn)程,而是每個數(shù)據(jù)庫查詢進(jìn)程利用函數(shù)調(diào)用來調(diào)用這些指令。因此,公共函數(shù)可以用于為所有操作符分配內(nèi)存(不是將不同函數(shù)用于如下所述的“排序”和“散列”操作符)。當(dāng)使用這樣的公共函數(shù)時,每個進(jìn)程直接使用外部設(shè)置全局值(如上所述)來導(dǎo)出要分配的內(nèi)存量。
在內(nèi)存中介器只計算全局內(nèi)部值14(如上所述),和每個查詢進(jìn)程使用全局內(nèi)部值14來導(dǎo)出要分配給操作符的內(nèi)存量的另一個實施例中,組合了某些實施例的特征。此外,取決于實施例,當(dāng)為每個操作符分配內(nèi)存時,可以不同地使用內(nèi)存限度17例如較高優(yōu)先級的查詢可以分配多達(dá)2倍或3倍于內(nèi)存限度的內(nèi)存,而一般優(yōu)先級查詢分配多達(dá)內(nèi)存限度的內(nèi)存。因此,在本例中,操作符的極限值取決于打算執(zhí)行操作符的特定查詢的優(yōu)先級。在另一個例子中,取代“極限值”,內(nèi)存限度起“價格”的作用。此外,不是將一個公共內(nèi)存限度17用于所有操作符(例如,用于正常優(yōu)先級查詢),而是使用幾個內(nèi)存限度,每種類型的操作符使用一個內(nèi)存限度。
在一個實施例中,當(dāng)分配內(nèi)存時,操作符所需的工作區(qū)內(nèi)存通過每個進(jìn)程來估計,和取決于操作符將操作的模式例如(1)沒有盤訪問的最佳模式;(2)存在盤訪問,但要求對盤上的所有數(shù)據(jù)只進(jìn)行一遍掃描的一遍掃描模式;和(3)要求對盤上的數(shù)據(jù)進(jìn)行多遍掃描的最小模式,在一種實現(xiàn)中,作出幾種估計。操作符執(zhí)行查詢所需的時間取決于執(zhí)行的模式例如如圖6所示,在最佳模式下所需的時間最短,在最小模式下所需的時間最長,和一遍掃描所需的時間在最長和最短之間。請注意,對于同一操作符,取決于輸入數(shù)據(jù)的尺寸,這樣的估計可以隨查詢不同而不同。此后,在這種實現(xiàn)中,取決于這些估計和取決于內(nèi)存限度,每個進(jìn)程為操作符分配內(nèi)存量。
例如,調(diào)用“排序”操作符的進(jìn)程按如下確定要分配的工作區(qū)(也稱為“排序區(qū)”)內(nèi)存量如果最佳內(nèi)存估計值小于內(nèi)存限度,采用最佳內(nèi)存估計值;如果內(nèi)存限度在最佳內(nèi)存估計值和一遍掃描內(nèi)存估計值之間,采用一遍掃描內(nèi)存估計值;并且如果內(nèi)存限度小于一遍掃描內(nèi)存估計值,采用最小內(nèi)存估計值。
在這個特殊的例子中,調(diào)用“散列連接”操作符的進(jìn)程按如下確定要分配的工作區(qū)(也稱為“散列區(qū)”)內(nèi)存量如果最佳內(nèi)存估計值小于內(nèi)存限度,采用最佳內(nèi)存估計值;如果內(nèi)存限度在最佳內(nèi)存估計值和最小存估計值之間,采用內(nèi)存限度;并且如果內(nèi)存限度小于最小內(nèi)存估計值,采用最小內(nèi)存估計值。這是因為散列連接操作符可從一遍掃描估計值和最佳估計值之間的額外內(nèi)存中獲得好處,而排序操作符則不能從中獲得好處。在本例中,如果內(nèi)存限度小于最小內(nèi)存估計值,那么,在一個實施例中,所有操作符接受它們各自的最小內(nèi)存估計值,而在另一個實施例中,這樣的操作符排隊等候(直到內(nèi)存限度增加到超過最小內(nèi)存估計值為止)。
因此,數(shù)據(jù)庫系統(tǒng)10使DBA能夠協(xié)調(diào)當(dāng)使用現(xiàn)有技術(shù)數(shù)據(jù)庫時難以人工協(xié)調(diào)的內(nèi)存參數(shù)。具體地說,分配的內(nèi)存量的調(diào)整應(yīng)該取決于操作符的相對使用頻率、每個操作符的內(nèi)存要求和系統(tǒng)中同時激活的操作符的設(shè)置。這些條件可以在一天內(nèi)改變許多次,尤其在特殊環(huán)境下。請求者所熟知的現(xiàn)有技術(shù)參數(shù)不會自動調(diào)整,因此,它們不能補(bǔ)償系統(tǒng)中過低或過高的內(nèi)存使用。此外,請求者所熟知的現(xiàn)有技術(shù)參數(shù)不控制查詢將使用的最大內(nèi)存量,這勢必加重內(nèi)存的過度分配,并且往往因內(nèi)存耗盡而引起系統(tǒng)崩潰。最后,這樣的現(xiàn)有技術(shù)參數(shù)往往浪費(fèi)PGA內(nèi)存,因為分配的內(nèi)存多于需要的內(nèi)存,以獲得可接受的性能。當(dāng)使用如上所述的外部設(shè)置全局值11時,這種在現(xiàn)有技術(shù)中未得到使用的內(nèi)存被其它查詢或甚至被其它應(yīng)用較好地利用。
實現(xiàn)上述操作的一個實施例的計算機(jī)100(圖1B)執(zhí)行許多軟件程序,如操作系統(tǒng)101、商務(wù)邏輯塊102、聯(lián)網(wǎng)應(yīng)用103和數(shù)據(jù)庫應(yīng)用110。計算機(jī)100可以是像IMB個人計算機(jī)(PC)那樣的任何計算機(jī),或像Ultra Sparc II那樣的Sun工作站。計算機(jī)100包括執(zhí)行指令的一個或多個中央處理單元(CPU)、保存數(shù)據(jù)和指令的非易失性存儲器(譬如盤)和在執(zhí)行期間臨時保存數(shù)據(jù)和指令的易失性存儲器(譬如DRAM(動態(tài)隨機(jī)訪問存儲器))。計算機(jī)100還包括互連CPU和存儲器的總線。計算機(jī)100可以包括向用戶顯示信息的顯示設(shè)備(譬如陰極射線管)和從用戶接收命令的一個或多個輸入設(shè)備(譬如鍵盤和/或鼠標(biāo))。
在如下的描述中,不言自明地要求使用這樣的計算機(jī)100,即使沒有明確地說出這樣的使用。數(shù)據(jù)庫應(yīng)用110執(zhí)行各種類型的查詢,把信息存儲在數(shù)據(jù)庫中和從數(shù)據(jù)庫中檢索數(shù)據(jù)(數(shù)據(jù)庫可以是例如關(guān)系數(shù)據(jù)庫)。每次查詢可以在正常模式下,通過諸如排序、散列連接和位圖合并之類的一個或多個操作符來執(zhí)行。在執(zhí)行每次查詢期間,計算機(jī)100按如下所述分配內(nèi)存。分配直接或間接地基于外部設(shè)置全局值11(通過數(shù)據(jù)庫參數(shù)PGA_AGGREGATE_TARGET的值來表示)。在這個特定實施例中,值11用作為供執(zhí)行數(shù)據(jù)庫查詢的進(jìn)程(有時稱為“服務(wù)器進(jìn)程”)內(nèi)部使用而分配的總內(nèi)存的目標(biāo)值。在一個實施例中,用戶界面111(圖1B)從數(shù)據(jù)庫管理器接收(參見步驟112)全局值11,將該值存儲(參見步驟113)存儲在共享內(nèi)存中。每個進(jìn)程(至少部分地)根據(jù)從共享內(nèi)存中讀取的值11,分配供它內(nèi)部使用的內(nèi)存。
數(shù)據(jù)庫110的一個實施例包括從全局值11中和可選地從有關(guān)當(dāng)前內(nèi)存使用的統(tǒng)計表中導(dǎo)出(參見圖1B中的步驟116)內(nèi)部值,和存儲該內(nèi)部值,供服務(wù)器進(jìn)程在分配內(nèi)存時使用。取決于實現(xiàn),內(nèi)部值可以是應(yīng)用于通過所有進(jìn)程120A-120Z分配的內(nèi)存的全局內(nèi)部值14,或只應(yīng)用于為操作符分配的內(nèi)存的操作符級內(nèi)存限度17。根據(jù)內(nèi)存使用統(tǒng)計表,內(nèi)存中介器115通過服務(wù)器進(jìn)程120A-120Z(其中,A≤I≤Z,Z是當(dāng)前進(jìn)程數(shù)),對內(nèi)存分配作出響應(yīng),動態(tài)修改內(nèi)部值,從而形成反饋回路(如圖1B中的支路118所示)。
取決于實施例,服務(wù)器進(jìn)程120A(參見步驟121)利用外部設(shè)置全局值11或內(nèi)部值14和17之一來確定要分配的內(nèi)存,然后分配內(nèi)存。接著,進(jìn)程120A更新(參見步驟122)有關(guān)內(nèi)存使用的統(tǒng)計表(例如,指出已分配的內(nèi)存量),并且轉(zhuǎn)向以正常方式執(zhí)行查詢。根據(jù)查詢處理的完成,進(jìn)程120A(參見步驟123)解除分配以前分配的內(nèi)存,并且還更新(參見步驟124)內(nèi)存使用統(tǒng)計表。
如上所述,取決于實施例,內(nèi)存中介器115在步驟116中利用內(nèi)存使用統(tǒng)計表來修改內(nèi)部值14和17之一或兩者。例如,內(nèi)存中介器115可能發(fā)現(xiàn)存在太多的進(jìn)程和總分配內(nèi)存可能顯著超過外部設(shè)置全局值11,在這種情況下,內(nèi)存中介器115降低內(nèi)部值14和17之一或兩者,以便將來通過進(jìn)程分配較少的內(nèi)存量(比當(dāng)前內(nèi)存量少)。另一方面,如果內(nèi)存中介器115發(fā)現(xiàn)存在太少的進(jìn)程和總分配內(nèi)存明顯未達(dá)到外部設(shè)置全局值11,那么,內(nèi)存中介器115可能提高內(nèi)部值14和17之一或兩者,以便將來通過進(jìn)程分配較多的內(nèi)存量。在這個實施例中,外部設(shè)置全局值11和內(nèi)部值14和17被試圖使目標(biāo)值與某個范圍交會的數(shù)據(jù)庫應(yīng)用110當(dāng)作目標(biāo)值來對待。
這個實施例的內(nèi)存中介器115周期性地運(yùn)行(例如,每3秒鐘一次),修改進(jìn)程120A-120Z用來分配內(nèi)存的內(nèi)部目標(biāo)值。但是,服務(wù)器進(jìn)程120I也可以調(diào)用內(nèi)存中介器115例如如果總分配內(nèi)存超過外部設(shè)置全局值11達(dá)預(yù)定量的話。具體地說,在一個實施例中,進(jìn)程120A計算(參見圖1A中的步驟125)所有進(jìn)程120A-120Z分配的總內(nèi)存和外部設(shè)置全局值11之間的差值(下文稱之為“偏移值”)。在一種特定實現(xiàn)中,“偏移值”是指示從內(nèi)存限度17的最后計算中得出的內(nèi)存的增加分配量或解除分配量的帶符號數(shù)。每當(dāng)重新計算內(nèi)存限度17時,這種特定實現(xiàn)就把偏移值設(shè)置成0。此后,為操作符分配內(nèi)存的每個進(jìn)程120I將偏移值增加所分配內(nèi)存的數(shù)量(類似地,當(dāng)釋放內(nèi)存時,將偏移值減少釋放內(nèi)存的數(shù)量)。
在分配之后,進(jìn)程120A檢驗偏移值是否超過例如外部設(shè)置全局值11的10%,如果是的話,調(diào)用內(nèi)存中介器115。當(dāng)?shù)玫秸{(diào)用時,內(nèi)存中介器115以如上所述的方式修改內(nèi)部值14和17之一或兩者。當(dāng)解除分配內(nèi)存時,進(jìn)程120A也可以計算偏移值(參見圖1B中的步驟126)和警告內(nèi)存中介器115。
取決于實施例,內(nèi)存中介器115可以使用全局的內(nèi)部值14來計算在操作符級上應(yīng)用的另一個內(nèi)部極限值17。具體地說,這樣的操作符級極限值(稱為“內(nèi)存限度”)141(圖2)被保存的共享內(nèi)存140中,和標(biāo)識每次查詢中每個操作符的、要通過服務(wù)器進(jìn)程120A分配的內(nèi)存的極限值(或目標(biāo)值)。因此,服務(wù)器進(jìn)程120A-120Z將內(nèi)存限度141與(例如,在一遍掃描模式下操作的操作符的)所需內(nèi)存的估計值142I相比較,以確定要分配的內(nèi)存,此后,分配適當(dāng)?shù)膬?nèi)存量(或取決于實現(xiàn),加以排隊)。請注意,在這種實現(xiàn)中,同一內(nèi)存限度141用于把內(nèi)存分配給所有操作符,但是在另一種實現(xiàn)中,可以把不同內(nèi)存限度用于每種類型的操作符(例如,散列連接可以具有與用于排序的相應(yīng)限度不同的限度)。
估計值142A-142P的每一個被保存在要為其分配內(nèi)存的操作符的簡要表143J中。在一種實現(xiàn)中,許多個簡要表143A-143V的每一個被保存在共享內(nèi)存140中。在這種實現(xiàn)中,進(jìn)程120A-120Z通過在共享內(nèi)存140中創(chuàng)建包含操作符需要的三個內(nèi)存估計值的相應(yīng)簡要表143J,登記每個操作符(參見圖1B中的步驟127),以便在如下的三種模式的每一種下操作最佳模式、一遍掃描模式和最小模式。“最佳”模式在本文也被稱為“高速緩沖”模式,因為在執(zhí)行期間操作符不要求盤訪問。
此后,進(jìn)程120I按如下確定要為數(shù)據(jù)庫應(yīng)用中的排序操作符分配的內(nèi)存量如果最佳內(nèi)存估計值142P小于內(nèi)存限度141,采用最佳內(nèi)存估計值142P(參見圖3中的步驟151-152);如果內(nèi)存限度141在最佳內(nèi)存估計值142P和一遍掃描內(nèi)存估計值142I之間,采用一遍掃描內(nèi)存估計值142I(圖2)(參見圖3中的步驟153-154);并且如果內(nèi)存限度141小于最小內(nèi)存估計值142I,采用最小內(nèi)存估計值142A(圖2)(參見圖3中的步驟155)。使用剛剛所述的分配是因為(與從最小到一遍掃描的內(nèi)存增加相比)排序操作符不能從一遍掃描估計值到高速緩沖估計值的內(nèi)存增加中獲得一樣多的好處。
正如在別處所述的那樣,確定待分配內(nèi)存量的特定方法可能取決于幾個因素進(jìn)程屬性(例如,優(yōu)先級)或操作符。圖1B的步驟127是可選的,并且,未必把操作符簡要表登記在共享內(nèi)存140中,在其它實現(xiàn)中,每個進(jìn)程120A分別把這樣的簡要表保持在它自己的內(nèi)存中。
請注意,對于一些操作符,最小內(nèi)存估計值142A可以大于內(nèi)存限度141,并且,在一個實施例中,不讓這樣的進(jìn)程排隊,而是讓它們分配最小內(nèi)存估計值142A,以便進(jìn)行查詢。在這樣的情況下,如果其它進(jìn)程欠分配,即分配小于內(nèi)存限度141的內(nèi)存,那么,通過應(yīng)用分配的總內(nèi)存可以保持在外部設(shè)置全局值11之后。但是,分配大于內(nèi)存限度141的內(nèi)存的進(jìn)程120A-120Z可能超過欠分配的進(jìn)程,使得總分配內(nèi)存超過外部設(shè)置全局值11并使全局內(nèi)部值14降低(通過內(nèi)存中介器115),全局內(nèi)部值14的降低又使內(nèi)存限度141降低(也通過內(nèi)存中介器115)。此后,進(jìn)程120A-120Z被迫分配比值11保持不變時它們將分配的內(nèi)存小的內(nèi)存。這樣,在進(jìn)程120A-120Z之間存在著一些妥協(xié),以便達(dá)到外部設(shè)置全局值11。如果進(jìn)程120A-120Z的總數(shù)太多例如所有進(jìn)程的最小內(nèi)存估計值142A-142Z之和超過值11,那么,不為任何進(jìn)程分配附加內(nèi)存,而是排隊內(nèi)存請求。
在一個實施例中,每當(dāng)如上面參照圖1A所述的那樣,分配或解除分配內(nèi)存時,進(jìn)程120A-120Z還更新有關(guān)內(nèi)存使用的統(tǒng)計表160(圖2)。具體地說,統(tǒng)計表160包括已分配但未被使用的內(nèi)存(稱為“空閑內(nèi)存”)161(圖2和4)的數(shù)量。例如,進(jìn)程120I可能需要分配1MB,但是,如果操作系統(tǒng)101只以4MB的增量(例如,由于這是頁面尺寸)提供內(nèi)存,那么,3MB是空閑內(nèi)存,4MB是分配內(nèi)存,和1MB是使用內(nèi)存??臻e內(nèi)存161(圖4)一般說來不可用于任何其它進(jìn)程120J。
進(jìn)程120A-120Z還更新統(tǒng)計表160中,與實現(xiàn)查詢的操作符(譬如排序、散列連接和位圖合并)無關(guān)的內(nèi)存(稱為“其它內(nèi)存”)162(圖2和4)的數(shù)量。例如,進(jìn)程120I可以包括與查詢實現(xiàn)操作符無關(guān)和使用內(nèi)存162的PL/SQL或JAVA指令序列。一般說來,其它內(nèi)存162不能通過改變操作符起作用的方式(例如,一遍掃描/多遍掃描)來改變。
進(jìn)程120A-120Z還保持統(tǒng)計表160中,操作符實際使用的內(nèi)存(稱為“工作區(qū)內(nèi)存”)量163。在一個實施例中,進(jìn)程120A-120Z對統(tǒng)計表160的維護(hù)是在又調(diào)用“malloc”和“free”的包裝函數(shù)(wrapper function)中實現(xiàn)的。此外,對于獨(dú)立進(jìn)程120A-120Z的每一個,可以分開保持統(tǒng)計表160,或者可選地,可以保持各個統(tǒng)計表的總表(遍及所有進(jìn)程120A-120Z)。
在一個實施例中,內(nèi)存中介器115利用上述的統(tǒng)計表160來以如下方式計算用作工作區(qū)內(nèi)存163的數(shù)量的目標(biāo)值的全局內(nèi)部值14(在圖5中被表示成Ti)。具體地說,內(nèi)存中介器115首先計算作為使用內(nèi)存164(在圖5中被表示成Um)和工作區(qū)內(nèi)存163(在圖5中被表示成Wm)之間的差值的其它內(nèi)存162(在圖5中被表示成Om)。接著,內(nèi)存中介器115檢驗(參見圖5中的步驟172)外部設(shè)置全局值11(也稱為“PGA AGGREGATE TARGET”和在圖5中被表示成Tpga)是否小于其它內(nèi)存162,如果是的話,把Ti設(shè)置成Tpga的6%。
因此,在最壞可能情況下,當(dāng)其它內(nèi)存162的內(nèi)存太大時,把Tpga的某個最小值(例如,6%)用作全局內(nèi)部值14。這是因為,其它內(nèi)存162的尺寸超出了內(nèi)存中介器115的控制范圍。如果其它內(nèi)存162小于Tpga,那么,在步驟174中,內(nèi)存中介器115把全局內(nèi)部值14設(shè)置成Tpga和Om之間的差值的90%,然后,轉(zhuǎn)到步驟175。這是作為“安全”措施完成的,以計及在內(nèi)存中介器115的兩個相繼操作之間的時間間隔內(nèi)分配內(nèi)存的變化(因此,在一個例子中,預(yù)期分配內(nèi)存不會以每3秒鐘快于10%地增加)。
接著,在步驟175中,內(nèi)存中介器115檢驗分配內(nèi)存(在圖5中被表示成Am)是否大于Tpga,如果是的話,轉(zhuǎn)到步驟176(處理過分配),或者轉(zhuǎn)到步驟177(處理欠分配)。在步驟176中,內(nèi)存中介器115計算作為比Wm/(Om+Wm)的因子Fwa(也稱為“工作區(qū)分配因子”),和進(jìn)一步計算作為比(Am-Tpga)/Am的另一個因子Foa(也稱為“過分配因子”),并且把新極限值Ti確定成當(dāng)前極限值Ti乘以(1-Fwa*Foa)。
在步驟177中,內(nèi)存中介器115檢驗Am的90%是否小于Tpga,以及所有最佳內(nèi)存分配之和是否大于Tpga,如果是的話,不改變Ti。否則的話,內(nèi)存中介器115轉(zhuǎn)到步驟179,以計算上述工作區(qū)分配因子Fwa。接著,在步驟180中,內(nèi)存中介器115計算作為比(Tpga-Am)/Tpga的欠分配因子Fua(也稱為“提升因子”)。此后,內(nèi)存中介器115把新極限值Ti計算成當(dāng)前極限值Ti乘以(1+Fwa*Fua)。接著,內(nèi)存中介器115把新計算的極限值Ti和Tpga的6%的較大者設(shè)置成(在步驟182中)像在本文所述那樣使用的全局內(nèi)部值14。
具體地說,將來,新計算的全局內(nèi)部值14用于分配各種操作符所需的內(nèi)存。正如本文在別處所述的那樣,這樣的全局內(nèi)部值14可以直接供(為每個獨(dú)立操作符分配內(nèi)存的)進(jìn)程使用,或者可以用于計算又供這樣的進(jìn)程使用的內(nèi)存限度。在一個特定實施例中,從所附附錄中的偽碼中如下所述的全局內(nèi)部值14中計算內(nèi)存限度17。
通過使用例如可以設(shè)置成兩個值A(chǔ)UTO和MANUAL之一的、可以稱為“WORKAREA_SIZE_POLICY”的數(shù)據(jù)庫參數(shù),可以與現(xiàn)有技術(shù)的人工機(jī)制結(jié)合在一起使用如本文所述的內(nèi)存自動和動態(tài)分配。把這個參數(shù)設(shè)置成AUTO調(diào)用自動和動態(tài)分配。此外,可以實現(xiàn)另一個數(shù)據(jù)庫參數(shù)PGA_AGGREGATE_TARGET(如上所述),并且,當(dāng)數(shù)據(jù)庫參數(shù)PGA_AGGREGATE_TARGET被數(shù)據(jù)庫管理器設(shè)置時,參數(shù)WORKAREA_SIZE_POLICY的默認(rèn)值被自動設(shè)置成AUTO。
或者,當(dāng)PGA_AGGREGATE_TARGET未被設(shè)置時,參數(shù)WORKAREA_SIZE_POLICY的值被自動設(shè)置成MANUAL。如果參數(shù)WORKAREA_SIZE_POLICY的值被設(shè)置成MANUAL,那么,在這個實施例中,不使用PGA_AGGREGATE_TARGET,而是數(shù)據(jù)庫使用現(xiàn)有技術(shù)機(jī)制(例如,利用數(shù)據(jù)庫管理器對每個操作符的內(nèi)存設(shè)置的各自目標(biāo)值)。
可以將自動和人工機(jī)制組合在一起,以保持例如向后兼容性一些操作符可以使用人工機(jī)制,而另一些操作符可以使用自動機(jī)制。在這樣的組合操作中,全局內(nèi)部值14自動降低,以適應(yīng)人工機(jī)制使用的內(nèi)存。
取決于內(nèi)存使用,內(nèi)存中介器115可以在操作符分配內(nèi)存之后馬上降低內(nèi)存限度例如如果進(jìn)行查詢的次數(shù)突然增加的話。相反,如果對內(nèi)存的要求降低了,內(nèi)存中介器115可以提高內(nèi)存限度17。在已經(jīng)計算出內(nèi)存限度17的新內(nèi)部值之后,在一個特定實施例中只把值17應(yīng)用于打算在計算之后,分配內(nèi)存的新操作符。在另一個可選實施例中,內(nèi)存限度17這樣的新值也供以前已經(jīng)分配了內(nèi)存和當(dāng)前正在執(zhí)行的操作符使用,從而在執(zhí)行期間減少(或增加)它們以前分配的內(nèi)存。
操作符對內(nèi)存限度17發(fā)生改變的響應(yīng)可以影響內(nèi)存中介器115在給定區(qū)間內(nèi)重新計算內(nèi)存限度17的次數(shù)和/或內(nèi)存限度17的改變量。例如,如果當(dāng)前正在執(zhí)行的操作符不敏感或響應(yīng)緩慢(與內(nèi)存中介器115的響應(yīng)相比),那么,內(nèi)存中介器115重復(fù)地降低全局內(nèi)部值14和內(nèi)存限度17,以便保證總分配內(nèi)存接近外部設(shè)置全局值11的目標(biāo)值。
為了在分配內(nèi)存之后,對內(nèi)存限度17的改變作出響應(yīng),操作符可以在它們執(zhí)行期間的方便點上檢驗內(nèi)存限度17(或全局內(nèi)部值14)的改變。檢驗內(nèi)存限度17(或全局內(nèi)部值14)發(fā)生改變的點可以同步(例如,每秒一次)或異步(例如,在操作符執(zhí)行期間完成了一個或多個步驟之后)設(shè)立。在這兩種實施例中,操作符將它們的模式例如從最佳改變成一遍掃描,或從一遍掃描改變成最小,因此,取決于內(nèi)存中介器115所作的決定,改變它們的分配內(nèi)存。此外,這樣實施例的操作符可以在它們的操作期間,動態(tài)地修改它們內(nèi)存要求的估計值。下面簡要討論在執(zhí)行期間對散列連接操作符的修改和對排序操作符的修改,以實現(xiàn)模式的改變和分配內(nèi)存的改變。
在一個實施例中,AUTO方式(如上所述)的散列連接操作符登記有關(guān)它工作區(qū)的信息(例如,存儲在如下三種模式的每一種下要求的內(nèi)存估計值最佳模式、一遍掃描模式和最小模式)。在這個實施例中,每個操作符的稱為“mode”的變量(駐留在SGA中)指示操作符的操作的當(dāng)前模式,因此,指示它的內(nèi)存使用。在這個實施例中,每個操作符的“mode”變量只被這個實施例中的操作符改變(但是,在另一個可選實施例中,內(nèi)存中介器115可以作出這樣的改變)。
只要內(nèi)存限度17足夠高,散列連接操作符就可以在最佳模式下操作,和散列連接操作符分配初始內(nèi)存量和動態(tài)地增加它的內(nèi)存(直到最佳模式估計值),以存儲輸入行。但是,即使在最佳模式下操作,散列連接操作符也根據(jù)一遍掃描要求劃分輸入數(shù)據(jù),以便如果內(nèi)存限度17降低了,允許切換到一遍掃描模式。在這個實施例中,當(dāng)在內(nèi)存中構(gòu)建時,如果充分地降低內(nèi)存限度17,使模式從最佳改變成一遍掃描,那么,散列連接操作符通過把適當(dāng)?shù)臄?shù)據(jù)量清倉到盤上,把它工作區(qū)的尺寸調(diào)整成一遍掃描要求。
在一遍掃描模式期間(在構(gòu)建階段),散列連接操作符以正常方式工作。但是,工作區(qū)的尺寸被調(diào)整成包含一個構(gòu)件分區(qū)加上每個附加分區(qū)一個或多個IO槽(以支持異步輸入和輸出)。在這個階段,即使輸入比所預(yù)期的大得多,也不調(diào)整工作區(qū)的尺寸。散列連接操作符只使用在開始構(gòu)建時為一遍掃描模式估計的內(nèi)存量。
一旦第一個一遍掃描構(gòu)件(是第一構(gòu)件)完成了,構(gòu)件的每個分區(qū)的尺寸是已知的。如果最大分區(qū)的實際尺寸是每個分區(qū)的預(yù)期公共尺寸(例如,一遍掃描尺寸)的兩倍或更多倍,散列連接操作符就利用來自第一構(gòu)件的行,重新構(gòu)建。重新構(gòu)建步驟使用精確的尺寸來確定構(gòu)件分區(qū)的理想個數(shù),因此,確定工作區(qū)內(nèi)存的更精確估計值。
構(gòu)建第二構(gòu)件快于構(gòu)建第一構(gòu)件(在大多數(shù)情況下),因為在重新構(gòu)建期間的輸入數(shù)據(jù)尺寸小于原始數(shù)據(jù)尺寸,并且,一般說來,與探查時間相比,構(gòu)建時間是非常短的。此外,當(dāng)與散列連接操作符的總執(zhí)行時間相比時,額外重新構(gòu)建時間可忽略不計,因為探查時間要長得多。但是,從這樣的重新構(gòu)建中節(jié)省下來的內(nèi)存也許極大(如果估計輸入尺寸造成的誤差重要的話)。
只要內(nèi)存限度17高到允許以“高速緩沖”(也稱為“最佳”)模式執(zhí)行,散列連接操作符將在內(nèi)存中探查。如果充分地降低內(nèi)存限度17,使模式改變成“一遍掃描”,那么,通過調(diào)整它散列區(qū)的尺寸,散列連接操作符將切換到一遍掃描探查。那時,將一小組分區(qū)清倉到盤上,和從留在內(nèi)存中的分區(qū)開始以一遍掃描模式繼續(xù)進(jìn)行探查(probe)。以后,在把內(nèi)存限度17修改成低于一遍掃描估計值的情況下,把當(dāng)前保留在內(nèi)存中的所有構(gòu)件分區(qū)清倉到盤上。然后,根據(jù)最小要求(例如,每個分區(qū)2個槽)劃分探查。
對于每對構(gòu)件/探查分區(qū),散列連接操作符分配足以把兩個分區(qū)的較小者高速緩存在內(nèi)存中的內(nèi)存。由于存在潛在的額外重新構(gòu)建階段,即使輸入尺寸估計值是不正確的,也應(yīng)該使消耗的內(nèi)存接近理想一遍掃描內(nèi)存要求。
在“AUTO”方式(如上所述)下運(yùn)行時對排序操作符所作的修改與對散列連接操作符所作的修改類似。排序操作符能夠在任何時間點從最佳模式切換到一遍掃描模式。排序操作符還按輸入尺寸漸進(jìn)地增加計及不良估計值的每個排序行程的尺寸。那樣,排序操作符總是進(jìn)行內(nèi)存增加不多的一遍掃描合并。
在一個實施例中,當(dāng)排序操作符估計的工作區(qū)超過預(yù)定值(譬如128KB)時,排序操作符登記它的工作區(qū)簡要表(包括估計值)。小于等于預(yù)定值的估計值不登記,以便在聯(lián)機(jī)事務(wù)處理(OLTP)環(huán)境下,限制使用內(nèi)存中介器115造成的影響,與其它環(huán)境相比,在OLTP環(huán)境下對排序操作符的輸入在多半時間里是非常小的。因此,可以避免對于很小的工作區(qū)涉及到內(nèi)存中介器115。
排序操作符的最佳模式與MANUAL(如上所述)方式的排序操作符類似。把從底層行源中取出的行加入排序操作符的工作區(qū)中。工作區(qū)的尺寸以緩慢的方式增加。如果在某個點上內(nèi)存要求高于最佳內(nèi)存估計值(例如,輸入大于預(yù)期的值),更新三個估計值的一個或多個。只要內(nèi)存限度17足夠高,允許為當(dāng)前執(zhí)行分配最佳內(nèi)存估計值,即使該要求高于開始排序時得出的初始最佳內(nèi)存估計值,排序操作符也繼續(xù)擴(kuò)展它的工作區(qū)。
如果在某個點上內(nèi)存限度17降得足夠低,使模式從最佳改變成一遍掃描,排序操作符就把當(dāng)前和第一排序行程清倉到盤上。然后,排序操作符使工作區(qū)收縮到當(dāng)前一遍掃描內(nèi)存估計值。那時,排序操作符切換到一遍掃描模式。
在一遍掃描模式下,排序操作符按輸入尺寸動態(tài)地擴(kuò)展計及不良估計值的工作區(qū)。例如,讓我們假設(shè)真正的輸入尺寸是800MB,而不是100MB(相差8倍)的預(yù)期尺寸。當(dāng)排序操作符開始生成它的第一組排序行程時,它根據(jù)估計的100MB輸入尺寸調(diào)整工作區(qū)的尺寸。在采用64KB IO尺寸的情況下,這給出了2.5MB的工作區(qū)尺寸。一旦輸入的100MB已經(jīng)用完,這相當(dāng)于40個行程,排序操作符就通告需要排序更多的行。那時,排序操作符假定估計輸入尺寸相差2倍,它將采用200MB的估計值,而不是100MB。根據(jù)這個新估計值,由于一遍掃描所需的內(nèi)存隨輸入尺寸的平方根而改變,所以通過將它的實際尺寸乘以因子sqrt(2)調(diào)整工作區(qū)的尺寸。不斷地重復(fù)同一技術(shù),直到來自輸入的所有行都用完為止。
在該例子中,可能存在對于第一個100MB,每一個為2.5MB的40個行程(run);然后,對于下一個100MB,每一個為3.5MB的29個行程;對于下一個200MB,每一個為5MB的40個行程;最后,對于最后一個400MB,每一個為7MB的56個行程。在排序操作符的第一階段結(jié)束時,總共存在165個行程,而不是當(dāng)從一開始就知道輸入尺寸是800MB時將獲得的114個行程的“理想”個數(shù)。在一遍掃描操作中利用10.3MB(165×64MB)的合并區(qū)合并這些行程。這是比理想個數(shù)是128的行程的一遍掃描合并所需的8MB(128×64MB)稍大一點的內(nèi)存。
一般說來,假設(shè)與真正輸入尺寸S相比,對排序操作符的輸入的估計尺寸Sestim至多相差一個因子2n(即,2n-1S<Sestim<=2nS),可以證明排序行程的最后個數(shù)Nfinal將是(((1-1/2n)(2-2))+1/2n)N]]>其中,N是對于真正尺寸(real size)S,行程的理想個數(shù)(即,N=sqrt(S/C))。在上面的例子中,由于相差8倍,因此n是3。利用上面的公式,本領(lǐng)域的普通技術(shù)人員可以計算出排序操作符將生成1.45倍的理想一遍掃描的行程的個數(shù)。這意味著一遍掃描合并階段將消耗1.45倍的理想一遍掃描內(nèi)存。當(dāng)n是1(相差2倍)時,這個因子是1.2,和當(dāng)n無窮大時,這個因子收斂到等于1.7的1/(2-sqrt(2))。因此,在最壞情況下,額外內(nèi)存消耗在合并階段被限制在1.7倍的理想要求上(采用已知的輸入尺寸)。此外,如果考慮到在整個排序操作期間的內(nèi)存消耗,由于利用比理想內(nèi)存小的內(nèi)存生成行程,所述額外內(nèi)存消耗稍微小一點。
如果沒有這種技術(shù),進(jìn)行一遍掃描合并將要求比用于一遍掃描合并的內(nèi)存大2n倍的內(nèi)存。就內(nèi)存消耗而言,由于合并掃描的持續(xù)時間與行程的個數(shù)成正比,甚至比這種情況更壞。如果不動態(tài)地修改工作區(qū)的尺寸,排序操作符將生成許多(小的)行程,從而使合并階段的持續(xù)時間延長。
就公開的文本而言,本文所述的實施例和實現(xiàn)的許多修改和改進(jìn)對于本領(lǐng)域普通技術(shù)人員來說是顯而易見的。例如,在查詢的執(zhí)行完成之后,可以保存專用于查詢的統(tǒng)計表,供需要再次執(zhí)行非常相同的查詢(例如,由另一個進(jìn)程)時進(jìn)行估計用。
此外,如果所有有效操作符都用完它們的最小內(nèi)存和假設(shè)有更多的內(nèi)存可用,那么,內(nèi)存中介器可以把那個內(nèi)存首先分配給從內(nèi)存增加中獲得好處最多的操作符。例如,可以把內(nèi)存中介器編程成把更多的內(nèi)存給予散列連接操作符,使它的響應(yīng)時間從5分鐘減少到1分鐘(加快了5倍),而不是把相同的內(nèi)存量給予另一個散列連接操作符,使它的響應(yīng)時間從1小時減少到30分鐘(只加快了2倍)。因此,一個實施例考慮到響應(yīng)時間加快,而不是真正考慮絕對時間提高。此外,在在共享內(nèi)存(而不是專用內(nèi)存)中分配操作符所需的所有內(nèi)存的數(shù)據(jù)庫中,也可以像本文所述的那樣使用內(nèi)存限度。
因此,本文所述的實施例和實現(xiàn)的許多這樣的修改和改進(jìn)都包括在所附權(quán)利要求書中。
附錄<pre listing-type="program-listing"><![CDATA[ Initialization workarea_left=work areas of all operations active in the system number_of_workarea_left=number of work areas active in the system memory_target=the global internet target or limit to distribute among theactive work areas Memory Bound Computation /* This while loop terminates once all work areas are removed from ** the set of active work areas or all the memory has been consumed. */ WHILE(memory target>0 and number_of_workarea_left>0) { /* compute an initial value of the memory bound assuming that each work ** area will consume bound.Some of them might consume less than this so ** the final memory bound might be higher than this initial value. */ memory_bound=memory target/number_of_workarea_left; /*Loop over all operations left in workarea left,i.e.,that have not ** been assigned a memory size to use during their execution. */ removed=FALSE;/* no one has been removed so far */ FOR EACH(workarea(WA)in workarea_left)DO { /* Compute the size of the memory it can use based on the memory_bound. ** Also compute the memory increment it will take in case we are willing ** to give it more memory. ** This memory increment is operation-dependent. ** Hash-Join,the next memory increment can be anything,while for Sort,** it will be the memory requirement of a higher mode.That’s if current ** memory usage corresponds to one pass the next memory increment is the ** memory necessary to move to optimal mode requirement. ** The reason is that the Hash-Join operation performance will improve ** linearly from additional memory while the Sorr doesn’t. get_memory_profile(INWA,JNmemory_bound, OUTmemory_used,OUTnext_increment); /* Memory used is equal to the memory requirement to run in optimal mode ** which means that the memory_bound is greater than that requirement. ** This operation has the maximum memory size it can hope for,so we’ll ** take it off the list of left work areas. */ IF(memory_used=optimal memory) { memory_target-=memory_used;/*this much is consumed */ workarea_left-={WA};/* remove it from the set */ number_of_workarea_left--;/* one less */ removed=TRUE; } ELSE /* We keep this work area for now,and check whether it’s the largest ** one in the set,in which case we keep a tag on it. ** Such a work area is the best candidate to eliminate relative to the ** ones left ** Once this loop is over we will eliminate it from the set. */ /* In case we didn’t remove any work area during the previous loop */ } IF((NOT removed)AND max_next_memory<memory_used+next_increment) {max_next_memory=memory_used+next_increment; largest_wa=WA; memory of_largest wa=memory_used; } } }1* end of FOR EACH LOOP */ /* All work areas have got their best hope for memory size,then we are ** done. */ IF(the memory used by each WA is equal to the bound) { number_of_workarea_left=0; } ELSE /* We couldn’t remove one work are */ IF(removed==-FALSE) { /* remove the largest a work area,take off the largest one */ workarea_left-={largest_wa}; memory_target-=memory_of_largest wa; number_of_workarea_left--; } }]]></pre>
權(quán)利要求
1.一種在計算機(jī)中將內(nèi)存分配給與數(shù)據(jù)庫有關(guān)的數(shù)個進(jìn)程的方法,該方法包括存儲要分配給進(jìn)程的總內(nèi)存量的第一值;和根據(jù)第一值,導(dǎo)出要由至少一個進(jìn)程中的至少一個操作符分配的內(nèi)存量的第二值。
2.根據(jù)權(quán)利要求1所述的方法,還包括按第二值的數(shù)量分配內(nèi)存;根據(jù)第二值改變第一值;在改變第一值之后重復(fù)導(dǎo)出步驟。
3.根據(jù)權(quán)利要求1所述的方法,還包括按第二值的數(shù)量分配內(nèi)存;和不改變第一值地重復(fù)導(dǎo)出步驟。
4.根據(jù)權(quán)利要求1所述的方法,其中所有進(jìn)程都可以訪問計算機(jī)中的共享內(nèi)存;和該方法包括把第二值存儲在共享內(nèi)存中。
5.根據(jù)權(quán)利要求4所述的方法,還包括在共享內(nèi)存中存儲要供一個操作符使用的內(nèi)存估計值。
6.根據(jù)權(quán)利要求5所述的方法,其中所述估計值具有一個操作符所需的內(nèi)存。
7.根據(jù)權(quán)利要求4所述的方法,還包括對于每個操作符,每個進(jìn)程在共享內(nèi)存中存儲最佳模式所需的內(nèi)存的第一估計值;一遍掃描模式所需的內(nèi)存的第二估計值;和最小模式所需的內(nèi)存的第三估計值。
8.根據(jù)權(quán)利要求7所述的方法,還包括將第二值與估計值的至少一個相比較;和根據(jù)比較結(jié)果確定要分配給操作符的內(nèi)存量。
9.根據(jù)權(quán)利要求4所述的方法,還包括每個進(jìn)程根據(jù)第二值分配內(nèi)存;和每個進(jìn)程在共享內(nèi)存中存儲分配給該進(jìn)程的內(nèi)存量。
10.根據(jù)權(quán)利要求9所述的方法,還包括每個進(jìn)程在共享內(nèi)存中存儲該進(jìn)程中每個操作符使用的內(nèi)存量、該進(jìn)程的其它部分使用的內(nèi)存量和已分配但沒有被該進(jìn)程使用的內(nèi)存量。
11.根據(jù)權(quán)利要求1所述的方法,其中計算機(jī)包括不受這些值約束的附加進(jìn)程。
12.根據(jù)權(quán)利要求1所述的方法,其中第二值是所有進(jìn)程中所有操作符公用的。
13.根據(jù)權(quán)利要求1所述的方法,還包括周期性地重復(fù)確定步驟。
14.根據(jù)權(quán)利要求1所述的方法,還包括對被分配給數(shù)個進(jìn)程的內(nèi)存超過達(dá)預(yù)定數(shù)的第一值作出響應(yīng),重復(fù)確定步驟。
15.一種在其中存儲著數(shù)個指令序列的計算機(jī)可讀媒體,該數(shù)個指令序列包括當(dāng)被計算機(jī)執(zhí)行時,使計算機(jī)完成權(quán)利要求1所述的方法的指令序列。
16.一種在載波媒體中具體化和利用數(shù)個指令序列編碼的信號,該數(shù)個指令序列包括當(dāng)被計算機(jī)執(zhí)行時,使計算機(jī)完成權(quán)利要求1所述的方法的指令序列。
17.一種在計算機(jī)中將內(nèi)存分配給與數(shù)據(jù)庫有關(guān)的數(shù)個進(jìn)程的方法,該方法包括將要分配給操作符的內(nèi)存的預(yù)定值與如下三個估計值的至少一個相比較操作符的最佳執(zhí)行所需的內(nèi)存的第一估計值、操作符的一遍掃描執(zhí)行所需的內(nèi)存的第二估計值和操作符的最小執(zhí)行所需的內(nèi)存的第二估計值;和根據(jù)比較結(jié)果導(dǎo)出要分配給操作符的內(nèi)存量。
18.根據(jù)權(quán)利要求17所述的方法,其中如果第一估計值小于預(yù)定值,把該內(nèi)存量確定成第一估計值。
19.根據(jù)權(quán)利要求17所述的方法,其中如果預(yù)定值在第一估計值和第二估計值之間,至少從第二估計值中導(dǎo)出該內(nèi)存量。
20.根據(jù)權(quán)利要求19所述的方法,其中還從該進(jìn)程相對于其它進(jìn)程的優(yōu)先級中導(dǎo)出該內(nèi)存量。
21.根據(jù)權(quán)利要求17所述的方法,其中如果預(yù)定值在第一估計值和第三估計值之間,至少從預(yù)定值中導(dǎo)出該內(nèi)存量。
22.根據(jù)權(quán)利要求17所述的方法,其中如果預(yù)定值小于第三估計值,從第三估計值中導(dǎo)出該內(nèi)存量。
23.根據(jù)權(quán)利要求17所述的方法,還包括,在比較步驟之前根據(jù)要分配給進(jìn)程的總內(nèi)存確定預(yù)定值。
24.一種在計算機(jī)中把內(nèi)存分配給數(shù)個進(jìn)程的方法,該方法包括每個進(jìn)程在計算機(jī)的共享內(nèi)存中存儲該進(jìn)程所需的內(nèi)存量的估計值;每個進(jìn)程將該估計值與從共享內(nèi)存中檢索的值相比較;和每個進(jìn)程根據(jù)比較結(jié)果分配內(nèi)存。
25.根據(jù)權(quán)利要求24所述的方法,其中每個進(jìn)程與數(shù)據(jù)庫有關(guān);和該估計值和該值是用于實現(xiàn)數(shù)據(jù)庫查詢的操作符的。
26.根據(jù)權(quán)利要求25所述的方法,其中每個進(jìn)程為操作符執(zhí)行的相應(yīng)數(shù)種模式存儲數(shù)個估計值;和如果第一估計值小于該值,把在分配步驟中分配的內(nèi)存確定成第一估計值。
27.根據(jù)權(quán)利要求26所述的方法,其中操作符是排序;和如果該值在第一估計值和第二估計值之間,把在分配步驟中分配的內(nèi)存確定成中間估計值,其中,中間估計值在第一估計值和第二估計值之間。
28.根據(jù)權(quán)利要求26所述的方法,其中操作符是散列連接;和如果該值在第一估計值和中間估計值之間,把在分配步驟中分配的內(nèi)存確定成該值,其中,中間估計值在第一估計值和第二估計值之間。
29.一種在計算機(jī)中將內(nèi)存分配給數(shù)個進(jìn)程的方法,該方法包括每個進(jìn)程將實現(xiàn)數(shù)據(jù)庫查詢的操作符所需的內(nèi)存估計值與預(yù)定數(shù)字相比較;和每個進(jìn)程根據(jù)比較結(jié)果分配內(nèi)存。
30.根據(jù)權(quán)利要求29所述的方法,其中,預(yù)定數(shù)字指的是可用于分配的內(nèi)存,該方法還包括當(dāng)預(yù)定數(shù)字超過估計值時,進(jìn)行分配;和如果估計值超過預(yù)定數(shù)字時,使進(jìn)程排隊。
31.根據(jù)權(quán)利要求29所述的方法,其中,估計值具有操作符的最小模式所需的內(nèi)存,并且,其中即使估計值超過預(yù)定數(shù)字,也進(jìn)行分配。
32.一種在計算機(jī)中將內(nèi)存分配給數(shù)個進(jìn)程的方法,該方法包括存儲與要分配給進(jìn)程的總內(nèi)存有關(guān)的第一值;從第一值中導(dǎo)出第二值;利用第二值為一個進(jìn)程分配內(nèi)存;和在所述利用之后修改第二值。
33.根據(jù)權(quán)利要求32所述的方法,其中,所述修改提供修改第二值,和該方法還包括利用修改第二值為另一個進(jìn)程分配內(nèi)存。
34.根據(jù)權(quán)利要求32所述的方法,其中所述修改第二值是從所述第二值和所述第一值的每一個中導(dǎo)出的。
35.根據(jù)權(quán)利要求32所述的方法,其中所述修改是周期性地進(jìn)行的。
36.根據(jù)權(quán)利要求32所述的方法,還包括每個進(jìn)程更新與內(nèi)存的分配和解除分配有關(guān)的內(nèi)存使用統(tǒng)計表;和將該統(tǒng)計表與第一值和第二值的至少一個相比較;其中,修改是基于比較結(jié)果的。
37.根據(jù)權(quán)利要求36所述的方法,其中每個進(jìn)程進(jìn)行比較和對結(jié)果作出響應(yīng)引發(fā)修改。
38,一種執(zhí)行與數(shù)據(jù)庫有關(guān)的數(shù)個進(jìn)程的計算機(jī),該計算機(jī)包括存儲要分配給進(jìn)程的總內(nèi)存量的第一值的裝置;和根據(jù)第一值,導(dǎo)出要由至少一個進(jìn)程中的至少一個操作符分配的內(nèi)存量的第二值的裝置。
39.根據(jù)權(quán)利要求38所述的計算機(jī),還包括按第二值的數(shù)量分配內(nèi)存的裝置;和根據(jù)第二值改變第一值的裝置。
40.一種執(zhí)行與數(shù)據(jù)庫有關(guān)的數(shù)個進(jìn)程的計算機(jī),該計算機(jī)包括將要分配給數(shù)據(jù)庫操作符的內(nèi)存的預(yù)定值與如下三個估計值的至少一個相比較的裝置數(shù)據(jù)庫操作符的最佳執(zhí)行所需的內(nèi)存的第一估計值、數(shù)據(jù)庫操作符的一遍掃描執(zhí)行所需的內(nèi)存的第二估計值和數(shù)據(jù)庫操作符的最小執(zhí)行所需的內(nèi)存的第二估計值;和與比較裝置耦合以從中接收比較結(jié)果、導(dǎo)出要分配給數(shù)據(jù)庫操作符的內(nèi)存量的裝置。
41.根據(jù)權(quán)利要求40所述的計算機(jī),還包括存儲三個估計值的裝置;和其中,所述導(dǎo)出裝置包括如果第一估計值小于該值,選擇第一估計值的裝置。
42.一種將內(nèi)存分配給在其中執(zhí)行的數(shù)個進(jìn)程的計算機(jī),該計算機(jī)包括存儲與要分配給進(jìn)程的總內(nèi)存有關(guān)的第一值的裝置;從第一值中導(dǎo)出第二值的裝置;利用第二值為一個進(jìn)程分配內(nèi)存的裝置;在所述利用之后修改第二值的裝置;和利用修改第二值為另一個進(jìn)程分配內(nèi)存的裝置。
43.根據(jù)權(quán)利要求42所述的計算機(jī),還包括更新與內(nèi)存的分配和解除分配有關(guān)的內(nèi)存使用統(tǒng)計表的裝置;和將該統(tǒng)計表與第一值和第二值的至少一個相比較的裝置。
全文摘要
應(yīng)用程序(如數(shù)據(jù)庫)對為應(yīng)用程序執(zhí)行的函數(shù)(function)(如查詢)定義要供應(yīng)用程序使用的內(nèi)存量的值(也稱為外部設(shè)置全局值)敏感。在一個實施例中,指令序列(也稱為“內(nèi)存中介器(memory broker)”)利用外部設(shè)置全局值來計算以后當(dāng)分配內(nèi)存時使用的一個或多個內(nèi)部值。內(nèi)存中介器根據(jù)為函數(shù)分配的內(nèi)存動態(tài)地修改內(nèi)部值,從而形成反饋回路。
文檔編號G06F9/46GK1561486SQ02819443
公開日2005年1月5日 申請日期2002年9月30日 優(yōu)先權(quán)日2001年10月1日
發(fā)明者貝努特·達(dá)格維爾, 穆罕麥德·蔡特 申請人:甲骨文國際公司