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