專利名稱::觀察改變索引對(duì)查詢優(yōu)化方案的影響的數(shù)據(jù)庫(kù)系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及觀察改變數(shù)據(jù)庫(kù)表索引設(shè)計(jì)的影響。更具體地,本發(fā)明涉及在改變數(shù)據(jù)庫(kù)表的索引時(shí)使用虛擬表和虛擬索引確定數(shù)據(jù)庫(kù)查詢的優(yōu)化方案。在多數(shù)數(shù)據(jù)庫(kù)中,從外部觀察數(shù)據(jù)被組織成表。各個(gè)表通常包含一系列定義表的列的字段。表的每個(gè)行包括一個(gè)單獨(dú)的記錄。對(duì)于表中的每行數(shù)據(jù),該數(shù)據(jù)的具體內(nèi)容被物理存儲(chǔ)在數(shù)據(jù)庫(kù)中。因而當(dāng)數(shù)據(jù)庫(kù)用戶從表中請(qǐng)求具體信息時(shí),存儲(chǔ)數(shù)據(jù)的適當(dāng)部分被檢索出來(lái)并且提供給用戶。一個(gè)被稱作″數(shù)據(jù)庫(kù)管理系統(tǒng)″(″DBMS″)的程序?yàn)橛脩籼峁┮粋€(gè)針對(duì)數(shù)據(jù)庫(kù)的接口。DBMS為數(shù)據(jù)庫(kù)提供允許用戶訪問數(shù)據(jù)庫(kù)中存儲(chǔ)的信息對(duì)象的結(jié)構(gòu)。DBMS根據(jù)用戶的信息請(qǐng)求或″查詢″識(shí)別并檢索某些信息對(duì)象。具體信息對(duì)象的檢索取決于信息對(duì)象中存儲(chǔ)的信息與用戶對(duì)系統(tǒng)的請(qǐng)求之間的相似程度。通過比較信息對(duì)象和信息請(qǐng)求所附的某些屬性的數(shù)值來(lái)測(cè)量相似程度。例如,如果表″Employee″包含字段″Name″,″Dept″,″Age″和″Salary″,并且用戶期望找到在電子部門工作的雇員子集,可以使用下面查詢SELECTName,Salary,AgeFROMEmployeeWHEREDept=″Electronics″為了利于檢索處理,經(jīng)常對(duì)數(shù)據(jù)庫(kù)中的信息對(duì)象加″索引″以便通過分配標(biāo)識(shí)對(duì)象內(nèi)容的描述符來(lái)概括對(duì)象的特征。提取這些信息對(duì)象的特征的處理可以引導(dǎo)DBMS根據(jù)用戶的具體查詢檢索出數(shù)據(jù)庫(kù)中的具體內(nèi)容,上述處理被稱作″索引″。為了建立表索引,DBMS通常掃描表,檢索表中各行和各列的數(shù)據(jù),并且向索引添加數(shù)據(jù),其中索引經(jīng)常具有B-樹結(jié)構(gòu)。更多有關(guān)B-樹結(jié)構(gòu)的信息參見PatrickONeil″數(shù)據(jù)庫(kù)-原理,編程,性能″MorganKaufmannPublishers(1994),這里參考引入了上述著作。DBMS順序讀取表中的每個(gè)數(shù)據(jù)記錄,將各個(gè)數(shù)據(jù)記錄復(fù)制到一個(gè)臨時(shí)空間,在必要時(shí)對(duì)數(shù)據(jù)記錄進(jìn)行排序,并且最終創(chuàng)建一個(gè)索引數(shù)據(jù)結(jié)構(gòu)。然而建立表索引的處理通常消耗大量時(shí)間和資源。例如,創(chuàng)建具有數(shù)百萬(wàn)行的表的索引可能需要幾天時(shí)間。此外,創(chuàng)建這種表的索引通常需要使用數(shù)百兆字節(jié)的臨時(shí)工作區(qū)以便在創(chuàng)建索引之前復(fù)制和排序數(shù)據(jù)。自然地,創(chuàng)建或改變索引的處理會(huì)相應(yīng)占用大量的時(shí)間。諸如數(shù)據(jù)倉(cāng)庫(kù)中使用的數(shù)據(jù)庫(kù)表可以具有數(shù)十億甚至數(shù)千萬(wàn)億行數(shù)據(jù)。用戶可能需要數(shù)周甚至數(shù)月來(lái)創(chuàng)建這種規(guī)模的表的索引。其它因素使得涉及創(chuàng)建索引的時(shí)間問題更加復(fù)雜。具體地,在創(chuàng)建索引之后,數(shù)據(jù)庫(kù)需要時(shí)間測(cè)試索引并且返回性能統(tǒng)計(jì)結(jié)果,用戶也需要時(shí)間分析結(jié)果。對(duì)于一個(gè)典型的索引數(shù)據(jù)庫(kù)系統(tǒng),完成一個(gè)查詢通常需要兩個(gè)步驟。第一個(gè)步驟是確定在索引中具有關(guān)聯(lián)描述符或索引記錄的查詢子句以便檢索那些索引記錄,并且預(yù)先限制要考慮的信息對(duì)象集合。第二個(gè)步驟通常需要從第一步驟得到信息對(duì)象集合并且依次檢查各個(gè)信息對(duì)象以確定是否滿足查詢條件。結(jié)構(gòu)化查詢語(yǔ)言(SQL)已經(jīng)演變成數(shù)據(jù)庫(kù)查詢或語(yǔ)句的標(biāo)準(zhǔn)語(yǔ)言。SQL接口允許用戶通過批處理文件或嵌入到諸如C,COBOL等等的宿主語(yǔ)言中的方式交互表述數(shù)據(jù)庫(kù)表的關(guān)系操作。在SQL中提供允許用戶處理數(shù)據(jù)的操作符,其中各個(gè)操作符操作一或多個(gè)表并且產(chǎn)生一個(gè)新表作為結(jié)果。在調(diào)整SQL語(yǔ)句或查詢的處理中,用戶經(jīng)常希望知道改變索引會(huì)怎樣影響查詢的性能。如上所述,索引可以被加到數(shù)據(jù)庫(kù)中以利于提高執(zhí)行查詢的速度,尤其是在較大的表中,其中索引可以從根本上改進(jìn)性能。另一方面,由于數(shù)據(jù)庫(kù)中的數(shù)據(jù)量,增加或改變索引需要大量的時(shí)間和資源以供數(shù)據(jù)庫(kù)建立索引。因而用戶經(jīng)常面臨兩難的選擇,即或者花費(fèi)建立索引所需的時(shí)間和資源,風(fēng)險(xiǎn)是新索引并沒有顯著改進(jìn)性能,或者是不建立索引,風(fēng)險(xiǎn)是無(wú)法確定索引是否能夠改進(jìn)性能。Oracle數(shù)據(jù)庫(kù)管理系統(tǒng)為用戶提供了觀察SQL語(yǔ)句的″優(yōu)化方案″的能力。當(dāng)數(shù)據(jù)庫(kù)分析SQL語(yǔ)句時(shí)數(shù)據(jù)庫(kù)自動(dòng)確定SQL語(yǔ)句的優(yōu)化方案。優(yōu)化方案在沒有實(shí)際執(zhí)行SQL語(yǔ)句的情況下顯示數(shù)據(jù)庫(kù)會(huì)如何檢索滿足SQL語(yǔ)句需求所需的數(shù)據(jù)。具體地,優(yōu)化方案顯示這樣的信息,例如什么表會(huì)被首先訪問,中間結(jié)果集合會(huì)如何被聯(lián)接,是否會(huì)使用索引,如果是這樣的話會(huì)如何解釋索引。因而通過觀察具體SQL語(yǔ)句的優(yōu)化方案,用戶可以獲得關(guān)于SQL語(yǔ)句在數(shù)據(jù)庫(kù)中執(zhí)行的效率的估測(cè)。在較大的數(shù)據(jù)庫(kù)管理系統(tǒng)中,查詢優(yōu)化對(duì)于時(shí)間和資源消耗最小化尤其重要。因而,用戶觀察SQL語(yǔ)句的優(yōu)化方案并且確定索引變化對(duì)優(yōu)化方案的影響的能力變得同等重要。圖1是關(guān)于常規(guī)方法100的流程圖,其中上述常規(guī)方法100觀察數(shù)據(jù)庫(kù)表的索引變化對(duì)SQL語(yǔ)句優(yōu)化方案的影響。在步驟110,針對(duì)SQL語(yǔ)句產(chǎn)生一個(gè)初始優(yōu)化方案。在步驟120中,創(chuàng)建,丟棄或修改SQL語(yǔ)句中引用的表的索引。在步驟130,針對(duì)SQL語(yǔ)句產(chǎn)生一個(gè)新的優(yōu)化方案。最終在步驟140,用戶比較新優(yōu)化方案和初始優(yōu)化方案以確定改變索引會(huì)改進(jìn)性能還是降低性能。然而如上所述,圖1的常規(guī)方法100需要過多的時(shí)間和資源來(lái)創(chuàng)建,放棄或改變索引。此外,數(shù)據(jù)庫(kù)為建立各種優(yōu)化方案而收集必要的統(tǒng)計(jì)數(shù)據(jù)會(huì)需要過多的時(shí)間和資源。如果在某個(gè)生產(chǎn)環(huán)境中不使用數(shù)據(jù)庫(kù),則可能采用花時(shí)間通過常規(guī)方法改變索引的手段。然而如果在生產(chǎn)中使用數(shù)據(jù)庫(kù),則由于在速度,資源和總體性能方面非常消極的影響,花費(fèi)完成圖1所示的改變所需的時(shí)間和精力是非常不可行的。例如,在使用圖1的方法的情況下,如果一個(gè)工具或應(yīng)用程序依賴一個(gè)現(xiàn)有索引并且用戶在步驟120改變或放棄上述索引,則數(shù)據(jù)庫(kù)可以停機(jī)并且整個(gè)系統(tǒng)會(huì)死鎖。因而,對(duì)于預(yù)覽索引改變對(duì)優(yōu)化方案的影響的常規(guī)方法,用戶經(jīng)常被迫盡量避免調(diào)整索引的嘗試。于是,當(dāng)SQL語(yǔ)句在數(shù)據(jù)庫(kù)中執(zhí)行時(shí)這經(jīng)常導(dǎo)致會(huì)費(fèi)用大量時(shí)間和精力的數(shù)據(jù)庫(kù)不能實(shí)現(xiàn)最優(yōu)索引分布或優(yōu)化方案,尤其是對(duì)于較大的數(shù)據(jù)庫(kù)管理系統(tǒng)。因而需要使用一種更快速并且更加有效的方式來(lái)改變數(shù)據(jù)庫(kù)表索引設(shè)計(jì)并且創(chuàng)建這些索引的優(yōu)化方案。一個(gè)方法和裝置為用戶提供了一種框架,這種框架允許用戶在不必花費(fèi)常規(guī)方法所需的時(shí)間和資源的情況下試驗(yàn)表的索引分布并且預(yù)覽各種索引分布構(gòu)造對(duì)數(shù)據(jù)庫(kù)查詢優(yōu)化方案的影響。根據(jù)本發(fā)明的各個(gè)方面,創(chuàng)建一個(gè)模擬要測(cè)試的數(shù)據(jù)庫(kù)表或數(shù)據(jù)庫(kù)中的″原始表″的結(jié)構(gòu)的虛擬表。通常通過復(fù)制原始表來(lái)創(chuàng)建虛擬表,其中排除原始表中的任何數(shù)據(jù)。因而如果數(shù)據(jù)被存儲(chǔ)在原始表的行中,則數(shù)據(jù)行不被復(fù)制到虛擬表中。然而復(fù)制任何與原始表或″原始索引″相關(guān)的現(xiàn)有索引以定義一個(gè)與虛擬表相關(guān)的虛擬索引。通過在復(fù)制原始表定義虛擬表時(shí)排除數(shù)據(jù),可以方便快速地修改相關(guān)虛擬索引并且保持原始表的總體結(jié)構(gòu)。可以非??焖俚卦黾有滤饕头艞壃F(xiàn)有索引。并且如果沒有原始索引,則可以方便地創(chuàng)建新虛擬索引。在查詢中,針對(duì)原始表的引用被針對(duì)虛擬表的引用替換。數(shù)據(jù)庫(kù)管理系統(tǒng)則為查詢確定一個(gè)新的優(yōu)化方案。由于使用虛擬表和虛擬索引確定新優(yōu)化方案,所以方案的檢索比使用原始表和任何相關(guān)原始索引產(chǎn)生的方案更快速。這是由于當(dāng)復(fù)制原始表定義虛擬表時(shí)排除了原始表中的實(shí)際數(shù)據(jù)。因而在改變索引設(shè)計(jì)之后可以快速識(shí)別對(duì)優(yōu)化方案的任何改變。在向用戶顯示新優(yōu)化方案之前,用原始表和原始索引的名稱替換新優(yōu)化方案中任何對(duì)虛擬表和任何虛擬索引的引用。通過這種方式,用戶可以比較新優(yōu)化方案和初始優(yōu)化方案并且在不關(guān)心或甚至不需要知道虛擬對(duì)象在產(chǎn)生新優(yōu)化方案過程中的使用的情況下分析變化。在圖2中,服務(wù)器計(jì)算機(jī)202與一個(gè)數(shù)據(jù)庫(kù)212通信,數(shù)據(jù)庫(kù)212最好是一個(gè)Oracle數(shù)據(jù)庫(kù)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以使用諸如微軟公司SQL服務(wù)器數(shù)據(jù)庫(kù),SybaseSQL服務(wù)器數(shù)據(jù)庫(kù)和IBMDB2數(shù)據(jù)庫(kù)的其它數(shù)據(jù)庫(kù)。本領(lǐng)域的技術(shù)人員可以認(rèn)識(shí)到,客戶端計(jì)算機(jī)200和服務(wù)器計(jì)算機(jī)202可以使用參照?qǐng)D2描述的上述部件的任何組合或任意數(shù)量的不同部件,外設(shè)和其它設(shè)備。本領(lǐng)域的技術(shù)人員還可以認(rèn)識(shí)到,可以在一個(gè)單獨(dú)計(jì)算機(jī)而不是多個(gè)共同聯(lián)網(wǎng)的計(jì)算機(jī)上實(shí)現(xiàn)本發(fā)明的示例性實(shí)施例。通常使用數(shù)據(jù)庫(kù)管理系統(tǒng)軟件實(shí)現(xiàn)本發(fā)明的示例性實(shí)施例,例如PLATINUMTechnology制作并銷售的SQL-Station軟件,雖然可以通過任意的數(shù)據(jù)庫(kù)管理系統(tǒng)軟件來(lái)實(shí)現(xiàn),例如Oracle銷售的Developer/2000開發(fā)包或IBM銷售的DB2產(chǎn)品。此外,可以實(shí)現(xiàn)本發(fā)明示例性實(shí)施例的PLATINUMSQL-Station軟件可以和其它軟件結(jié)合使用,例如OracleDeveloper/2000軟件和IBM銷售的DB2產(chǎn)品。在圖2中,軟件包含客戶端計(jì)算機(jī)200執(zhí)行的SQL-Station客戶端程序204和RelationalExtender客戶端程序206。軟件還包含服務(wù)器計(jì)算機(jī)202執(zhí)行的Oracle服務(wù)器程序208和RelationalExtender程序210。在其相應(yīng)計(jì)算機(jī)200或202的操作系統(tǒng)的控制下執(zhí)行這些程序,上述操作系統(tǒng)包括Windows95,WindowsNT,OS/2,AIX,MVS,Unix等等。本領(lǐng)域的技術(shù)人員會(huì)認(rèn)識(shí)到,可以使用上述程序的任意組合或任意數(shù)量的不同程序來(lái)實(shí)現(xiàn)本發(fā)明的示例性實(shí)施例。SQL-Station客戶端程序204和RelationalExtender客戶端程序206針對(duì)Oracle服務(wù)器程序208和RelationalExtender服務(wù)器程序210管理的數(shù)據(jù)庫(kù)212產(chǎn)生執(zhí)行各種搜尋和檢索函數(shù),即查詢的命令。在最優(yōu)實(shí)施例中,這些查詢符合SQL標(biāo)準(zhǔn)要求,雖然在不偏離本發(fā)明范圍的前提下也可以使用其它類型的查詢。查詢調(diào)用Oracle服務(wù)器程序208和RelationalExtender服務(wù)器程序210執(zhí)行的函數(shù),例如對(duì)用戶和系統(tǒng)數(shù)據(jù)進(jìn)行定義,訪問控制,解釋,編譯,數(shù)據(jù)庫(kù)檢索和更新的函數(shù)。通常情況下,DBMS軟件,SQL查詢和其中導(dǎo)出的指令均可實(shí)際包含在諸如一或多個(gè)數(shù)據(jù)存儲(chǔ)設(shè)備和/或數(shù)據(jù)通信設(shè)備的計(jì)算機(jī)可讀介質(zhì)中,或者可以從中讀取出來(lái)。此外,RDBMS軟件,SQL查詢,和其中導(dǎo)出的指令均由在被客戶端計(jì)算機(jī)200和/或服務(wù)器計(jì)算機(jī)202讀取和執(zhí)行時(shí)導(dǎo)致客戶端計(jì)算機(jī)200和/或服務(wù)器計(jì)算機(jī)202執(zhí)行實(shí)現(xiàn)和/或使用本發(fā)明的實(shí)施例所必需的步驟的指令組成。圖3是圖解基于本發(fā)明一個(gè)示例性實(shí)施例的系統(tǒng)的模塊圖,上述系統(tǒng)確定數(shù)據(jù)庫(kù)表的索引變化對(duì)數(shù)據(jù)庫(kù)查詢優(yōu)化方案的影響。圖中顯示兩個(gè)用戶或″模式″,即TUTOR302和″PAFO-HR″304,均訪問一個(gè)數(shù)據(jù)庫(kù)306,數(shù)據(jù)庫(kù)306最好是一個(gè)諸如Oracle8數(shù)據(jù)庫(kù)的Oracle數(shù)據(jù)庫(kù)。在圖3中,各個(gè)用戶302,304控制其擁有并且存儲(chǔ)在其帳戶內(nèi)的表中的對(duì)象和信息。例如,用戶PAFO-HR304控制原始表308和一個(gè)相關(guān)索引310,以及虛擬表312和一個(gè)與虛擬表312相關(guān)的虛擬索引314。表308,312和對(duì)應(yīng)的相關(guān)索引310,314被存儲(chǔ)在數(shù)據(jù)庫(kù)上。各個(gè)用戶302,304通??刂圃撚脩魩魞?nèi)存儲(chǔ)的信息以便排斥數(shù)據(jù)庫(kù)306的其它用戶。然而用戶可以被授予各種涉及其它用戶帳戶的特權(quán)。通常,只可以從一個(gè)用戶向另一個(gè)用戶授予涉及一個(gè)用戶的帳戶的特權(quán)。例如在圖3中,只有PAFO-HR304具有向其它用戶授予涉及PAFO-HR304帳戶的特權(quán)的能力。一個(gè)這樣的特權(quán)是″READ″,即允許訪問另一個(gè)用戶的帳戶中的信息。例如在圖3中,用戶PAFO-HR304允許用戶TUTOR302或授予TUTOR302READ特權(quán)來(lái)訪問PAFO-HR304帳戶內(nèi)的表中存儲(chǔ)的信息和對(duì)象。因而TUTOR302能夠查詢PAFO-HR的帳戶內(nèi)的表并且訪問PAFO-HR304帳戶中的這種信息。另一方面,一個(gè)第三用戶″SCOTT″(未示出)沒有被授予這種涉及PAFO-HR帳戶的READ特權(quán),所以SCOTT不能訪問PAFO-HR304控制的表。圖3的系統(tǒng)中具有的另一個(gè)特權(quán)是″CREATETABLE″特權(quán)或特權(quán)集合,上述特權(quán)也可以從一個(gè)用戶授予另一個(gè)用戶。在得到一個(gè)用戶的授權(quán)的情況下,CREATE-TABLE特權(quán)允許其它用戶在某個(gè)用戶的帳戶內(nèi)創(chuàng)建表并且在表中存儲(chǔ)對(duì)象。由于為其它用戶提供更強(qiáng)的單方面選擇修改或刪除另一個(gè)用戶帳戶內(nèi)存儲(chǔ)的信息的能力,用戶經(jīng)常不希望向數(shù)據(jù)庫(kù)系統(tǒng)中其它用戶授予CREATETABLE特權(quán)。因而在圖3的數(shù)據(jù)庫(kù)環(huán)境中,TUTOR302沒有被授予涉及PAFO-HR帳戶的CREATE-TABLE特權(quán)。在圖3中,根據(jù)本發(fā)明的示例性實(shí)施例,在數(shù)據(jù)庫(kù)306上存儲(chǔ)一個(gè)名稱為″Oracle方案分析器″(″PAFO″)316的軟件包。這個(gè)軟件包可以被數(shù)據(jù)庫(kù)系統(tǒng)的用戶302,304訪問。與TUTOR302不同的是,軟件包PAFO316具有授予PAFO316的PAFO-HR304CREATETABLE特權(quán)和數(shù)據(jù)庫(kù)管理員(DBA)授予的若干其它特權(quán)。因而一個(gè)登錄到TUTOR302帳戶上的用戶可以使用PAFO軟件包316實(shí)現(xiàn)訪問和試驗(yàn)PAFO-HR304帳戶中的表和索引的任務(wù),如果沒有登錄則不具有完成上述任務(wù)的特權(quán)。在圖3中,TUTOR302調(diào)用軟件包PAFO316執(zhí)行本發(fā)明的方法。當(dāng)調(diào)用PAFO316時(shí),PAFO316為PAFO-HR304帳戶創(chuàng)建并動(dòng)態(tài)配置一個(gè)過程318。接著在PAFO-HR304帳戶中執(zhí)行配置的過程318。配置的過程318可以向TUTOR302帳戶的用戶授予訪問PAFO-HR304帳戶的必要特權(quán)。配置的過程接著向TUTOR,即用戶的帳戶授予對(duì)虛擬表的READ(非寫)特權(quán)。通過這種方式,TUTOR可以在沒有CREATETABLE特權(quán)的情況下訪問原始表308和虛擬表312。此后參照?qǐng)D3和4描述配置的過程318的功能。在圖4的步驟402中,過程316識(shí)別SQL語(yǔ)句320中引用的原始表308并且復(fù)制原始表308以定義虛擬表312。在步驟402中,這個(gè)復(fù)制包含向新表中復(fù)制原始表統(tǒng)計(jì)數(shù)據(jù),其中包含列統(tǒng)計(jì),柱狀圖和分段存儲(chǔ)。通過這種方式,表面上虛擬表包含的數(shù)據(jù)行和原始表一樣多。然而最好從定義虛擬表312所復(fù)制的信息中排除原始表308中的任何實(shí)際數(shù)據(jù)。因而當(dāng)數(shù)據(jù)被存儲(chǔ)在原始表308的行中時(shí),數(shù)據(jù)行不被復(fù)制到虛擬表312中。在步驟402中,通過一個(gè)原始表復(fù)本進(jìn)行創(chuàng)建和操作有許多好處。用戶對(duì)原始表308的訪問不被中斷并且變化不降低性能。在生產(chǎn)環(huán)境中,執(zhí)行的應(yīng)用不受影響。當(dāng)使用Oracle數(shù)據(jù)庫(kù)時(shí),不需要針對(duì)原始表308修改Oracle目錄中的內(nèi)容。此外由于虛擬表不包含任何數(shù)據(jù)行,因而索引建立非常快速。在步驟402中,如果在PAFO-HR304帳戶中有其它原始表,則也可以復(fù)制這些表以便定義對(duì)應(yīng)的虛擬表。并且由于如下所述的原因,最好維護(hù)一個(gè)列表(未示出),在該列表中虛擬表的名稱與其建立所依據(jù)的原始表相關(guān)。在步驟404中定義與虛擬表312相關(guān)的虛擬索引314。在這個(gè)步驟中,如果存在任何與原始表308相關(guān)的原始索引310,則過程316復(fù)制原始索引310以定義虛擬索引314。例如如果針對(duì)圖3的原始表308中示出的兩個(gè)列定義了原始索引,則通過復(fù)制原始索引針對(duì)虛擬表312中示出的兩個(gè)列創(chuàng)建對(duì)應(yīng)的虛擬索引。與原始索引310相關(guān)的統(tǒng)計(jì)數(shù)據(jù)也被復(fù)制到虛擬索引314中,并且可以根據(jù)用戶的指示來(lái)設(shè)置。通過這種方式,虛擬索引具有與原始索引相同的數(shù)據(jù)結(jié)構(gòu),其中包含相同的約束和定義。因而對(duì)于所涉及的任何優(yōu)化方案,虛擬索引的結(jié)構(gòu)均與原始索引相同。在步驟404中,如果沒有與原始表308相關(guān)的原始索引310,則用戶可以通過過程316創(chuàng)建和定義虛擬索引314。并且在一個(gè)用戶希望進(jìn)行沒有索引的試驗(yàn)的情況下,用戶可以使用配置的過程316通過刪除原始索引310中出現(xiàn)的任何索引來(lái)進(jìn)行簡(jiǎn)單選擇以定義虛擬索引314。這里,在PAFO-HR304上創(chuàng)建過程318并且執(zhí)行過程318以便向TUTOR302授予READ特權(quán)。在步驟406,當(dāng)定義虛擬索引314之后,PAFO316用一個(gè)針對(duì)虛擬表312的引用替換SQL語(yǔ)句320中任何針對(duì)原始表308的引用。另外,用虛擬索引314的名稱替換SQL語(yǔ)句320中任何針對(duì)原始索引310的引用。被替換名稱修改的SQL語(yǔ)句322接著被發(fā)送到數(shù)據(jù)庫(kù)服務(wù)器。帳戶TUTOR302的用戶會(huì)相信其正在訪問原始表308,但實(shí)際上正在訪問虛擬表314。此外,通過創(chuàng)建原始表的一個(gè)復(fù)本并且簡(jiǎn)單改變SQL語(yǔ)句中引用的對(duì)象的名稱,不必進(jìn)行在原始表上費(fèi)時(shí)又費(fèi)資源的創(chuàng)建新索引的操作。由于PAFO程序316已經(jīng)改變SQL語(yǔ)句320并且定義了經(jīng)過修改的SQL語(yǔ)句322,數(shù)據(jù)庫(kù)在步驟408中解釋經(jīng)過修改的SQL語(yǔ)句322以確定虛擬表的新優(yōu)化方案324。在步驟410中,PAFO過程316接著修改數(shù)據(jù)庫(kù)服務(wù)器返回的新優(yōu)化方案324中的信息以便定義一個(gè)經(jīng)過修改的優(yōu)化方案326。具體地,分別參照原始索引310和原始表308替換新優(yōu)化方案324中針對(duì)虛擬索引314和虛擬表312的任何引用。接著在步驟412中向用戶顯示用替換名稱修改的優(yōu)化方案326。因而用戶的感覺是僅僅在操作初始對(duì)象308和310。通過使用上述方法,改變索引和檢索新優(yōu)化方案所需的時(shí)間經(jīng)常從若干小時(shí)減少到若干秒。因而用戶在不需要關(guān)心或察覺虛擬表和虛擬索引的使用的情況下就能夠得到改進(jìn)新優(yōu)化方案檢索的速度與系統(tǒng)性能的好處。用戶可以將經(jīng)過修改的優(yōu)化方案326與任何針對(duì)原始表308和原始索引310創(chuàng)建的初始優(yōu)化方案相互比較。如果新優(yōu)化方案更好,例如似乎會(huì)改進(jìn)數(shù)據(jù)庫(kù)中執(zhí)行SQL語(yǔ)句320的速度和效率,則用戶可以選擇在原始表308上實(shí)際建立虛擬索引314。反之,如果不會(huì)改進(jìn)性能,則用戶可以試驗(yàn)不同的虛擬索引314或在不浪費(fèi)時(shí)間和資源的情況下繼續(xù)使用原始索引310,其中如果不繼續(xù)使用原始索引310則需要構(gòu)造虛擬索引314??梢杂啥鄠€(gè)用戶在相同對(duì)象上同時(shí)執(zhí)行如圖3和4所述的各個(gè)功能。這些功能不干擾對(duì)象的其它用戶,也不對(duì)性能產(chǎn)生顯著的影響,這允許在一個(gè)生產(chǎn)系統(tǒng)中執(zhí)行這些功能。例子在一個(gè)例子中,一個(gè)用戶登錄到圖3的TUTOR302帳戶上。在這個(gè)例子中,帳戶PAFO-HR304中的原始表308是一個(gè)存儲(chǔ)某公司或企業(yè)的雇員名稱的表,此后被稱作″EMPLOYEES″表。TUTOR302被授予涉及PAFO-HR帳戶的READ特權(quán),所以TUTOR302能夠向EMPLOYEES表發(fā)送查詢。已經(jīng)針對(duì)EMPLOYEES表創(chuàng)建了虛擬表312,其中虛擬表名稱是″T_########1″,初始SQL語(yǔ)句320如下所示SELECT*FROMhr.employeeseWHEREhiredate>H_Date下面的SQL語(yǔ)句作為修改后的SQL語(yǔ)句322被發(fā)送到服務(wù)器,其中原始表名稱″EMPLOYEES″被虛擬表名稱″T_########1″替換SELECT*FROMhr.″T_########1″e(cuò)WHEREhiredate>H_Date如果SQL語(yǔ)句320包含優(yōu)化線索,則PAFO316檢查包含原始表名稱″EMPLOYEES″的線索或一個(gè)與其相關(guān)的、作為線索的參數(shù)的索引。例如,假定用戶正在操作下面SQL語(yǔ)句320SELECT/*+INDEX(e,I_EMP_HIREDATE)*/*FROMEMPLOYEESeWHEREhiredate>H_Date當(dāng)用戶請(qǐng)求觀察SQL語(yǔ)句320的優(yōu)化方案時(shí),下面消息被發(fā)送到數(shù)據(jù)庫(kù)服務(wù)器以作為修改的SQL語(yǔ)句322SELECT/*+INDEX(e,I_########5)*/*FROMhr.T_########1eWHEREhiredate>H_Date為了避免系統(tǒng)中的性能下降,各個(gè)用戶最好只被允許創(chuàng)建EMPLOYEES的一個(gè)單獨(dú)復(fù)本以定義″T_########1″虛擬表。在已經(jīng)為該用戶創(chuàng)建一個(gè)復(fù)本的情況下最好限制用戶創(chuàng)建新的復(fù)本。對(duì)于下述過程,最好指定原始表的名稱而不是虛擬表名稱。所以如果用戶在EMPLOYEES表上創(chuàng)建一個(gè)第一虛擬索引,用戶可以在EMPLOYEES表的虛擬復(fù)本上創(chuàng)建一個(gè)第二虛擬索引或放棄一個(gè)索引,但是表名稱參數(shù)應(yīng)當(dāng)是原始表的名稱。在后一種情況下,即用戶重新使用之前創(chuàng)建的一個(gè)虛擬表的情況下,PAFO軟件包保證原始表中仍然存在檢索的索引名稱。例如,可以使用下面的SQL查詢SELECTindex_nameFROMexpl_indexesWHEREowner=Index_OwnerANDindex_name=Index_NameANDtable_name=Table_Name最終,由于通常只返回原始表上存在的索引的名稱,應(yīng)當(dāng)通過如下所述的語(yǔ)句查詢虛擬索引SELECTowner,index_nameFROMexpl_indexesWHEREtable_owner=Virtual_table_OwnerANDtable_name=Virtual_Table_NameAND(owner,index_name)NOTIN((′owner1′,′index1′),(′owner2′,′index2′),...),其中(′owner1′,′index1′)對(duì)是返回索引的擁有者和名稱。在這個(gè)例子中,下面步驟被用于觀察數(shù)據(jù)庫(kù)表的索引變化對(duì)數(shù)據(jù)庫(kù)查詢優(yōu)化方案的影響。步驟1創(chuàng)建虛擬表可以執(zhí)行下面過程以創(chuàng)建虛擬表,假定一個(gè)虛擬表尚未創(chuàng)建beginpafo.explain_virtual.create_virtual_table(table_owner,table_name);end;如果虛擬表已經(jīng)存在,則返回一個(gè)差錯(cuò)報(bào)告。參數(shù)的定義如下所述表1在表1中,VARCHAR2(30)表示一個(gè)多達(dá)30個(gè)字符的字符串。并且,模式=INPUT指示數(shù)據(jù)被輸入到過程中。反之,如以下表中所使用的,模式=OUTPUT表示從過程中檢索出的數(shù)據(jù)。步驟2定義虛擬表和索引名稱在創(chuàng)建虛擬表之后,可以執(zhí)行下面過程返回定義虛擬索引所復(fù)制的虛擬表名稱和索引名稱。beginpafo.explain_virtual.get_virtual_table_aliases(table_owner,table_name,virtual_table_name,virtual_index_count,original_index_owners,original_index_names,virtual_index_names);end表2步驟2的調(diào)用通常假定使用CREATE_VIRTUAL_TABLE過程創(chuàng)建虛擬表。這意味著如果虛擬表存在于一個(gè)集簇中,則該集簇與原始表所存在的集簇相同。即虛擬表不是將一個(gè)非集簇表變成集簇表的請(qǐng)求的產(chǎn)物。否則返回一個(gè)差錯(cuò)報(bào)告。步驟3缺省統(tǒng)計(jì)數(shù)據(jù)新虛擬索引最好具有現(xiàn)實(shí)統(tǒng)計(jì)數(shù)據(jù)以便保證創(chuàng)建一個(gè)相當(dāng)于具有在原始表上創(chuàng)建的索引的優(yōu)化方案。EXPLAIN_VIRTUAL提供過程DEFAULT_NEW_INDEX_STATS協(xié)助用戶設(shè)置適當(dāng)?shù)慕y(tǒng)計(jì)數(shù)據(jù)。如果原始表具有已存在的索引,則那些索引的存儲(chǔ)信息和統(tǒng)計(jì)數(shù)據(jù)會(huì)被用來(lái)產(chǎn)生虛擬索引的缺省存儲(chǔ)信息和統(tǒng)計(jì)數(shù)據(jù)。如果沒有分析出已存在的索引,則會(huì)使用有限制的缺省值。在執(zhí)行DEFAULT_NEW_INDEX_STATS之后,向PAFO返回缺省存儲(chǔ)信息和統(tǒng)計(jì)數(shù)據(jù)以便顯示和修改。允許用戶改變這些統(tǒng)計(jì)數(shù)據(jù)以便較好地標(biāo)識(shí)索引性質(zhì)。為了幫助用戶判定如何改變統(tǒng)計(jì)數(shù)據(jù),PAFO允許用戶顯示關(guān)于當(dāng)前在表上創(chuàng)建的其它索引的統(tǒng)計(jì)數(shù)據(jù)。可以執(zhí)行下面過程以獲得缺省統(tǒng)計(jì)數(shù)據(jù)beginpafo.explain_virtual.default_new_index_stats(table_owner,table_name,ind_name,ind_col_names,num_ind_columns,default_tablespace,init_trans,max_trans,pct_free,btree_levels,leaf_bloeks,avg_leaf_blocks,avg_data_blocks,cluster_factor,blocks_allocated,extents_allocated,distinct_values);end;參數(shù)定義如下所述表3*1-保證各個(gè)數(shù)組元素的數(shù)值為null結(jié)束并且在適當(dāng)?shù)腛CI約束參數(shù)中指定數(shù)組的各個(gè)元素的實(shí)際長(zhǎng)度。當(dāng)執(zhí)行過程DEFAULT_NEW_INDEX_STATS時(shí)可以產(chǎn)生下面的差錯(cuò)代碼。第二列包含有關(guān)差錯(cuò)的描述,并且在括號(hào)中包含有關(guān)用戶如何能夠排除差錯(cuò)的建議。表4輸出參數(shù)會(huì)被輸入到下一個(gè)要執(zhí)行的過程EXPLAIN_VIRTUAL.CREATE_VIRTUAL_INDEX。并且注意,用戶可能會(huì)試圖在用戶沒有訪問的表空間上創(chuàng)建索引。步驟4創(chuàng)建虛擬索引最好復(fù)制原始表的任何現(xiàn)有索引以定義虛擬索引。還復(fù)制索引統(tǒng)計(jì)數(shù)據(jù)和存儲(chǔ)信息。因此可以執(zhí)行下面過程beginpafo.explain_virtual.create_virtual_index(table_owner,table_name,ind_name,ind_col_names,num_ind_columns,default_tablespace,init_trans,max_trans,pct_free,btree_levels,leaf_blocks,avg_leaf_blocks,avg_data_blocks,cluster_factor,blocks_allocated,extents_allocated,distinct_values);end;前面在步驟3中定義了這些參數(shù)。步驟5最終步驟這里,PAFO如上所述創(chuàng)建一個(gè)顯示初始SQL文本的新WHATIF框架(frame)。允許用戶修改文本和增加線索。復(fù)制SQL框架的″標(biāo)簽″并且使用相同的序號(hào)。例如,如果SQL框架標(biāo)記是SQLHISTORY;1,則WHATIF框架應(yīng)當(dāng)被標(biāo)記成WHATIFHISTORY;1。當(dāng)用戶請(qǐng)求一個(gè)優(yōu)化方案時(shí),PAFO應(yīng)當(dāng)改變所解釋的SQL文本,但不是在SQL框架上。但是SQL應(yīng)當(dāng)看上去類似初始SQL語(yǔ)句。因而過程期望得到SQL文本的一個(gè)復(fù)本并且用表復(fù)本的名稱(temp_table_name)替換原始表名稱(table_name)的所有出現(xiàn)。如果SQL語(yǔ)句使用一個(gè)同義詞(局部或公共)指向原始表,則修改的SQL文本應(yīng)當(dāng)包含虛擬表?yè)碛姓吆吞摂M表名稱。在線索引用表或表上一個(gè)索引的情況下也可能需要改變線索參數(shù)。接著創(chuàng)建方案并且將方案檢索到存儲(chǔ)器中。對(duì)于OPERATION列從′TABLE′開始的各個(gè)OBJECT_OWNER和OBJECT_NAME組合,應(yīng)當(dāng)將臨時(shí)表名稱改變成初始名稱(table_name)。對(duì)于前面步驟2中返回的各個(gè)虛擬索引,應(yīng)當(dāng)在優(yōu)化方案中搜尋這些虛擬索引名稱并且用原始索引名稱替換。在數(shù)組(original_index_owners,original_index_names)中標(biāo)識(shí)虛擬索引。在數(shù)組(virtual_index_names)中存儲(chǔ)相關(guān)的替換索引名稱。所以每當(dāng)OPERATION列以文本″INDEX″為開始時(shí)PAFO便進(jìn)行搜尋。如果OBJECT_OWNER和OBJECT_NAME匹配ORIGINAL_INDEX_OWNER(0)和VIRTUAL_INDEX_NAME(0)數(shù)值,則索引名稱應(yīng)當(dāng)被改變成ORIGINAL_INDEX_NAME(0)。最好針對(duì)各個(gè)數(shù)組元素重復(fù)這個(gè)處理。接著顯示修改的方案并且在創(chuàng)建的虛擬索引對(duì)性能有影響時(shí)通知用戶。當(dāng)顯示″OBJECT″標(biāo)簽中的信息時(shí),PAFO最好如步驟4&5中所述進(jìn)行相同的改變;即PAFO顯示T_########1而不是EMPLOYEES的索引。但在向用戶顯示信息時(shí)PAFO應(yīng)當(dāng)使用名稱EMPLOYEES代替T_########1。并且當(dāng)顯示索引時(shí),應(yīng)當(dāng)顯示相關(guān)的ORIGINAL_INDEX_NAME數(shù)值。當(dāng)用戶點(diǎn)擊一個(gè)包含虛擬表名稱或其某個(gè)索引的方案步驟時(shí),應(yīng)當(dāng)顯示相關(guān)虛擬索引的統(tǒng)計(jì)數(shù)據(jù)。因而,用戶點(diǎn)擊EMPLOYEES,用戶看見名稱EMPLOYEES,但PAFO列出T_########1的統(tǒng)計(jì)數(shù)據(jù)。對(duì)于EMPLOYEES的索引也是如此。放棄一個(gè)虛擬索引這個(gè)過程最好只能放棄那些屬于一個(gè)虛擬表的索引。所以如果一個(gè)虛擬表不存在,則應(yīng)當(dāng)創(chuàng)建這個(gè)虛擬表。通過過程CREATE_VIRTUAL_TABLE創(chuàng)建虛擬表。接著用戶可以指示其希望放棄一個(gè)索引的表。接著可以使用下面的步驟步驟1.列出所有用戶要訪問的表SELECTowner,table_nameFROMexp1_tables步驟2.確定選擇的表是否虛擬表SELECTtable_id,new_table_nameFROMmy_explain_virtual_tablesWHEREorig_table_name=Table_name如果查詢返回一個(gè)結(jié)果行,則虛擬復(fù)本存在。否則創(chuàng)建虛擬表(參見上面創(chuàng)建虛擬索引中的步驟1)。步驟3.列出虛擬表上的虛擬索引列出虛擬表上的虛擬索引(參見上面創(chuàng)建虛擬索引中的步驟2)。步驟4.放棄虛擬索引為了放棄一個(gè)虛擬索引,執(zhí)行下面的過程beginpafo.explain_virtual.drop_virtual_index(table_owner,table_name,virtual_index_name)end;表5清除為了放棄一個(gè)具體虛擬表并且在PAFO注冊(cè)表中清除相關(guān)信息,可以執(zhí)行下面的過程beginpafo.explain_virtual.clean_up_table(virtual_table_creator,original_table_owner,original_table_name);end;表6為了放棄所有虛擬表,執(zhí)行下面過程beginpafo.explain_virtual.clean_up_all;end;應(yīng)當(dāng)理解,上述具體實(shí)施例只是為了圖解本發(fā)明的原理,本領(lǐng)域的技術(shù)人員在不偏離本發(fā)明的范圍和宗旨的前提下可以進(jìn)行各種修改。因而本發(fā)明的范圍僅受后面的權(quán)利要求書的范圍的限制。權(quán)利要求1.在數(shù)據(jù)庫(kù)管理系統(tǒng)中觀察一個(gè)查詢的初始優(yōu)化方案的變化的方法,上述查詢具有一個(gè)針對(duì)某個(gè)原始表的引用,上述原始表具有在一個(gè)數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),上述方法包括復(fù)制排除了數(shù)據(jù)的原始表以定義一個(gè)虛擬表;提供一個(gè)與虛擬表相關(guān)的虛擬索引;在查詢中用針對(duì)虛擬表的引用替換針對(duì)原始表的引用;向查詢?cè)黾俞槍?duì)虛擬索引的引用;確定查詢的一個(gè)新優(yōu)化方案;和2.如權(quán)利要求1所述的方法,其中還包括比較新優(yōu)化方案和初始優(yōu)化方案的步驟。3.如權(quán)利要求2所述的方法,其中在比較新優(yōu)化方案和初始優(yōu)化方案之前還包括在新優(yōu)化方案中用針對(duì)原始表的引用替換針對(duì)虛擬表的引用;和向用戶顯示具有針對(duì)原始表的引用的新優(yōu)化方案。4.在數(shù)據(jù)庫(kù)管理系統(tǒng)觀察查詢的初始優(yōu)化方案的變化的方法,上述查詢具有(i)針對(duì)原始表的引用,上述原始表具有在一個(gè)數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù);和(ii)針對(duì)與原始表相關(guān)的原始索引的引用,上述方法包括復(fù)制排除了數(shù)據(jù)的原始表以定義一個(gè)虛擬表;改變?cè)妓饕远x一個(gè)與虛擬表相關(guān)的虛擬索引;確定查詢的一個(gè)新優(yōu)化方案;和5.如權(quán)利要求4所述的方法,其中還包括比較新優(yōu)化方案和初始優(yōu)化方案的步驟。6.如權(quán)利要求5所述的方法,其中在比較新優(yōu)化方案和初始優(yōu)化方案之前還包括在新優(yōu)化方案中分別用針對(duì)原始表和原始索引的引用替換針對(duì)虛擬表和虛擬索引的引用;和向用戶顯示具有針對(duì)原始表和原始索引的引用的新優(yōu)化方案。7.在數(shù)據(jù)庫(kù)管理系統(tǒng)觀察查詢的初始優(yōu)化方案的變化的方法,上述查詢具有(i)針對(duì)原始表的引用,上述原始表具有在一個(gè)數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù);和(ii)針對(duì)與原始表相關(guān)的原始索引的引用,上述方法包括復(fù)制排除了數(shù)據(jù)的原始表以定義一個(gè)虛擬表;在查詢中用針對(duì)虛擬表的引用替換針對(duì)原始表的引用;從查詢中刪除針對(duì)虛擬表的引用;確定查詢的一個(gè)新優(yōu)化方案;和8.如權(quán)利要求7所述的方法,其中還包括比較新優(yōu)化方案和初始優(yōu)化方案的步驟。9.如權(quán)利要求8所述的方法,其中在比較新優(yōu)化方案和初始優(yōu)化方案之前還包括在新優(yōu)化方案中用針對(duì)原始表的引用替換針對(duì)虛擬表的引用;和向用戶顯示具有針對(duì)原始表的引用的新優(yōu)化方案。全文摘要觀察改變數(shù)據(jù)庫(kù)表索引對(duì)諸如SQL語(yǔ)句的數(shù)據(jù)庫(kù)查詢的優(yōu)化方案的影響的方法和裝置創(chuàng)建模擬數(shù)據(jù)庫(kù)中原始表(308)的結(jié)構(gòu)的虛擬表(312)。通過復(fù)制原始表(308)來(lái)創(chuàng)建虛擬表(312),其中排除原始表中的任何數(shù)據(jù)。復(fù)制任何與原始表(308)相關(guān)的現(xiàn)有原始索引(310)以便定義與虛擬表(312)相關(guān)的虛擬索引(314)。查詢中針對(duì)原始表的引用被針對(duì)虛擬表(408)的引用替換。數(shù)據(jù)庫(kù)管理系統(tǒng)則為查詢確定一個(gè)新的優(yōu)化方案(324)。文檔編號(hào)G06F17/30GK1361890SQ00810565公開日2002年7月31日申請(qǐng)日期2000年7月19日優(yōu)先權(quán)日1999年7月20日發(fā)明者愛德華·科斯克尤科,斯利庫(kù)瑪·曼諾,黃-文·沃申請(qǐng)人:計(jì)算機(jī)聯(lián)合思想公司