《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > 基于Oracle數(shù)據(jù)庫的SQL語句優(yōu)化
基于Oracle數(shù)據(jù)庫的SQL語句優(yōu)化
來源:微型機(jī)與應(yīng)用2011年第21期
李展?jié)苡⒅?/div>
(桂林理工大學(xué) 信息科學(xué)與工程學(xué)院,廣西 桂林 541004)
摘要: 通過分析Oracle數(shù)據(jù)庫執(zhí)行SQL語句的過程,采用比較SQL語句優(yōu)化之前和優(yōu)化之后的執(zhí)行時間和調(diào)用的數(shù)據(jù)塊數(shù)量方法來判斷優(yōu)化效果,最后得到消耗時間少和調(diào)用數(shù)據(jù)塊少的SQL語句。
Abstract:
Key words :

摘  要: 通過分析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語句進(jìn)行優(yōu)化。調(diào)整SQL對性能的改善要比調(diào)整其他方面明顯得多。理解SQL語句的執(zhí)行過程有助于更好地對其進(jìn)行優(yōu)化。SQL語句在Oracle中是自動執(zhí)行的,絕大多數(shù)用戶不需要關(guān)心各個階段的執(zhí)行細(xì)節(jié)。但是,對執(zhí)行的各個階段的了解會有助于快速找到性能低下的SQL語句,幫助書寫出更高效的SQL語句,進(jìn)而解決問題。幾乎所有的SQL語句都分為語法分析、執(zhí)行、讀取數(shù)據(jù)三大階段進(jìn)行處理[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í)行計(jì)劃
 Oracle要實(shí)現(xiàn)許多步驟才能完成SQL查詢語句的執(zhí)行,優(yōu)化器將這些步驟組合在一起稱為SQL查詢語句的執(zhí)行計(jì)劃。從執(zhí)行計(jì)劃中可以看出數(shù)據(jù)庫是如何執(zhí)行查詢語句的,判斷出查詢語句的執(zhí)行是否高效,從而制定查詢的優(yōu)化方案。獲取執(zhí)行計(jì)劃的方法有以下兩種:(1)用Explain plan命令對語句的執(zhí)行過程的一些信息進(jìn)行統(tǒng)計(jì),Explain plan用來顯示優(yōu)化器使用的執(zhí)行計(jì)劃而不實(shí)際運(yùn)行查詢;(2)用Set Autotrace動態(tài)查看每個SQL語句的執(zhí)行計(jì)劃,Autotrace可以查看會話中每個SQL語句的執(zhí)行計(jì)劃。SQL自動地進(jìn)行Explain plan的工作,不用維護(hù)plan table表,因此使用非常方便。
2 系統(tǒng)優(yōu)化措施
 以具體的實(shí)例來說明系統(tǒng)優(yōu)化問題以及調(diào)整方法。在某電子產(chǎn)品售后服務(wù)系統(tǒng)中,為加強(qiáng)對售后維修點(diǎn)備件使用情況的精確管理,庫房發(fā)貨人員對出庫的每件備件粘貼一個唯一的一式兩聯(lián)條碼,一聯(lián)粘貼在發(fā)出的好備件上,另一聯(lián)粘貼到從用戶那里返回的壞備件上。發(fā)貨業(yè)務(wù)和備件條碼管理有關(guān)的E-R圖如圖2所示。
這個系統(tǒng)中有一個查詢出庫信息詳單的視圖,該視圖在系統(tǒng)運(yùn)行初期的查詢速度較快,但隨著時間推移,數(shù)據(jù)量增加,其中有些表的數(shù)據(jù)量已達(dá)20萬行以上,導(dǎo)致該視圖的查詢速度明顯變慢,而由于資金等各方面的原因,短期內(nèi)很難從硬件方面對系統(tǒng)進(jìn)行升級。因此決定在其運(yùn)行的Oracle 9i平臺上進(jìn)行優(yōu)化。在進(jìn)行優(yōu)化前,該視圖的查詢時間為1′07″左右,運(yùn)行的硬件環(huán)境為:P42.66、IGB內(nèi)存、240 GB普通IDE硬盤。在SQL*Plus中優(yōu)化前的運(yùn)行時間如圖3所示。

 

 

