基于Oracle數(shù)據(jù)庫的SQL語句優(yōu)化
摘 要: 通過分析Oracle數(shù)據(jù)庫執(zhí)行SQL語句的過程,采用比較SQL語句優(yōu)化之前和優(yōu)化之后的執(zhí)行時間和調(diào)用的數(shù)據(jù)塊數(shù)量方法來判斷優(yōu)化效果,最后得到消耗時間少和調(diào)用數(shù)據(jù)塊少的SQL語句。
關(guān)鍵詞: Oracle數(shù)據(jù)庫;優(yōu)化;優(yōu)化器;索引
隨著信息化技術(shù)在各行業(yè)的廣泛應(yīng)用,Oracle數(shù)據(jù)庫也越來越多地被使用到很多關(guān)鍵領(lǐng)域,成為國內(nèi)高端數(shù)據(jù)庫市場的主流產(chǎn)品和眾多行業(yè)信息化系統(tǒng)的主要支柱。如何充分利用Oracle的各種功能來提高數(shù)據(jù)庫的可用性,如何提高數(shù)據(jù)庫的數(shù)據(jù)查詢響應(yīng)時間以及如何診斷數(shù)據(jù)庫出現(xiàn)的問題已經(jīng)成為不斷提高Oracle應(yīng)用水平和提高Oracle數(shù)據(jù)庫應(yīng)用系統(tǒng)性能的關(guān)鍵[1]。
1 SQL查詢過程及優(yōu)化器
1.1 SQL查詢語句的執(zhí)行過程[2]
查詢優(yōu)化最重要的就是對SQL語句進行優(yōu)化。調(diào)整SQL對性能的改善要比調(diào)整其他方面明顯得多。理解SQL語句的執(zhí)行過程有助于更好地對其進行優(yōu)化。SQL語句在Oracle中是自動執(zhí)行的,絕大多數(shù)用戶不需要關(guān)心各個階段的執(zhí)行細節(jié)。但是,對執(zhí)行的各個階段的了解會有助于快速找到性能低下的SQL語句,幫助書寫出更高效的SQL語句,進而解決問題。幾乎所有的SQL語句都分為語法分析、執(zhí)行、讀取數(shù)據(jù)三大階段進行處理[3]。SQL查詢語句的執(zhí)行過程如圖1所示。
1.2 Oracle查詢優(yōu)化器[4]
SQL是一種非過程化的語言,用戶只需要發(fā)送取出數(shù)據(jù)的命令,對于數(shù)據(jù)的取出方式(如是通過索引還是全表掃描),則由數(shù)據(jù)庫的優(yōu)化器決定。Oracle的優(yōu)化器用來決定SQL訪問數(shù)據(jù)的有效路徑,使語句執(zhí)行所需要的開銷最小。在Oracle的發(fā)展過程中,一共開發(fā)過兩類優(yōu)化器:基于規(guī)則的優(yōu)化器和基于成本的優(yōu)化器。它們之間的不同之處主要在于取得代價的方法與衡量代價的大小不同。
1.3 SQL查詢語句的執(zhí)行計劃
Oracle要實現(xiàn)許多步驟才能完成SQL查詢語句的執(zhí)行,優(yōu)化器將這些步驟組合在一起稱為SQL查詢語句的執(zhí)行計劃。從執(zhí)行計劃中可以看出數(shù)據(jù)庫是如何執(zhí)行查詢語句的,判斷出查詢語句的執(zhí)行是否高效,從而制定查詢的優(yōu)化方案。獲取執(zhí)行計劃的方法有以下兩種:(1)用Explain plan命令對語句的執(zhí)行過程的一些信息進行統(tǒng)計,Explain plan用來顯示優(yōu)化器使用的執(zhí)行計劃而不實際運行查詢;(2)用Set Autotrace動態(tài)查看每個SQL語句的執(zhí)行計劃,Autotrace可以查看會話中每個SQL語句的執(zhí)行計劃。SQL自動地進行Explain plan的工作,不用維護plan table表,因此使用非常方便。
2 系統(tǒng)優(yōu)化措施
以具體的實例來說明系統(tǒng)優(yōu)化問題以及調(diào)整方法。在某電子產(chǎn)品售后服務(wù)系統(tǒng)中,為加強對售后維修點備件使用情況的精確管理,庫房發(fā)貨人員對出庫的每件備件粘貼一個唯一的一式兩聯(lián)條碼,一聯(lián)粘貼在發(fā)出的好備件上,另一聯(lián)粘貼到從用戶那里返回的壞備件上。發(fā)貨業(yè)務(wù)和備件條碼管理有關(guān)的E-R圖如圖2所示。
這個系統(tǒng)中有一個查詢出庫信息詳單的視圖,該視圖在系統(tǒng)運行初期的查詢速度較快,但隨著時間推移,數(shù)據(jù)量增加,其中有些表的數(shù)據(jù)量已達20萬行以上,導致該視圖的查詢速度明顯變慢,而由于資金等各方面的原因,短期內(nèi)很難從硬件方面對系統(tǒng)進行升級。因此決定在其運行的Oracle 9i平臺上進行優(yōu)化。在進行優(yōu)化前,該視圖的查詢時間為1′07″左右,運行的硬件環(huán)境為:P42.66、IGB內(nèi)存、240 GB普通IDE硬盤。在SQL*Plus中優(yōu)化前的運行時間如圖3所示。