資源描述:
《基于ORACLE的查詢優(yōu)化.doc》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、基于ORACLE的查詢優(yōu)化一、DBMS查詢規(guī)則查詢優(yōu)化是在查詢執(zhí)行引擎生成一個執(zhí)行策略的過程中,盡量使查詢的總開銷和總時間達(dá)到最小。任何關(guān)系數(shù)據(jù)庫都有一套解決查詢的規(guī)則,而各種關(guān)系數(shù)據(jù)庫查詢的過程稍有所區(qū)別,但是基本的操作思想和過程是一致的。DBMS的查詢規(guī)則一般分為以下幾個過程:語法分析與翻譯處理;查詢優(yōu)化處理;執(zhí)行?;維QL查詢語句語法分析與翻譯結(jié)果輸出相關(guān)數(shù)據(jù)的統(tǒng)計(jì)信息優(yōu)化器執(zhí)行數(shù)據(jù)圖1DBMS查詢規(guī)則圖1.語法分析與翻譯處理查詢處理開始之前6/6,系統(tǒng)必須在擴(kuò)展關(guān)系代數(shù)的基礎(chǔ)上將查詢語句翻譯成可使用的形式,為
2、此這一階段完成兩個主要的功能:一是檢查查詢語句語法的正確性;二是把查詢語句分析成關(guān)系數(shù)據(jù)庫能夠理解的各個組成部分,構(gòu)造該查詢的語法分析樹,并將其翻譯成關(guān)系代數(shù)表達(dá)式。2.查詢優(yōu)化處理查詢優(yōu)化是為查詢選擇最有效的查詢執(zhí)行計(jì)劃的過程。查詢優(yōu)化一方面在關(guān)系代數(shù)級進(jìn)行優(yōu)化,要做的是力圖找出與給定表達(dá)式等價(jià)且執(zhí)行效率最高的一個表達(dá)式。為了在諸多查詢執(zhí)行計(jì)劃中做出選擇,優(yōu)化器必須估計(jì)每個查詢執(zhí)行計(jì)劃的代價(jià)。在沒有真正執(zhí)行查詢計(jì)劃之前,準(zhǔn)確計(jì)算出查詢計(jì)劃的代價(jià)通常是不可能的。因此,優(yōu)化器要利用各關(guān)系的統(tǒng)計(jì)信息,來對計(jì)劃做出最佳估計(jì)。
3、3.執(zhí)行執(zhí)行就是將優(yōu)化器所選擇的執(zhí)行計(jì)劃執(zhí)行,執(zhí)行引擎從相應(yīng)的數(shù)據(jù)庫文件中篩選數(shù)據(jù),將結(jié)果輸出。優(yōu)化器在選取優(yōu)化規(guī)則時,大多數(shù)DBMS(如ORACLE、SYBASE、SQLSERVER等)都是采用基于代價(jià)的優(yōu)化方法,優(yōu)化器從數(shù)據(jù)字典中獲取許多統(tǒng)計(jì)信息,根據(jù)不同的算法估計(jì)出不同查詢規(guī)劃的代價(jià),然后選擇一個較優(yōu)的規(guī)劃。6/6對于ORACLE,在ORACLE7之前,主要是使用基于規(guī)則的優(yōu)化器RULEBASEDOPTIMIZATION(簡稱RBO)。從ORACLE8開始,ORACLE把一個代價(jià)引擎(COSTENGINE)集成到
4、數(shù)據(jù)庫內(nèi)核中,用來估計(jì)每個執(zhí)行計(jì)劃需要的代價(jià),該代價(jià)將每個執(zhí)行計(jì)劃所耗費(fèi)的資源進(jìn)行量化,從而CBO可以根據(jù)這個代價(jià)選擇出最優(yōu)的執(zhí)行計(jì)劃,即基于代價(jià)的優(yōu)化器COSTBASEDOPTIMIZATION(簡稱CBO)。要注意的是:雖然CBO的功能隨著ORACLE新版本的推出,功能越來越強(qiáng),但它不是能包治百病的神藥,否則就不再需要DBA了。由于一系列因素都會影響語句的執(zhí)行,優(yōu)化器綜合權(quán)衡各個因素,在眾多的執(zhí)行計(jì)劃中選擇認(rèn)為是最佳的執(zhí)行計(jì)劃。然而,應(yīng)用設(shè)計(jì)人員通常比優(yōu)化器更知道關(guān)于特定應(yīng)用的數(shù)據(jù)特點(diǎn)。無論優(yōu)化器多么智能,在某些情
5、況下開發(fā)人員能選擇出比優(yōu)化器選擇的最優(yōu)執(zhí)行計(jì)劃還要好的執(zhí)行計(jì)劃,這是需要人工干預(yù)數(shù)據(jù)庫優(yōu)化的主要原因。事實(shí)表明,在某些情況下,確實(shí)需要DBA對某些語句進(jìn)行手工優(yōu)化。二SQL語句優(yōu)化步驟6/6數(shù)據(jù)庫系統(tǒng)的生命周期可分為設(shè)計(jì)、開發(fā)和成品三個階段。在這三個階段都可以提高查詢速度。由于設(shè)計(jì)階段進(jìn)行數(shù)據(jù)庫性能優(yōu)化的成本最低,收益最大,因此在設(shè)計(jì)階段就應(yīng)該選擇合理的數(shù)據(jù)庫設(shè)計(jì)方法。而在數(shù)據(jù)庫系統(tǒng)的開發(fā)和成品階段則需對應(yīng)用程序進(jìn)行優(yōu)化:通常應(yīng)用程序可分為兩個方面——源代碼和SQL語句。源代碼的優(yōu)化由于涉及程序邏輯的改變,因此優(yōu)化源代
6、碼要在時間成本和風(fēng)險(xiǎn)成本上投入較高代價(jià),因此對SQL語句的優(yōu)化尤為重要[3]。調(diào)整現(xiàn)有應(yīng)用程序中SQL語句的最好方法是采取下列步驟[4]:1.熟悉應(yīng)用程序。管理員不僅需要熟悉特定的SQL語句,還需要熟悉應(yīng)用程序的功能和所做的操作。2.使用SQLTRACE工具分析特定SQL語句執(zhí)行的操作,所使用的RDBMS的功能和應(yīng)用程序?qū)@些功能的使用情況。3.在SQLTRACE中使用EXPLAINPLAN命令分析優(yōu)化器執(zhí)行這些SQL語句的方式。下面具體的介紹一下三個步驟:1.熟悉應(yīng)用程序管理員不僅需要了解SQL語句,還需要了解這些S
7、QL語句的執(zhí)行效果。首先,需要將不同的SQL語句形成表格并確定每條SQL6/6語句對數(shù)據(jù)庫中每個表的訪問次數(shù)。這個表以可視化方式告訴管理員用戶對數(shù)據(jù)庫中哪些表的訪問最為頻繁。這個表為管理員確定哪些SQL語句影響了哪些表提供了一個很好的快速參考。管理員還可進(jìn)一步深化這種方法,并將該表中的SQL語句分成不問的類型,比如SELECT語句、INSERT語句、UPDATE語句和DELETE語句等等。如果應(yīng)用程序是在脫離實(shí)際應(yīng)用背景的情況下開發(fā)的,那么這種方法可能是不現(xiàn)實(shí)的。2.使用SQLTRACE分析SQL語句通過在SQL語句上
8、執(zhí)行SQLTRACE工具,管理員可收集到與所有SQL語句執(zhí)行操作有關(guān)的大量極具價(jià)值的信息。SQLTRACE提供了如下一些非常有價(jià)值的信息:(1)解析、執(zhí)行和返回?cái)?shù)據(jù)的次數(shù)(2)CPU時間和執(zhí)行時間(3)物理讀和邏輯讀操作次數(shù)(4)處理的記錄數(shù)量(5)庫緩沖區(qū)錯誤次數(shù)管理員可用這些信息確定哪些SQL語句效率較高,哪些SQL語句效率較