2.1 優(yōu)化SQL語句
2.1.1 分析SQL語句的執(zhí)行計(jì)劃

 T1、T2、T3都是大表,且在T1表上一個組合索引:T1(C1,C2),注意C1列為索引的引導(dǎo)列。對于查詢::Select T1.C4 from T1,T2,T3 where T2.C4=6 and T1.C1=T2.C1 and T1.C2=T3.C2 and T3.C3=7,跟蹤該查詢的執(zhí)行計(jì)劃如圖4所示。

 分析圖4查詢計(jì)劃,找出各個表之間的關(guān)聯(lián)關(guān)系,從而得到執(zhí)行計(jì)劃中哪個表為驅(qū)動表。在執(zhí)行計(jì)劃中,需要知道哪個操作是先執(zhí)行的,哪個操作是后執(zhí)行的,這對于判斷哪個表為驅(qū)動表有用處。
 執(zhí)行計(jì)劃的第3列,即字母部分,每列值的左面有空格作為縮進(jìn)字符。在該列值左邊的空格越多,說明該列值的縮進(jìn)越多,該列值也越靠右。如圖4的執(zhí)行計(jì)劃所示:第一列值為6的行的縮進(jìn)最多,即該行最靠右;第一列值為4、5的行的縮進(jìn)一樣,其靠右的程度也一樣,但是第一列值為4的行比第一列值為5的行靠上;在上下關(guān)系方面,只對連續(xù)的、縮進(jìn)一致的行有效。對于NESTED LOOPS部分,最右、最上的操作是TABLE  ACCESS(FULL)OF’T2’,所以這一操作先執(zhí)行,該操作對應(yīng)的T2表為第一個驅(qū)動表(外部表),T1表即為內(nèi)部表。T2與T1表做嵌套循環(huán)后生成了新的row source,對該row source進(jìn)行排序后,與T3表對應(yīng)的排了序的row source(應(yīng)用了T3.C3=7限制條件)進(jìn)行MERGEJOIN連接操作。所以由此可以得出如下事實(shí):T2表先與T1表做嵌套循環(huán),然后將生成的row source與T3表做排序合并連接。通過分析上面的執(zhí)行計(jì)劃,不能認(rèn)為T3表一定在T1、T2表之后才被讀取,事實(shí)上,T2表有可能與T3表同時被讀入內(nèi)存,因?yàn)閷⒈碇械臄?shù)據(jù)讀入內(nèi)存的操作可能為并行的。
 事實(shí)上許多操作可能為交叉進(jìn)行,因?yàn)镺racle讀取數(shù)據(jù)時,如果就是需要一行數(shù)據(jù)也是將該行所在的整個數(shù)據(jù)塊讀入內(nèi)存,而且還有可能為多塊讀。看執(zhí)行計(jì)劃時,其關(guān)鍵不是看哪個操作先執(zhí)行,哪個操作后執(zhí)行,而關(guān)鍵是看表之間連接的順序(如需知道哪個為驅(qū)動表,這需要從操作的順序進(jìn)行判斷)、使用了何種類型的關(guān)聯(lián)及具體的存取路徑(如判斷是否利用了索引),在從執(zhí)行計(jì)劃中判斷出哪個表為驅(qū)動表后,根據(jù)掌握的知識判斷該表作為驅(qū)動表。在這個例子中,T2為驅(qū)動表,表的連接順序?yàn)?T2->T1)->T3,查詢的過程中也使用到了T1表中的索引,因此,Oracle優(yōu)化器對其進(jìn)行的優(yōu)化效果是比較好的。如果分析了執(zhí)行計(jì)劃發(fā)現(xiàn)不合適,就要對SQL語句進(jìn)行更改,或用Oracle提供的提示(Hints)使優(yōu)化器可以選擇正確的驅(qū)動表,以更為合理的順序進(jìn)行表的連接。
