趙新民+++崔海艷
【摘要】針對(duì)Oracle數(shù)據(jù)庫性能受到SQL語句制約的問題,本文針對(duì)SQL語句的優(yōu)化要點(diǎn)進(jìn)行了分析。首先詳細(xì)描述了Oracle優(yōu)化器,給出了影響執(zhí)行計(jì)劃的因素;其次對(duì)SQL語句可優(yōu)化的類型進(jìn)行了總結(jié)分析,并詳細(xì)分析了優(yōu)化的規(guī)則,舉出了SQL實(shí)例進(jìn)行比較。本文對(duì)于系統(tǒng)維護(hù)人員和數(shù)據(jù)庫分析師都具有一定的積極作用。
【關(guān)鍵詞】Oracle;數(shù)據(jù)庫;SQL
1引言
隨著信息化進(jìn)程的不斷加快,數(shù)據(jù)庫的應(yīng)用越來越廣泛,信息系統(tǒng)的優(yōu)劣與數(shù)據(jù)庫系統(tǒng)的性能有著直接的關(guān)聯(lián)。隨著數(shù)據(jù)庫規(guī)模的不斷擴(kuò)大,如何保持?jǐn)?shù)據(jù)庫應(yīng)用系統(tǒng)高效地運(yùn)行,受到人們?cè)絹碓蕉嗟年P(guān)注。
2優(yōu)化器
對(duì)于信息管理系統(tǒng)來說,其最關(guān)鍵的核心是數(shù)據(jù)庫系統(tǒng),對(duì)于眾多的應(yīng)用系統(tǒng)來說,查詢操作在整個(gè)系統(tǒng)中占據(jù)著相當(dāng)大的比重,也就是說,查詢速度的快慢直接影響著信息管理系統(tǒng)的性能。當(dāng)數(shù)據(jù)庫的規(guī)模越大,這個(gè)特性表現(xiàn)的越明顯,良好的查詢語句對(duì)系統(tǒng)性能的提高起著積極的作用。
2.1Oracle優(yōu)化器
無論SQL語句的性能如何,最終都要在Oracle數(shù)據(jù)庫中執(zhí)行,Oracle數(shù)據(jù)庫在執(zhí)行SQL語句之前,首先通過優(yōu)化器利用初始化的參數(shù),并利用指定的優(yōu)化方法對(duì)執(zhí)行計(jì)劃進(jìn)行分析,并執(zhí)行。
當(dāng)前,Oracle優(yōu)化器主要有RBO和CBO兩種優(yōu)化方式。其中RBO是基于規(guī)則的優(yōu)化器,根據(jù)訪問的路徑和訪問路徑的等級(jí)去選擇SQL語句的執(zhí)行計(jì)劃,假如一條SQL語句有多個(gè)路徑可以通過,Oralce會(huì)自動(dòng)選擇等級(jí)最低的訪問路徑。RBO優(yōu)化器僅含有幾條在小表上低效利用的索引,無形之中增加了I/O,該優(yōu)化方式效率相對(duì)較低;CBO是基于代價(jià)的優(yōu)化器,其成本主要由可用訪問路徑、嵌入的提示、對(duì)象的統(tǒng)計(jì)信息等組成,CBO會(huì)選擇成本代價(jià)最低的執(zhí)行計(jì)劃。當(dāng)前,CBO優(yōu)化器成為Oracle數(shù)據(jù)庫優(yōu)化的主要組成,CBO的構(gòu)成如圖1所示。
利用Oracle優(yōu)化器對(duì)SQL語句進(jìn)行分析,在所有的查詢中,有一半經(jīng)過RBO優(yōu)化之后,執(zhí)行的速度會(huì)快一點(diǎn),而另一半則由CBO優(yōu)化后,執(zhí)行的速度最快。從Oracle8i版本以后,RBO優(yōu)化已經(jīng)不再發(fā)展RBO。
2.2影響執(zhí)行計(jì)劃的因素
影響執(zhí)行計(jì)劃的因素較多,總結(jié)起來主要有幾種。
(1)連接順序。當(dāng)前,數(shù)據(jù)庫進(jìn)行數(shù)據(jù)查詢,大部分情況下都需要由若干表連接,一般采取將查詢結(jié)果只有一行記錄的表優(yōu)先。
(2)訪問路徑。對(duì)于路徑的掃描,Oracle優(yōu)化器的方式有簇掃描、索引掃描、行ID掃描、全表掃描、散列掃描等。由于Oracel數(shù)據(jù)庫對(duì)I/O的評(píng)估原則是“塊”在整個(gè)表中所占的比例來確定選取何種掃描路徑。
(3)連接方式。查詢優(yōu)化的重點(diǎn)是連接操作,內(nèi)表與外表之間進(jìn)行連接的算法主要有歸并連接、散列連接及嵌套循環(huán)連接,每種連接都有其自己的優(yōu)點(diǎn)。
(4)成本估算。其成本的代價(jià)主要從I/O、CPU和通信三方面進(jìn)行考慮,其中I/O是最主要的。在成本估算中占的比重最大。
3優(yōu)化SQL語句
3.1可優(yōu)化的SQL語句類型
優(yōu)化器可以優(yōu)化SQL語句的類型主要有幾種。
(1)簡(jiǎn)單語句。對(duì)于數(shù)據(jù)表的操作,主要的操作動(dòng)作有select、update、insert及delete語句,這種類型的語句主要包括from和where。一般來說,可以優(yōu)化的地方主要在where中。其影響效率的問題主要集中在幾個(gè)方面:分組或排序過程中包含了過多的中間結(jié)果集、對(duì)索引的列使用了全表掃描。
(2)連接語句。利用多個(gè)表相結(jié)合的方式查找相關(guān)的數(shù)據(jù)信息,這也是數(shù)據(jù)庫最常用的方法,由from子句實(shí)現(xiàn)多個(gè)表的連接,利用where將相關(guān)的條件進(jìn)行關(guān)聯(lián)。其影響效率的問題主要集中在幾個(gè)方面:表連接順序不是最優(yōu)、分組或排序過程包含了過多的中間結(jié)果集、索引列使用了全表掃描等。
(3)外部連接。該方式與連接語句有相同之處,同樣涉及到多表連接的問題。其影響效率的問題也與連接語句相近。
(4)復(fù)雜語句。對(duì)于select、update、insert及delete語句中的子查詢以select形式存在。該方式的問題是內(nèi)部查詢的效率對(duì)外部查詢的效率有影響。
(5)復(fù)雜查詢。利用組操作符將若干簡(jiǎn)單語句結(jié)合起來形成的語句,一般情況下,將語句拆分為上述的四種類型的語句之后再進(jìn)行優(yōu)化處理。
對(duì)于查詢問題的分析,主要是要盡可能地減少子查詢或者使用子查詢返回的結(jié)果集要盡量地減少。
3.2優(yōu)化的規(guī)則
(1)在索引列字段上盡可能地避免使用“!=”、“NULL”、“<>”及“not”等符號(hào),盡可能地不要使用隱式類型的轉(zhuǎn)換。這些符號(hào)的使用可能會(huì)對(duì)索引信息造成影響,進(jìn)行轉(zhuǎn)變?yōu)槿頀呙?,影響了?shù)據(jù)庫的性能。
(2)盡可能地不要使用“select * from 表名”?!?”符號(hào)代表需要返回所有列,就意味著要掃描所有的返回記錄,收取所有的列名與列值。使Oracle不斷地進(jìn)行磁盤的讀取及交換。如果需要,將“*”換成具體的列名。
(3)避免在索引列字段中使用改變列的函數(shù)。當(dāng)函數(shù)改變了索引列的類型及內(nèi)容時(shí),可能使原來可以使用的索引值變得無法繼續(xù)使用,從而影響了系統(tǒng)的效率。
(4)綁定變量進(jìn)行傳值。綁定變量進(jìn)行傳值與數(shù)據(jù)庫收到語句解析后的內(nèi)容是一致的,Oracle可以在下一條語句到來時(shí)直接存入緩存并執(zhí)行,不必再進(jìn)行解析和生成執(zhí)行過程。
(5)合理建立索引。良好的索引機(jī)制,可以使系統(tǒng)查詢速度更快。
(6)利用where代替having子句。where子句是在分組之前對(duì)條件進(jìn)行篩選,而Having是分組后進(jìn)行篩選,分組前篩選可以有效減少分組的時(shí)間和資源的消耗。endprint
比較下面兩個(gè)SQL語句:
語句A:select name , num from department where num not in (select num from school);
語句B:select name,num from department where not exists(select num from school where department.num=school.num)。
通過在數(shù)據(jù)庫中執(zhí)行這兩條語句,其結(jié)果是相同的,執(zhí)行語句A時(shí),Oracle首先對(duì)school表進(jìn)行整個(gè)掃描,沒有在school上建立num索引,語句B使用了聯(lián)合查詢,對(duì)school表進(jìn)行部分掃描,利用了num列的索引。語句B的效率要高于語句A。
4結(jié)束語
本文對(duì)Oracle數(shù)據(jù)庫的SQL語句優(yōu)化要點(diǎn)進(jìn)行了分析,由于篇幅所限,并沒有給出具體的數(shù)據(jù)庫系統(tǒng),只給出了兩個(gè)SQL語句的比較。有興趣的讀者,可以在本文的基礎(chǔ)上,對(duì)數(shù)據(jù)庫管理系統(tǒng)中的SQL語句進(jìn)行優(yōu)化處理操作,以達(dá)到提高系統(tǒng)效率的目的。
參考文獻(xiàn)
[1] 趙夢(mèng)勤,李秀蘭.Oracle數(shù)據(jù)庫應(yīng)用系統(tǒng)的優(yōu)化策略.計(jì)算機(jī)工程與應(yīng)用,2003,(27):213-215.
[2] 王能斌著.數(shù)據(jù)庫系統(tǒng)原理(2000).北京:電子工業(yè)出版社,2001.
[3] Edward Whalen, Mitchell Schroeter 著;高艷春,周兆確,唐艷軍譯.Oracle 性能調(diào)整與優(yōu)化(第一版).北京:人民郵電出版社,2002.
[4] 王曉春,趙霧,張巖.Windows 平臺(tái)上 Oracle 數(shù)據(jù)庫的系統(tǒng)性能優(yōu)化.計(jì)算機(jī)工程,2004,30(09):79-81.
[5] 鄭謙益,居梯.Sybase SQL Server性能優(yōu)化技術(shù)及其應(yīng)用研究.微機(jī)發(fā)展,2003,(01):31-33.
作者簡(jiǎn)介:
趙新民(1974-),男,沈陽師范學(xué)院,大學(xué)本科,法學(xué)學(xué)士,現(xiàn)就職于中國聯(lián)通赤峰分公司信息化服務(wù)中心,從事系統(tǒng)維護(hù)、網(wǎng)絡(luò)維護(hù)、數(shù)據(jù)庫操作方面工作。
崔海艷(1975-),女,長春郵電學(xué)院,大學(xué)本科,學(xué)士學(xué)位,現(xiàn)就職于中國聯(lián)通赤峰分公司信息化服務(wù)中心,從事系統(tǒng)維護(hù)、網(wǎng)絡(luò)維護(hù)、數(shù)據(jù)庫操作方面工作。endprint