數(shù)據(jù)庫查詢的優(yōu)化的制作方法
【專利摘要】提供一種用于便利優(yōu)化數(shù)據(jù)庫查詢的技術。在一些實施方式中,接收第一查詢,通過在該查詢中檢測指定語法來自動地識別用于優(yōu)化的至少一個場景,然后通過使用與該識別場景對應的預定義的操作來重寫第一查詢以自動地生成第二查詢。
【專利說明】數(shù)據(jù)庫查詢的優(yōu)化
【技術領域】
[0001]本公開一般涉及數(shù)據(jù)庫,更具體地,涉及數(shù)據(jù)庫查詢優(yōu)化。
【背景技術】
[0002]數(shù)據(jù)庫通常包括用于存儲數(shù)據(jù)值的一個或多個數(shù)據(jù)庫表格。為了在數(shù)據(jù)庫中檢索和操縱數(shù)據(jù),用戶、應用程序或遠程系統(tǒng)通常向數(shù)據(jù)庫管理系統(tǒng)(DBMS)發(fā)出數(shù)據(jù)庫查詢。數(shù)據(jù)庫查詢是指用于檢索存儲在數(shù)據(jù)庫中的數(shù)據(jù)的語句、命令或子句的集合。例如,查詢可以在數(shù)據(jù)庫中指定檢索數(shù)據(jù)的特定位置(例如,表格、行或列),或者指定如何聯(lián)接來自多個表格的列。
[0003]在運行之前編譯查詢。在編譯期間,DBMS通常將該查詢解析成為指定如何實現(xiàn)查詢的關系運算符??梢栽凇安樵冇媱潯被颉霸L問計劃”中對關系運算符排序。因為通常存在具有性能變化很大的、大量可供選擇的方法來運行給定查詢,所以DBMS的查詢優(yōu)化器可以估計一些不同的可能計劃并返回它認為的最佳查詢計劃。
[0004]因為查詢優(yōu)化器是非理想的,所以數(shù)據(jù)庫用戶和管理員有時需要人工地檢查并調節(jié)查詢計劃以實現(xiàn)更好的性能。通常提供工具的集合(例如IBM圖形化解釋(VisualExplain))來顯示查詢訪問計劃。一些數(shù)據(jù)庫提供功能"EXPLAIN PLAN (解釋計劃)"以允許用戶預覽和估計由DBMS生成的查詢計劃。還可以提供返回用于運行查詢的成本和時間的“計劃表”。
[0005]然而,EXPLAIN PLAN功能在性能調節(jié)方面不是非常有用。例如,一些數(shù)據(jù)庫可以返回具有許多未知結果(例如,運行時間)的計劃表,使得難以判斷哪個查詢語句產生最有效的查詢計劃。此外,不同的“聯(lián)接”序列會產生導致不同的運行次數(shù)的不同的查詢計劃,該運行時間經常是未知的。
[0006]此外,人工操縱性能調節(jié)會非常耗時和困難。復雜結構化查詢語言(SQL)查詢會需要執(zhí)行不同的調節(jié)方法。在數(shù)據(jù)量改變的可能事件中,將必須重復全部冗長的調節(jié)處理以估計性能變化。此外,不同的數(shù)據(jù)庫具有不同的特性,并且程序員必須熟悉下層數(shù)據(jù)庫的特定特性以便執(zhí)行性能調節(jié)。
[0007]因此,存在對解決上述挑戰(zhàn)的、改善的數(shù)據(jù)庫查詢優(yōu)化框架的需要。
【發(fā)明內容】
[0008]此處描述一種用于便于優(yōu)化數(shù)據(jù)庫查詢的計算機實現(xiàn)技術。在一些實現(xiàn)中,接收第一查詢。通過在第一查詢中檢測指定語法來自動地識別用于優(yōu)化的至少一個場景。然后通過使用與識別的場景對應的預定義的操作重寫第一查詢來自動地生成第二查詢。
[0009]利用將在下文中變得清楚的這些和其它優(yōu)點與特征,通過參照以下詳細描述和權利要求與附圖,可以獲得進一步信息。
【專利附圖】
【附圖說明】[0010]在附圖中示出一些實施例,在附圖中相同的參考標號標明相似的部分,其中:
[0011]圖1是示出示范性系統(tǒng)的框圖;
[0012]圖2是示出通過示范性數(shù)據(jù)庫管理系統(tǒng)的查詢流的框圖;
[0013]圖3示出用于優(yōu)化數(shù)據(jù)庫查詢的示范性方法;
[0014]圖4示出示范性預定義場景和子場景;以及
[0015]圖5示出示范性用戶界面。
【具體實施方式】
[0016]在下面的描述中,為了說明的目的,闡述指定數(shù)目、材料和配置以便提供給出的框架和方法的徹底理解,以及以便滿足法定的書寫描述、實現(xiàn)和最佳的模式要求。然而,本領域技術人員清楚地是,可以在沒有指定示范性細節(jié)的情況下實現(xiàn)給出的框架和方法。在其他情況中,省略或簡化公知的特征以使給出的框架和方法的示范性實施方式的描述清楚,并且從而更好地解釋給出的框架和方法。此外,為便于理解,將某些方法步驟描繪為分開地步驟;然而,這些分開地描繪步驟不應該被看作是依賴其性能的必須的次序。
[0017]此處描述的框架可以實現(xiàn)為方法、計算機控制的裝置、計算機處理、計算系統(tǒng)、或諸如計算機可用介質的制品。從以下描述,這些和各種其他特征將是清楚的。
[0018]圖1示出的框圖示出了可以用來實現(xiàn)此處描述的框架的示范性系統(tǒng)100。系統(tǒng)100可以包括可通信地耦接到輸入設備102(例如,鍵盤、觸摸板、麥克風、照相機等)和輸出設備104 (例如,顯示設備、監(jiān)視器、打印機、揚聲器等)的計算機系統(tǒng)106。計算機系統(tǒng)106還可以包括用于使用通信鏈路130(例如,電話線、無線網絡鏈路、有線網絡鏈路或電纜網)與網絡132交換數(shù)據(jù)的通信卡或設備116 (例如,調制解調器和/或網絡適配器)。網絡132可以是局域網(LAN)或廣域網(WAN)。計算機系統(tǒng)106可以經由網絡132可通信地耦接到一個或多個其他計算機系統(tǒng)154。例如,計算機系統(tǒng)106可以充當服務器并且使用到一個或多個客戶端計算機150的邏輯聯(lián)接而在網絡環(huán)境中操作。
[0019]計算機系統(tǒng)106包括中央處理單元(CPU) 114、輸入/輸出(I/O)單元110和存儲器模塊112。諸如高速緩存、電源、時鐘電路和通信總線之類的其他支持電路也可以包括在計算機系統(tǒng)106中。此外,可以通過專用集成電路補充上述中的任何一個,或者可以通過專用集成電路合并上述中的任何一個。計算機系統(tǒng)106的示例包括能夠以定義的方式響應于并運行指令的手持設備、移動設備、個人數(shù)字助理(PDA)、工作站、服務器、便攜式膝上型計算機、其它便攜式設備、通用微型計算機、大型計算機、存儲系統(tǒng)、專用數(shù)字設備、設備、組件、其他設備,或者這些的一些組合。
[0020]存儲器模塊112可以是任何形式的非臨時性計算機可讀介質,包括但不限于,動態(tài)隨機存取存儲器(DRAM)、靜態(tài)隨機存取存儲器(SRAM)、可擦除可編程只讀存儲器(EPROM)、電可擦除可編程只讀存儲器(EEPROM)、閃速存儲器件、磁盤、內部硬盤、活動磁盤、磁光磁盤、光盤只讀存儲器(CD-ROM)、任何其他易失性的或非易失性存儲器,或者其組合。
[0021]存儲器模塊112用來存儲機器可執(zhí)行指令、數(shù)據(jù)和各種程序,諸如用于實現(xiàn)此處描述的技術的操作系統(tǒng)120、數(shù)據(jù)庫122和數(shù)據(jù)庫管理系統(tǒng)(DBMS) 123,上述的全部都可以由CPU114處理。因而,當運行機器可執(zhí)行指令時計算機系統(tǒng)106是成為特定目的計算機系統(tǒng)的通用計算機系統(tǒng)??商鎿Q地,此處描述的各種技術可以實現(xiàn)為通過操作系統(tǒng)120運行的軟件產品的部分。可以以高級程序或面向對象的程序設計語言(例如,C、C++、Java等)實現(xiàn)每個計算機程序,或者如果期望則以匯編或機器語言實現(xiàn)每個計算機程序。該語言可以是編譯或解釋語言。機器可執(zhí)行指令不意指局限于任一特定程序設計語言及其實現(xiàn)。將理解的是,各種編程語言及其編碼可以用來實現(xiàn)此處包含的公開的教導。
[0022]在一個實施方式中,數(shù)據(jù)庫122包括至少一個數(shù)據(jù)庫表格。數(shù)據(jù)庫表格可以存儲在隨機存取存儲器或大容量存儲器單元中。此外,一個或多個索引表可以提供以提高訪問數(shù)據(jù)庫表格的速度。數(shù)據(jù)庫表格可以包括用于數(shù)目為N的數(shù)據(jù)字段的N+1列,其中一個列用于存儲密鑰。每行構成一個記錄,并且該行中的密鑰可以用來訪問來自數(shù)據(jù)庫表格的各個記錄。索引表可以將至少一個數(shù)據(jù)字段的數(shù)據(jù)值關聯(lián)到包含用于該數(shù)據(jù)字段的給定數(shù)據(jù)值的記錄的密鑰。
[0023]數(shù)據(jù)庫表格可以是面向列或面向行的。通過將一個列的數(shù)據(jù)值、然后下一列的數(shù)據(jù)值等等串行化來存儲面向列的數(shù)據(jù)庫表格。相反地,面向行的數(shù)據(jù)庫表格存儲為數(shù)據(jù)行的分段(section)。數(shù)據(jù)庫表格的組織通常影響為了優(yōu)化性能而生成或選擇的查詢計劃的類型。
[0024]DBMS 123包括用于定義、管理和處理數(shù)據(jù)庫122的程序的集合??蛻舳擞嬎銠C150處的用戶可以與用戶界面152交互以經由DBMS 123與數(shù)據(jù)庫122通信。用戶和DBMS 123可以通過用戶界面152交換交易消息。例如,用戶可以向DBMS 123發(fā)送查詢,而DBMS 123可以使用數(shù)據(jù)庫122處理該查詢。當事務完成時,例如,DBMS 123以結果命中列表的形式向用戶發(fā)送結果。
[0025]將理解地是,計算機系統(tǒng)106的不同的組件可以位于不同的機器上。例如,數(shù)據(jù)庫122和DBMS 123可以存在于不同的物理機器中。還將理解地是,客戶端計算機150的不同的組件也可以位于計算機系統(tǒng)106中。
[0026]圖2是示出了通過示范性DBMS 123的查詢流200的框圖??梢酝ㄟ^計算機程序代碼配置圖1的計算機系統(tǒng)106以實現(xiàn)由流200表示的處理。
[0027]在一個實施方式中,DBMS 123包括查詢分析器202、查詢優(yōu)化器204和查詢專家206。查詢分析器202從用戶界面152接收至少一個第一查詢。第一查詢可以包括用于訪問、修改、追加或操縱存儲在數(shù)據(jù)庫122中的數(shù)據(jù)的命令和/或子句的集合,并且第一查詢可以符合標準語法或查詢語言,諸如結構化查詢語言(SQL)、SQLScript或任何其他語言。例如,它們可以指定數(shù)據(jù)庫122中的特定位置(例如,數(shù)據(jù)庫、表格、列或行)、對將要包括在查詢結果中的特定數(shù)據(jù)記錄必須適用的搜索標準、聚合方法、子查詢、聯(lián)接操作等等。
[0028]查詢分析器202解析文本并執(zhí)行第一查詢的建設性(constructive)分析。查詢分析器202可以除去冗余數(shù)據(jù)或執(zhí)行錯誤檢查,諸如驗證第一查詢的語法、確認表格當中的關系等。此外,查詢分析器202可以將第一查詢轉換成為結構化對象,諸如二叉樹數(shù)據(jù)結構或任何其他合適的數(shù)據(jù)結構。例如,結構化對象可以包含具有有意義語法的查詢的分段,諸如填充的列名稱,使用的計算方法,分類字段,聯(lián)接條件等。
[0029]查詢優(yōu)化器204從查詢分析器202接收結構化對象并且自動地重寫第一查詢以生成第二查詢。類似于第一查詢,第二查詢也可以符合定義的查詢語言(例如,SQL、SQLScript)。第二查詢產生對于下層數(shù)據(jù)庫122最有效的查詢計劃。例如,可以基于指定行為的先驗知識和下層數(shù)據(jù)庫122的特性來確定產生的查詢計劃。在一個實施方式中,通過對于優(yōu)化第一查詢識別屬于哪個場景,并且執(zhí)行相應的優(yōu)化操作以重寫第一查詢來生成第二查詢,如稍后將更詳細描述的??梢曰谙聦訑?shù)據(jù)庫的特性預定義相應的操作。
[0030]查詢優(yōu)化器204使第二查詢傳遞到查詢專家(query advisor) 206。查詢專家206可以生成一個或多個建議(或注釋),該建議(或注釋)推薦通過用戶的進一步的動作以利用第二查詢產生更好的性能。這種建議在系統(tǒng)級、整體級或數(shù)據(jù)庫管理級,而不是語句級提供推薦。例如,該建議可以向用戶提供關于如何修改環(huán)境或模式以改善性能的建議,諸如除去用于特定表格中的指定列的壓縮等。
[0031]通過查詢專家206生成的第二查詢和/或任一建議可以通過用戶界面152呈現(xiàn)給用戶。然后,用戶可以依照期望完成任一修改,并且相對于數(shù)據(jù)庫122運行修改的第二查詢以訪問和操縱存儲在其中的數(shù)據(jù)。不同于提供“EXPLAIN”功能以便程序員可以預覽和監(jiān)視用于性能調節(jié)的查詢計劃的傳統(tǒng)方法,本公開的框架自動地生成適合下層數(shù)據(jù)庫的指定特征或特性的優(yōu)化的查詢語句。通過提供基于下層數(shù)據(jù)庫的指定特性的先驗知識來預定義的優(yōu)化功能的集合以實現(xiàn)此功能。
[0032]不熟悉下層數(shù)據(jù)庫的程序員現(xiàn)在能夠通過給出的框架容易地和有效地優(yōu)化查詢。由于不需要用戶的專門知識或先前經驗用于性能調節(jié),所以提供該附加的優(yōu)點使得新數(shù)據(jù)庫產品被市場更廣泛地接受。當數(shù)據(jù)量變化時,全部用戶需要做的是輸入第一查詢并且利用通過本框架輸出的修改的第二查詢,而不必須重新人工地執(zhí)行冗長的和困難的性能調節(jié)處理。
[0033]圖3示出用于優(yōu)化數(shù)據(jù)庫查詢的示范性方法300??梢酝ㄟ^計算機系統(tǒng)106實現(xiàn)示范性方法300,如參照圖1先前描述的。
[0034]在302,查詢優(yōu)化器204接收第一查詢。例如,第一查詢可以以結構化對象、或由查詢分析器202生成的任一其他數(shù)據(jù)結構的形式。第一查詢可以包括語言元素的集合,諸如子句、表達式、謂語、詢問等。在SQL語言中,例如,JOIN子句組合來自數(shù)據(jù)庫中的兩個或多個表格的記錄。
[0035]在304,查詢優(yōu)化器204分析第一查詢并且基于第一查詢的語法自動地識別用于優(yōu)化的至少一個場景。場景是指可以通過重寫而對于下層數(shù)據(jù)庫被優(yōu)化的查詢的類型。每個場景可以包括子場景。在一個實施方式中,基于使用的查詢語言的特定語法預定義每個場景。每個場景和/或子場景可以映射到用于重寫第一查詢的相應的功能模塊或預定義的操作。
[0036]圖4示出用于優(yōu)化的預定義的場景(402a_d)和子場景(406a_d)。應該理解地是,本公開的框架不局限于此示出的場景,或者SQL查詢語言。例如,可以提供大于4個預定義的場景,或者可以基于使用的指定查詢語言來預定義其他類型的場景。
[0037]如所示,預定義的場景(402a_d)可以包括Join (聯(lián)接)、Dynamic SQL (動態(tài)SQL)、Sub-query (子查詢)和Other (其它)場景。可以通過檢測第一查詢中的指定語法來識別預定義的場景。例如,通過檢測第一查詢中的JOIN子句來識別“Join”場景??梢酝ㄟ^檢測子句“execO ”來識別“Dynamic SQL”場景。附加地,可以通過檢測嵌套在至少一個SELECT(選擇)、INSERT (插入)、UPDATE (更新)或DELETE (刪除)語句、或另一子查詢內的SELECT子句來識別“Sub-query (子查詢)”場景。“Other”場景組合不屬于其它3個主場景的各種雜項的子場景。[0038]反過來參考圖3,在306,查詢優(yōu)化器204確定場景是否命中。如果相應的功能模塊可以用來重寫和優(yōu)化第一查詢,則該場景命中。如果沒有找到功能模塊,則處理300在312繼續(xù)以檢查是否存在另一將要處理的場景。如果找到相應的功能模塊,則處理300在308繼續(xù)以通過重寫第一查詢來生成第二查詢。
[0039]每個功能模塊實現(xiàn)一個或多個預定義的操作以自動地生成第二查詢。第二查詢功能上等效于第一查詢(即,返回相同的結果),但是以更有效的方式(例如,更快速和需要更少資源)來訪問或操縱下層數(shù)據(jù)庫中的信息。在一個實施方式中,基于數(shù)據(jù)庫的指定類型(例如,面向列或面向行)的特定特性、或者數(shù)據(jù)庫或數(shù)據(jù)庫管理系統(tǒng)的指定實現(xiàn)(例如,SAP HANA,Sybase IQ、微軟SQL等)的先驗知識來定制功能模塊??商鎿Q地,功能模塊可以被設計為一般可應用于大部分或各種數(shù)據(jù)庫或數(shù)據(jù)庫管理系統(tǒng)(例如,面向行或面向列兩者)。用戶界面152可以向用戶提供選項以選擇是否使用數(shù)據(jù)庫專用功能模塊或一般通用的功能模塊。
[0040]本框架的一個實施方式提供用于優(yōu)化被分類為“Join”場景的第一查詢的第一功能模塊。如圖4所示,“Join”場景可以進一步被劃分成示范性子場景:Type(類型)、Sequence(序列)、Condition (條件)。將理解地是,還可以提供其他類型的子場景。
[0041]第一功能模塊可以通過重寫“Type”子場景查詢以改變“Join”類型來優(yōu)化“Type”子場景查詢。一般存在四個類型的“ Join”查詢:Inner (內)、Outer (外)、Leftand Right(左和右)?!癐nner Join (內聯(lián)接)”可以轉換成等效的“Outer Join (外聯(lián)接)”,反之亦然。
[0042]例如,典型的“Inner Join”查詢如下:
[0043]SELECT VBELN, POSNR FROM VBAP_ST1
[0044]INNER JOIN VBAP T2 ON Tl.MAND=T2.MANDT AND
[0045]Tl.VBELN=T2.VBELN AND Tl.P0SNR=T2.POSNR;
[0046]這種“Inner Join”查詢語句可以重寫為等效的“Left Outer Join (左外聯(lián)接)”語句以提高性能,如下:
[0047]SELECT VBELN, POSNR FROM VBAP_ST1
[0048]LEFT OUTER JOIN VBAP T2 ON Tl.MAND=T2.MANDT
[0049]AND Tl.VBELN=T2.VBELN AND Tl.P0SNR=T2.POSNR;
[0050]在其他情況中,“Left Outer Join”或“Right Outer Join (右外聯(lián)接)”還可以重寫為等效的“Inner Join”以便改善數(shù)據(jù)庫訪問的速度。取決于下層數(shù)據(jù)庫的指定特性,其他類型的“Join”查詢語句也可以被重寫以提高數(shù)據(jù)庫性能。
[0051]可以通過重新排列查詢中的“Join”語句的次序來優(yōu)化“Sequence”子場景查詢。如果“Join”語句被不同地排序,則一些數(shù)據(jù)庫生成不同的查詢計劃。因而,期望以特定順序重新排列“Join”語句的次序以便優(yōu)化下層數(shù)據(jù)庫的性能。
[0052]例如,利用多個“Inner Join”語句的典型的查詢如下:
[0053]
【權利要求】
1.一種數(shù)據(jù)庫查詢優(yōu)化的方法,包括: (a)接收第一查詢; (b)由計算機通過在第一查詢中檢測指定語法來自動地識別用于優(yōu)化的至少一個場景;以及 (C)由計算機通過使用與識別的場景對應的預定義的操作來重寫第一查詢以自動地生成第二查詢。
2.如權利要求1所述的方法,其中所述第一查詢和第二查詢包括結構化查詢語言(SQL)查詢。
3.如權利要求1所述的方法,其中所述第一查詢包括通過查詢分析器生成的結構化對象。
4.如權利要求1所述的方法,其中所述場景包括“Join(聯(lián)接)”場景。
5.如權利要求4所述的方法,其中所述預定義的操作包括改變第一查詢的“Join”類型。
6.如權利要求5所述的方法,其中改變所述“Join”類型包括將第一查詢從“InnerJoin (內聯(lián)接)”形式轉 換為等效的“Outer Join (外聯(lián)接)”形式。
7.如權利要求5所述的方法,其中改變所述“Join”類型包括將第一查詢從“OuterJoin (外聯(lián)接)”形式轉換為等效的“Inner Join (內聯(lián)接)”形式。
8.如權利要求4所述的方法,其中所述預定義的操作包括重新排列第一查詢中的“Join” 語句。
9.如權利要求8所述的方法,其中重新排列所述“Join”語句包括重新排列“InnerJoin”語句以使得處于相同的業(yè)務級別的表格位于相鄰位置。
10.如權利要求8所述的方法,其中重新排列所述“Join”語句包括將“InnerJoin”語句排序在“Left Outer Join (左外聯(lián)接)”語句之前。
11.如權利要求4所述的方法,其中所述預定義的操作包括改變“Join”語句中的一個或多個條件。
12.如權利要求4所述的方法,其中所述預定義的操作包括將第一查詢從循環(huán)形式轉換到等效的非循環(huán)形式。
13.如權利要求1所述的方法,其中所述場景包括“DynamicSQL (動態(tài)SQL)”場景。
14.如權利要求13所述的方法,其中所述預定義的操作包括將第一查詢從動態(tài)SQL形式轉換到非動態(tài)SQL形式。
15.如權利要求13所述的方法,其中所述預定義的操作包括使用臨時數(shù)據(jù)結構將第一查詢分開成為兩個或多個部分。
16.如權利要求13所述的方法,其中所述預定義的操作包括將第一查詢中的數(shù)據(jù)依賴性分開成為兩個或多個不同的存儲過程。
17.如權利要求1所述的方法,其中所述場景包括“Sub-query(子查詢)”場景。
18.如權利要求17所述的方法,其中所述預定義的操作包括將“Where”子句從第一查詢的子查詢語句中移出或移入到第一查詢的子查詢語句中。
19.如權利要求1所述的方法,還包括基于第一查詢生成一個或多個建議。
20.一種具有存儲在其上的程序代碼的非臨時性計算機可讀介質,所述程序代碼由計算機執(zhí)行以進行下述步驟: 接收第一查詢; 通過在第一查詢中檢測指定語法來自動地識別用于優(yōu)化的至少一個場景;以及 通過使用與該識別情形對應的預定義的操作來重寫第一查詢以自動地生成第二查詢。
21.—種系統(tǒng),包括: 非臨時性存儲設備,用于存儲計算機可讀程序代碼;以及 與存儲設備通信的處理器,該處理器利用計算機可讀程序代碼可操作以進行如下步驟: 接收第一查詢; 通過在第一查詢中檢測指定語法來自動地識別用于優(yōu)化的至少一個場景;以及 通過使用與該識別情形對應的預 定義的操作來重寫第一查詢以自動地生成第二查詢。
【文檔編號】G06F17/30GK103714058SQ201210369839
【公開日】2014年4月9日 申請日期:2012年9月28日 優(yōu)先權日:2012年9月28日
【發(fā)明者】陳穎宇, 徐繪新 申請人:Sap股份公司