2.1.2 使用提示(Hints)干預(yù)執(zhí)行計(jì)劃[5]
 基于成本的優(yōu)化器智能化程度很高,絕大多數(shù)情況下它能對SQL進(jìn)行合理地優(yōu)化,減輕了DBA的負(fù)擔(dān)。但有時受到一些因素的影響,優(yōu)化器也會選擇很差的執(zhí)行計(jì)劃,使某個語句的執(zhí)行變得奇慢無比。此時就需要DBA進(jìn)行人為的干預(yù),告訴優(yōu)化器使用所指定的存取路徑或連接類型生成執(zhí)行計(jì)劃,從而使語句高效地運(yùn)行。例如,如果認(rèn)為對于一個特定的語句,執(zhí)行全表掃描要比執(zhí)行索引掃描更有效,則就可以指示優(yōu)化器使用全表掃描。在Oracle中,是通過為語句添加Hints(提示)來實(shí)現(xiàn)干預(yù)優(yōu)化器優(yōu)化的目的。Hints是Oracle提供的一種機(jī)制,用來告訴優(yōu)化器按照技術(shù)人員告訴它的方式生成執(zhí)行計(jì)劃:
 (1)使用的優(yōu)化器的類型。
 (2)基于代價的優(yōu)化器的優(yōu)化目標(biāo),是all_rows還是first_rows。
 (3)表的訪問路徑,是全表掃描,還是索引掃描,還是直接利用rowid。
 (4)表之間的連接類型。
 (5)表之間的連接順序。
 (6)語句的并行程度。
 Hints只應(yīng)用在其所在SQL語句塊上,對其他SQL語句或語句的其他部分沒有影響。除了“RULE”提示外,一旦使用別的提示,語句就會自動地改為使用CBO優(yōu)化器,此時如果數(shù)據(jù)字典中沒有統(tǒng)計(jì)數(shù)據(jù),就會使用缺省的統(tǒng)計(jì)數(shù)據(jù)。所以如果使用CBO或Hints提示,則最好對表和索引進(jìn)行定期的分析。
 對于表的訪問,可以使用兩種Hints:FULL和ROWID。FULL提示告訴Oracle使用全表掃描的方式訪問指定表。例如:
 SELECT/*+FULL(EMPLOYEE)*/
 FROM EMPLOYEE WHERE EMP_NO=9527:
 索引Hints告訴Oracle使用基于索引的掃描方式,不必說明具體的索引名稱。例如:
 SELECT/*+INDEX(LODGING)*/LODGING
 FROM LODGING
 WHERE MANAGER=’BILL GATES’;
 使用Hints對Oracle優(yōu)化器缺省的執(zhí)行路徑進(jìn)行手工修改是一個很有技巧性的工作,一般建議只針對特定的、少數(shù)的SQL進(jìn)行Hints的優(yōu)化。絕大多數(shù)情況下,只要SQL書寫規(guī)范,Oracle查詢優(yōu)化器的工作情況是相當(dāng)理想的。Hints提示雖然能帶來一些方便,但是不能濫用,因?yàn)檫@種方法過于復(fù)雜,缺乏必要的通用性和應(yīng)變能力,同時增加了維護(hù)上的代價。
 調(diào)整SQL語句后的查詢時間圖5所示。

 目前數(shù)據(jù)庫規(guī)模越來越大,數(shù)據(jù)量呈指數(shù)級上升,使數(shù)據(jù)庫的性能越來越重要。Oracle數(shù)據(jù)庫內(nèi)部結(jié)構(gòu)復(fù)雜,影響系統(tǒng)性能因素較多,但在系統(tǒng)硬件不變的情況下,SQL語句的優(yōu)化是性能得以提高的根本。但優(yōu)化并不能一勞永逸,隨著表結(jié)構(gòu)的改變和數(shù)據(jù)量的增加,優(yōu)化也必須實(shí)時調(diào)整。
