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