參考文獻(xiàn)
[1] 卞榮兵.基于ORACLE數(shù)據(jù)庫性能優(yōu)化的研究[J].應(yīng)用技術(shù),2002(9):36-38.
[2] 鐘小權(quán).Oracle數(shù)據(jù)庫的SQL語句優(yōu)化[J].計(jì)算機(jī)與現(xiàn)代化,2011(3).124-126.
[3] 谷小秋,李德昌.索引調(diào)整優(yōu)化oracle 9i工作性能的研究[J].計(jì)算機(jī)工程與應(yīng)用,2005,26:174-176.
[4] 路川.Oracle 10g寶典[M].北京:電子工業(yè)出版社,2009.
[5] 仇道霞.Oracle數(shù)據(jù)庫性能調(diào)整優(yōu)化[J].山東輕工業(yè)學(xué)報,2010,24(3).52-54.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产欧美综合一区二区三区| 91久久在线播放| 欧美区二区三区| 免费观看久久久4p| 久久久久国产成人精品亚洲午夜| 校园春色国产精品| 亚洲欧美日本精品| 亚洲男女毛片无遮挡| 亚洲视频1区2区| 亚洲婷婷综合色高清在线| 亚洲最新在线| 国产精品99久久久久久宅男| 一区二区av在线| 一区二区三区高清| 99国产精品自拍| 亚洲视频一区二区| 亚洲欧美成人| 欧美亚洲一区二区在线观看| 欧美一区二区三区四区在线观看地址 | 欧美精品一区二区蜜臀亚洲| 欧美精品一区二| 欧美日韩激情小视频| 欧美日韩一区不卡| 国产精品二区影院| 国产欧美日韩在线观看| 狠狠色丁香久久婷婷综合丁香| 好吊色欧美一区二区三区视频| 精品福利av| 亚洲欧洲日产国码二区| 99香蕉国产精品偷在线观看| 亚洲午夜久久久久久久久电影网| 亚洲综合第一页| 久久www成人_看片免费不卡| 亚洲三级视频在线观看| 一区二区日韩欧美| 午夜在线一区| 久久野战av| 欧美精品一区二区三区在线看午夜| 欧美日韩一卡| 国产视频在线观看一区| 亚洲第一黄网| 日韩网站在线观看| 香蕉av777xxx色综合一区| 亚洲福利视频三区| 一本一本久久a久久精品牛牛影视| 亚洲无线一线二线三线区别av| 欧美一区二视频| 欧美成年人网站| 国产精品国产三级国产普通话蜜臀 | 亚洲欧美另类国产| 久久噜噜亚洲综合| 欧美日韩成人| 国产精品一二三视频| 在线欧美三区| 亚洲一区二区免费视频| 亚洲电影在线看| 亚洲无吗在线| 久久只精品国产| 欧美色欧美亚洲另类二区| 国产在线高清精品| 99视频超级精品| 亚洲电影av在线| 亚洲永久免费观看| 欧美1区2区3区| 国产精品久久一卡二卡| 亚洲高清资源| 欧美亚洲一区在线| 99热这里只有精品8| 久久精品欧美日韩| 国产精品av久久久久久麻豆网| 狠狠色丁香婷婷综合久久片| 一区二区欧美日韩视频| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲电影毛片| 午夜久久资源| 亚洲视频精选在线| 麻豆精品视频在线观看| 国产精品视频内| 亚洲精品在线免费观看视频| 久久国内精品自在自线400部| 亚洲一区二区三| 欧美激情久久久久| 国产有码在线一区二区视频| 亚洲午夜激情网站| 日韩午夜在线| 蜜桃精品久久久久久久免费影院| 国产欧美日韩免费| 一区二区欧美精品| 99国产精品国产精品毛片| 久久亚洲精选| 国产精品激情av在线播放| 亚洲三级国产| 亚洲黄色高清| 久久久久久久综合日本| 国产精品视频第一区| 亚洲美女诱惑| 日韩一级网站| 欧美不卡在线视频| 狠狠久久婷婷| 久久激情一区| 久久久91精品国产一区二区精品| 国产精品久久久久婷婷| 一区二区三区高清在线 | 欧美三级电影精品| 91久久国产综合久久91精品网站| 亚洲黄色高清| 狂野欧美一区| 在线播放中文字幕一区| 欧美在线视频全部完| 欧美一级电影久久| 国产精品嫩草99a| 亚洲性视频网址| 亚洲欧美国产高清| 国产精品福利在线| 亚洲一区二区少妇| 亚洲欧美另类在线| 国产精品视频yy9299一区| 亚洲一线二线三线久久久| 亚洲免费中文| 国产精品亚洲精品| 午夜精品亚洲| 久久av二区| 黑人巨大精品欧美一区二区| 久久精品国产免费观看| 久色婷婷小香蕉久久| 亚洲第一视频网站| 99国产麻豆精品| 欧美日韩亚洲一区二区三区| aa级大片欧美三级| 亚洲午夜精品17c| 国产精品视频男人的天堂| 亚洲欧美日韩精品久久亚洲区| 香蕉成人久久| 国产自产在线视频一区| 亚洲国产精品激情在线观看 | 欧美精品一区二区视频| 99国产精品久久久| 亚洲制服欧美中文字幕中文字幕| 国产精品久久久亚洲一区| 亚洲欧美成人一区二区在线电影| 久久激情久久| 伊人久久大香线蕉av超碰演员| 91久久国产综合久久蜜月精品 | 亚洲午夜在线观看| 国产精品一香蕉国产线看观看| 欧美一区二区视频在线| 欧美91视频| 在线一区二区视频| 久久国产精品一区二区三区| 一区二区三区在线视频播放| 日韩视频免费在线| 国产精品高潮呻吟久久av无限 | 亚洲国产欧美另类丝袜| 欧美日韩1080p| 亚洲视频在线二区| 欧美一级午夜免费电影| 伊人久久综合97精品| 亚洲视频你懂的| 国产日韩欧美电影在线观看| 亚洲黄色成人网| 欧美视频在线不卡| 欧美一级播放| 欧美日韩成人综合在线一区二区| 亚洲欧美福利一区二区| 免费视频最近日韩| 在线亚洲欧美| 免费av成人在线| 亚洲视频一区在线观看| 久久亚洲欧洲| 亚洲视频综合| 免费毛片一区二区三区久久久| 一级日韩一区在线观看| 久久久青草青青国产亚洲免观| 亚洲精品国产精品国自产在线 | 影音先锋中文字幕一区| 亚洲午夜激情网页| 精品电影在线观看| 亚洲综合社区| 亚洲国产第一| 欧美在线精品免播放器视频| 亚洲人成在线观看| 久久久久国产精品一区三寸 | 亚洲午夜羞羞片| 欧美成人tv| 欧美一区二区三区在线观看| 欧美日韩亚洲视频一区| 亚洲第一精品夜夜躁人人躁| 欧美系列精品| 亚洲日本va在线观看| 国产欧美一区二区三区另类精品| 亚洲欧洲日本在线| 国产在线精品成人一区二区三区| 亚洲视频在线二区| 亚洲国产合集| 久久伊人免费视频| 亚洲一区二区在线免费观看视频| 欧美理论在线播放| 亚洲观看高清完整版在线观看| 国产精品欧美经典| 正在播放欧美一区|