ORACLE執(zhí)行計(jì)劃和SQL調(diào)優(yōu)_第1頁(yè)
ORACLE執(zhí)行計(jì)劃和SQL調(diào)優(yōu)_第2頁(yè)
ORACLE執(zhí)行計(jì)劃和SQL調(diào)優(yōu)_第3頁(yè)
ORACLE執(zhí)行計(jì)劃和SQL調(diào)優(yōu)_第4頁(yè)
ORACLE執(zhí)行計(jì)劃和SQL調(diào)優(yōu)_第5頁(yè)
已閱讀5頁(yè),還剩66頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、ORACLE 執(zhí)行計(jì)劃和SQL調(diào)優(yōu)內(nèi)容安排排第一部分分:背景景知識(shí)第二部分分:SQL調(diào)優(yōu)優(yōu)第三部分分:工具具介紹第一部分分 背景景知識(shí)執(zhí)行計(jì)劃劃的相關(guān)關(guān)概念Rowid的概概念rowid是一一個(gè)偽列列,既然然是偽列列,那么么這個(gè)列列就不是是用戶定定義,而而是系統(tǒng)統(tǒng)自己給給加上的的。對(duì)每每個(gè)表都都有一個(gè)個(gè)rowid的的偽列,但是表表中并不不物理存存儲(chǔ)ROWID列的值值。不過(guò)過(guò)你可以以像使用用其它列列那樣使使用它,但是不不能刪除除改列,也不能能對(duì)該列列的值進(jìn)進(jìn)行修改改、插入入。一旦旦一行數(shù)數(shù)據(jù)插入入數(shù)據(jù)庫(kù)庫(kù),則rowid在該該行的生生命周期期內(nèi)是唯唯一的,即即使使該行產(chǎn)產(chǎn)生行遷遷移,行行的rowid

2、也不會(huì)會(huì)改變。RecursiveSQL概念有時(shí)為了了執(zhí)行用用戶發(fā)出出的一個(gè)個(gè)sql語(yǔ)句,Oracle必須執(zhí)執(zhí)行一些些額外的的語(yǔ)句,我們將將這些額額外的語(yǔ)語(yǔ)句稱之之為recursivecalls或recursiveSQL statements。如當(dāng)當(dāng)一個(gè)DDL語(yǔ)語(yǔ)句發(fā)出出后,ORACLE總總是隱含含的發(fā)出出一些recursiveSQL語(yǔ)句,來(lái)修改改數(shù)據(jù)字字典信息息,以便便用戶可可以成功功的執(zhí)行行該DDL語(yǔ)句句。當(dāng)需需要的數(shù)數(shù)據(jù)字典典信息沒沒有在共共享內(nèi)存存中時(shí),經(jīng)常會(huì)會(huì)發(fā)生Recursivecalls,這些Recursivecalls會(huì)會(huì)將數(shù)據(jù)據(jù)字典信信息從硬硬盤讀入入內(nèi)存中中。用戶戶不比關(guān)關(guān)心

3、這些些recursive SQL語(yǔ)句句的執(zhí)行行情況,在需要要的時(shí)候候,ORACLE會(huì)自自動(dòng)的在在內(nèi)部執(zhí)執(zhí)行這些些語(yǔ)句。當(dāng)然DML語(yǔ)語(yǔ)句也都都可能引引起recursiveSQL。簡(jiǎn)單的的說(shuō),我我們可以以將觸發(fā)發(fā)器視為為recursive SQL。RowSource andPredicateRowSource(行源源):用用在查詢?cè)冎?,由由上一操操作返回回的符合合條件的的行的集集合,即即可以是是表的全全部行數(shù)數(shù)據(jù)的集集合;也也可以是是表的部部分行數(shù)數(shù)據(jù)的集集合;也也可以為為對(duì)上2個(gè)rowsource進(jìn)進(jìn)行連接接操作(如join連連接)后后得到的的行數(shù)據(jù)據(jù)集合。Predicate(謂詞):一個(gè)個(gè)查詢

4、中中的WHERE限制條條件Driving TableDriving Table(驅(qū)動(dòng)動(dòng)表):該表又又稱為外外層表(OUTERTABLE)。這個(gè)個(gè)概念用用于嵌套套與HASH連連接中。如果該該row source返回回較多的的行數(shù)據(jù)據(jù),則對(duì)對(duì)所有的的后續(xù)操操作有負(fù)負(fù)面影響響。注意意此處雖雖然翻譯譯為驅(qū)動(dòng)動(dòng)表,但但實(shí)際上上翻譯為為驅(qū)動(dòng)行行源(driving rowsource)更為確確切。一一般說(shuō)來(lái)來(lái),是應(yīng)應(yīng)用查詢?cè)兊南拗浦茥l件后后,返回回較少行行源的表表作為驅(qū)驅(qū)動(dòng)表,所以如如果一個(gè)個(gè)大表在在WHERE條條件有有有限制條條件(如如等值限限制),則該大大表作為為驅(qū)動(dòng)表表也是合合適的,所以并并不是只只有

5、較小小的表可可以作為為驅(qū)動(dòng)表表,正確確說(shuō)法應(yīng)應(yīng)該為應(yīng)應(yīng)用查詢?cè)兊南拗浦茥l件后后,返回回較少行行源的表表作為驅(qū)驅(qū)動(dòng)表。在執(zhí)行行計(jì)劃中中,應(yīng)該該為靠上上的那個(gè)個(gè)row source,后后面會(huì)給給出具體體說(shuō)明。ProbedTableProbedTable(被探查查表):該表又又稱為內(nèi)內(nèi)層表(INNERTABLE)。在我我們從驅(qū)驅(qū)動(dòng)表中中得到具具體一行行的數(shù)據(jù)據(jù)后,在在該表中中尋找符符合連接接條件的的行。所所以該表表應(yīng)當(dāng)為為大表(實(shí)際上上應(yīng)該為為返回較較大rowsource的的表)且且相應(yīng)的的列上應(yīng)應(yīng)該有索索引。組合索引引(concatenatedindex)由多個(gè)列列構(gòu)成的的索引,如createin

6、dexidx_emp on emp(col1,col2,col3,),則我們們稱idx_emp索索引為組組合索引引。在組組合索引引中有一一個(gè)重要要的概念念:引導(dǎo)導(dǎo)列(leading column),在上面面的例子子中,col1列為引引導(dǎo)列。當(dāng)我們們進(jìn)行查查詢時(shí)可可以使用用”where col1=? ”,也可以以使用”wherecol1= ?and col2=?”,這這樣的限限制條件件都會(huì)使使用索引引,但是是”where col2=? ”查查詢就不不會(huì)使用用該索引引。所以以限制條條件中包包含先導(dǎo)導(dǎo)列時(shí),該限制制條件才才會(huì)使用用該組合合索引??蛇x擇性性(selectivity)比較一下下列中唯唯一

7、鍵的的數(shù)量和和表中的的行數(shù),就可以以判斷該該列的可可選擇性性。如果果該列的的”唯一一鍵的數(shù)數(shù)量/表表中的行行數(shù)”的的比值越越接近1,則該該列的可可選擇性性越高,該列就就越適合合創(chuàng)建索索引,同同樣索引引的可選選擇性也也越高。在可選選擇性高高的列上上進(jìn)行查查詢時(shí),返回的的數(shù)據(jù)就就較少,比較適適合使用用索引查查詢。oracle訪訪問(wèn)數(shù)據(jù)據(jù)的存取取方法全表掃描描(FullTableScans, FTS)通過(guò)ROWID的表存存取(TableAccess by ROWID )索引掃描描(Index Scan)索引掃描描(Index Scan)索引唯一一掃描(indexunique scan)索引范圍圍掃描

8、(indexrangescan)索引全掃掃描(indexfull scan)索引快速速掃描(indexfastfull scan)表訪問(wèn)方方式全表掃描描:讀取取表中每每一條記記錄,順順序讀取?。簧⒘蝎@取?。菏褂糜梅?hào)散散列主鍵鍵來(lái)為帶帶有匹配配散列值值表中的的記錄創(chuàng)創(chuàng)建ROWID ;ROWID訪問(wèn)問(wèn):通過(guò)過(guò)指定的的ROWID的的方式在在表中選選定一個(gè)個(gè)單獨(dú)的的記錄;是訪問(wèn)問(wèn)記錄的的最快方方式;表之間的的連接rowsource(表)之間的的連接順順序?qū)τ谟诓樵兊牡男视杏蟹浅4蟠蟮挠绊戫憽Mㄟ^(guò)過(guò)首先存存取特定定的表,即將該該表作為為驅(qū)動(dòng)表表,這樣樣可以先先應(yīng)用某某些限制制條件,從而得得到一個(gè)個(gè)較

9、小的的row source,使使連接的的效率較較高,這這也就是是我們常常說(shuō)的要要先執(zhí)行行限制條條件的原原因。一一般是在在將表讀讀入內(nèi)存存時(shí),應(yīng)應(yīng)用where子句中中對(duì)該表表的限制制條件。SQL執(zhí)執(zhí)行的的步驟解析:安安全性檢檢查,語(yǔ)語(yǔ)法檢查查;創(chuàng)建:評(píng)評(píng)估多個(gè)個(gè)執(zhí)行計(jì)計(jì)劃,并并選擇一一個(gè)最優(yōu)優(yōu)的執(zhí)行行計(jì)劃;執(zhí)行:捆捆綁變量量,執(zhí)行行已經(jīng)創(chuàng)創(chuàng)建的執(zhí)執(zhí)行計(jì)劃劃;獲?。韩@獲取結(jié)果果集,進(jìn)進(jìn)行轉(zhuǎn)換換,排序序等;索引訪問(wèn)問(wèn)方式索引范圍圍掃描:指從索索引中讀讀取多個(gè)個(gè)rowid,是最常常見到的的方式;單個(gè)索引引掃描:指從索索引中讀讀取一個(gè)個(gè)單獨(dú)的的rowid;降序索引引范圍掃掃描:指指按降序序的方式式從索引

10、引中讀取取多個(gè)rowid;導(dǎo)致排序序的操作作Orderby子子句Groupby子子句Selectdistinct子子句Union或或 minus 操作作優(yōu)化器調(diào)調(diào)用sortmergejoin操操作創(chuàng)建索引引SQL優(yōu)優(yōu)化器概念:是是一個(gè)為為所有的的sql語(yǔ)句創(chuàng)創(chuàng)建執(zhí)行行計(jì)劃的的工具。目的:生生成最快快的,消消耗資源源最少的的執(zhí)行計(jì)計(jì)劃。兩種優(yōu)化化器:基基于規(guī)則則的優(yōu)化化器(RBO),基于于成本的的優(yōu)化器器(CBO)。優(yōu)化器模模式Rule 模式式:完全全基于數(shù)數(shù)據(jù)字典典生成執(zhí)執(zhí)行計(jì)劃劃;最古古老、比比較穩(wěn)定定;Choose模模式:默認(rèn)的的優(yōu)化器器模式。根據(jù)統(tǒng)統(tǒng)計(jì)數(shù)據(jù)據(jù)的存在在與否確確定調(diào)用用哪一個(gè)

11、個(gè)優(yōu)化器器;First_rows 模式式:基于于成本的的優(yōu)化器器模式,以最快快的速度度返回記記錄;All_rows模模式:基基于成本本的優(yōu)化化器模式式,確保??傮w時(shí)時(shí)間最短短,使用用的資源源最??;設(shè)置優(yōu)化化器模式式的方法法Init.ora參數(shù)數(shù) optimizer_mode =rule/choose/all_rows/first_rows;在會(huì)話層層使用altersession setoptimizer_goal=rule/choose/all_rows/first_rows;在SQL中添加加提示/*+rule/all_rows/first_rows */設(shè)置choose模式式時(shí)候,將根據(jù)據(jù)是

12、否存存在表或或索引的的統(tǒng)計(jì)資資料來(lái)決決定選擇擇RBO或CBO;第二部分分 SQL調(diào)調(diào)整SQL調(diào)調(diào)整的的目標(biāo)去掉不必必要的大大表全表表掃描;緩存小表表全表掃掃描;盡量使用用主機(jī)變變量代替替直接量量,減少少SQL語(yǔ)句的的解析時(shí)時(shí)間;優(yōu)化索引引的使用用;優(yōu)化表連連接方法法;優(yōu)化子查查詢;常見可能能導(dǎo)致全全表掃描描的操作作使用null條條件的查查詢:wherexxxisnull;對(duì)沒有索索引的字字段查詢?cè)?;帶有l(wèi)ike條條件的查查詢:wherexxxlike%x;帶有notequals條條件的查查詢:, !=,notin等等(除非非字段分分布不平平衡,而而且存在在字段矩矩形圖)內(nèi)置函數(shù)數(shù)使索引引無(wú)效:

13、substr(),to_char()等;使用all_rows提示;使用parallel 提示示;基于RBO調(diào)調(diào)整設(shè)置RBO模式式的方法法Init.ora參數(shù)數(shù) optimizer_mode =rule/choose;在會(huì)話層層使用altersession setoptimizer_goal=rule/choose;在SQL中添加加提示/*+ rule*/設(shè)置choose模式式時(shí)候,將根據(jù)據(jù)是否存存在表或或索引的的統(tǒng)計(jì)資資料來(lái)決決定選擇擇RBO或CBO;RBO特特性總是使用用索引(不識(shí)別別位圖索索引或基基于函數(shù)數(shù)的索引引)總是從驅(qū)驅(qū)動(dòng)表開開始只有在不不可避免免的情況況下,才才使用全全表掃描描索引

14、選擇擇的隨機(jī)機(jī)特性基于RBO的調(diào)調(diào)整原則則驅(qū)動(dòng)表的的設(shè)置:在RBO中,驅(qū)動(dòng)表表是from子子句的最最后一個(gè)個(gè)表;驅(qū)驅(qū)動(dòng)表應(yīng)應(yīng)該是返返回記錄錄最少的的那個(gè)表表;Where子句句設(shè)置:限制性性最強(qiáng)的的布爾表表達(dá)式放放在最底底層;添加基于于成本的的提示,來(lái)獲得得更快的的執(zhí)行計(jì)計(jì)劃;基于CBO調(diào)調(diào)整設(shè)置CBO模式式的方法法Init.ora參數(shù)數(shù) optimizer_mode =all_rows/first_rows/choose;在會(huì)話層層使用altersession setoptimizer_goal=all_rows/first_rows/choose;在SQL中添加加提示/*+ hint*/設(shè)置

15、choose模式式時(shí)候,將根據(jù)據(jù)是否存存在表或或索引的的統(tǒng)計(jì)資資料來(lái)決決定選擇擇RBO或CBO;CBO特特性前提條件件:存在在表和索索引的統(tǒng)統(tǒng)計(jì)資料料;使用用analyzetable和和 analyzeindex命命令從從表或索索引中收收集統(tǒng)計(jì)計(jì)資料(表的記記錄平均均長(zhǎng)度,記錄數(shù)數(shù)等);如果沒沒有現(xiàn)存存的統(tǒng)計(jì)計(jì)資料,將在sql運(yùn)運(yùn)行時(shí)收收集資料料,會(huì)大大大降低低性能;影響CBO執(zhí)行行計(jì)劃成成本評(píng)估估的初始始化參數(shù)數(shù)較多(optimizer_search_limit,optimizer_max_permutations,optimizer_index_caching,hash_area_size

16、,hash_join_enable,hash_multiblock_io_count,star_transformation_enable,optimizer_index_cost_adj等等)調(diào)整表連連接表連接方方法嵌套循環(huán)環(huán)連接(nested loopjoin):一個(gè)小小的內(nèi)部部表和一一個(gè)外部部表。比比較內(nèi)部部表的每每一條記記錄和外外部表的的每一條條記錄,返回滿滿足條件件的記錄錄;散列連接接(hashjoin):為較小小的表在在RAM創(chuàng)建散散列表(可以用用來(lái)從較較大的那那個(gè)表讀讀取記錄錄);排序合并并連接(sortmergejoin):使使用連接接字段將將兩個(gè)記記錄集排排序然后后合并;星型

17、連接接(starjoin):幾個(gè)小小型表(將組成成虛擬表表)和一一個(gè)大型型事實(shí)表表,然后后進(jìn)行嵌嵌套循環(huán)環(huán)連接;表連接類類型等連接:標(biāo)準(zhǔn)連連接;froma,bwherea.f1=b.f1;oracle提供供nested loop、hashjoin、sortmerge三三種連接接方式;外部連接接:通通過(guò)在where子句句的等式式謂詞展展覽館放放置一個(gè)個(gè)()來(lái)實(shí)現(xiàn)現(xiàn);from a,bwherea.f1=b.f1(+),將包括括b表中中不匹配配的字段段;自連接:一個(gè)表表與自己己連接的的情況;fromemp a,emp bwherea.f1-b.f1 =10;經(jīng)常常調(diào)用nestedloop連接接;表連

18、接類類型(續(xù)續(xù))反連接:指使用用包含notin或或notexists子子句的子子查詢進(jìn)進(jìn)行的連連接;默默認(rèn)使用用嵌套循循環(huán)算法法;半連接:指在子子查詢中中使用in或exists子子句時(shí)進(jìn)進(jìn)行的操操作;表連接調(diào)調(diào)整原則則RBO只只能調(diào)用用nested loop和和mergesort連接接;hashjoin和star 連接接只能在在CBO中得到到;盡量不要要使用notin反反連接子子查詢,把它替替換成標(biāo)標(biāo)準(zhǔn)等連連接,用用外連接接和where columnisnull子句刪刪除多余余的記錄錄;或者者盡量替替換成notexists子查詢?cè)?,因?yàn)闉樗鼘⒄{(diào)調(diào)用相關(guān)關(guān)聯(lián)的子子查詢;半連接子子查詢可可以重新新

19、書寫成成標(biāo)準(zhǔn)等等連接,用selectdistinct子句句刪除重重復(fù)的記記錄;表連接調(diào)調(diào)整原則則(續(xù))如果驅(qū)動(dòng)動(dòng)表較小小,可以以完全裝裝入hash_area_size內(nèi)存中中,使用用散列連連接(hash join)速度比比嵌套循循環(huán)連接接(nestedloop)快;在兩個(gè)表表非常大大的情況況下,經(jīng)經(jīng)常使用用嵌套循循環(huán)連接接(nestedloop);生成大型型結(jié)果集集的查詢?cè)?、不使使用where子句的的大表連連接或表表中無(wú)可可用索引引的查詢?cè)?,?jīng)常常使用排排序合并并連接(srotmerge);對(duì)于多個(gè)個(gè)小的維維表和一一個(gè)大的的事實(shí)表表的情況況下(數(shù)數(shù)據(jù)倉(cāng)庫(kù)庫(kù)),經(jīng)經(jīng)常使用用星型連連接(star)

20、;不同表連連接方法法的相對(duì)對(duì)速度星型連接接嵌套循環(huán)環(huán)連接散列連接接排序合并并連接連接速度度連接表中中記錄的的數(shù)目少多慢快調(diào)整SQL子查查詢子查詢類類型標(biāo)準(zhǔn)子查查詢:in和和 exists;反連接子子查詢:not in 和not exists;關(guān)聯(lián)子查查詢:指指在子查查詢內(nèi)部部引用外外部數(shù)據(jù)據(jù)表;fromtable1awhere (selectfromtable2bWherea.f1 =b.f1);對(duì)于于外部數(shù)數(shù)據(jù)集的的每一條條記錄,都將重重新執(zhí)行行一次內(nèi)內(nèi)部子查查詢;非關(guān)聯(lián)子子查詢:指在子子查詢內(nèi)內(nèi)部不會(huì)會(huì)引用外外部的數(shù)數(shù)據(jù)表;fromtable1 awhere(select from tab

21、le2b );內(nèi)部部子查詢?cè)冎粓?zhí)行行一次;子查詢調(diào)調(diào)整原則則只要可能能的話,盡可能能的避免免使用子子查詢,而用標(biāo)標(biāo)準(zhǔn)的連連接操作作來(lái)代替替,這樣樣可以使使用提示示來(lái)更改改執(zhí)行計(jì)計(jì)劃;先考慮子子查詢的的合法性性,再考考慮進(jìn)行行改寫;使用一個(gè)個(gè)關(guān)聯(lián)子子查詢時(shí)時(shí),in與exists子句句的子查查詢的執(zhí)執(zhí)行計(jì)劃劃基本相相同;在外部查查詢返回回相對(duì)較較少的記記錄時(shí),關(guān)聯(lián)子子查詢比比非關(guān)聯(lián)聯(lián)子查詢?cè)儓?zhí)行得得更快;子查詢調(diào)調(diào)整原則則(續(xù))在內(nèi)部子子查詢只只有少量量的記錄錄時(shí),非非關(guān)聯(lián)子子查詢比比關(guān)聯(lián)子子查詢執(zhí)執(zhí)行得更更快;關(guān)聯(lián)子查查詢使用用in子子句是多多余的;而非關(guān)關(guān)聯(lián)子查查詢使用用exists子句是是不

22、恰當(dāng)當(dāng)?shù)?。使用in子句的的非關(guān)聯(lián)聯(lián)子查詢?cè)兛梢赞D(zhuǎn)轉(zhuǎn)換為標(biāo)標(biāo)準(zhǔn)連接接操作以以及使用用select distinct來(lái)刪除除重復(fù)的的記錄;使用exists子句句的關(guān)聯(lián)聯(lián)子查詢?cè)兛梢赞D(zhuǎn)轉(zhuǎn)換為標(biāo)標(biāo)準(zhǔn)連接接,但子子查詢最最好只能能返回一一個(gè)記錄錄;子查詢調(diào)調(diào)整原則則(續(xù))非關(guān)聯(lián)子子查詢使使用notexists子子句是沒沒有意義義的;使用notin子句句的非關(guān)關(guān)聯(lián)子查查詢可以以轉(zhuǎn)sqlminus子句句,性能能相對(duì)會(huì)會(huì)高一些些;使用notin子句句的關(guān)聯(lián)聯(lián)子查詢?cè)?,可以以使用帶帶有selectdistinct子句句的外部部連接操操作改寫寫;各種子查查詢技術(shù)術(shù)總結(jié)標(biāo)準(zhǔn)子查詢反連接子查詢inexistsNot

23、inNot exists關(guān)聯(lián)子查詢多余的自動(dòng)轉(zhuǎn)換為嵌套的循環(huán)連接可以重寫為select distinct 外部連接可以重寫為select distinct 外部連接非關(guān)聯(lián)子查詢自動(dòng)轉(zhuǎn)換為嵌套的循環(huán)連接不適合可以重寫為minus操作符的嵌套循環(huán)連接不適合例子:使使用in子句的的非關(guān)聯(lián)聯(lián)子查詢?cè)兛梢允故褂脴?biāo)準(zhǔn)準(zhǔn)連接操操作以及及使用selectdistinct來(lái)來(lái)刪除重重復(fù)的記記錄;原sql語(yǔ)句:SelectenameFrom empWhereempnoin(select empnofrom bad_creditwherebad_credit_datesysdate-365);改寫后:Selectd

24、istinct/*+rule */ enameFrom emp,bad_creditWherea.empno=b.empnoand bad_credit_datesysdate-365;使用提示示進(jìn)行調(diào)調(diào)整提示簡(jiǎn)介介歷史:第第一次引引入是在在oracle7,用用來(lái)彌補(bǔ)補(bǔ)CBO的缺陷陷,oracle8i中工作作得較好好;目的:用用來(lái)更改改SQL語(yǔ)句的的執(zhí)行行計(jì)劃;格式:select(update,delete)/*+ hints */ 或或select(update,delete) - +hint使用提示示遵循的的原則注意檢查查語(yǔ)法:select /*+hint */ , /*和+之之間不能能有

25、空格格,必須須緊跟在在select之后,否則無(wú)無(wú)效使用表別別名:如如果指定定了表別別名,就就不能使使用表名名稱;不能使用用模式名名稱:如如果指定定了模式式所有者者,那么么提示將將被忽略略;檢驗(yàn)提示示:如果果指定不不可用的的訪問(wèn)路路徑,如如:first_rows優(yōu)優(yōu)化器模模式與orderby子句句不兼容容,那么么提示將將被忽略略;使提示無(wú)無(wú)效的條條件Cluster,hash:與非簇簇表一起起使用;Merge_aj,push_subq,Hash_aj:不不存在子子查詢;Index:指指定的索索引不存存在;Index_combine:不存存在位圖圖索引;Parellel:調(diào)調(diào)用的不不是全表表掃描計(jì)計(jì)

26、劃;Star:事實(shí)實(shí)表中存存在不恰恰當(dāng)索引引;Use_concat:在where子句句中不存存在多個(gè)個(gè)索引;Use_nl:表中不不存在索索引;提示之一一:優(yōu)化化器提示示Rule:使oracle為為查詢應(yīng)應(yīng)用基于于規(guī)則的的優(yōu)化模模式。在在懷疑CBO使使用了非非優(yōu)化的的執(zhí)行計(jì)計(jì)劃時(shí),使用rule提示;它將忽忽略表和和索引的的統(tǒng)計(jì)資資料;/*+rule*/All_rows:基基于成本本的優(yōu)化化方法。目的是是提供最最佳的吞吞吐量和和最小的的資源消消耗。傾傾向于全全表掃描描,不適適用于OLTP系統(tǒng);依賴于于表和索索引的統(tǒng)統(tǒng)計(jì)資料料;/*+all_rows*/First_rows:基于于成本的的優(yōu)化方方法

27、。目目的是提提供最快快的反映映時(shí)間。依賴于于表和索索引的統(tǒng)統(tǒng)計(jì)資料料;/*+first_rows */提示之二二:表連連接提示示Use_hash:對(duì)對(duì)指定的的表執(zhí)行行一個(gè)散散列連接接;如果果有一個(gè)個(gè)表較小小,通常??煊谇肚短籽h(huán)環(huán)連接;在兩個(gè)個(gè)表非常常大的情情況下,散列連連接經(jīng)常常與并行行查詢連連接結(jié)合合使用;select /*+use_hash(a,b) parallel(a,4)parallel(b,4)*/;Use_merge:強(qiáng)制執(zhí)執(zhí)行一個(gè)個(gè)排序合合并操作作;對(duì)表表執(zhí)行全全表掃描描;通常常與并行行查詢結(jié)結(jié)合使用用;最適適用于生生成大型型結(jié)果集集的查詢?cè)儭⒉皇故褂脀here子句的的大表連

28、連接或表表中無(wú)可可用索引引的查詢?cè)?;select/*+use_merge(a,b)parallel(a,4)parallel(b,4) */表連接提提示(續(xù)續(xù))Use_nl:強(qiáng)制對(duì)對(duì)目標(biāo)表表執(zhí)行嵌嵌套循環(huán)環(huán)連接;對(duì)包含含兩個(gè)大大表的連連接通常常最快;可以不不用更改改from子句句表的順順序來(lái)更更改驅(qū)動(dòng)動(dòng)表(使使用CBO時(shí),from子句句的第一一個(gè)表);是CBO的的默認(rèn)行行為,比比較少用用;/*+use_nl(a)*/Star:強(qiáng)制制使用星星型查詢?cè)冇?jì)劃;查詢中中至少存存在三個(gè)個(gè)表(一一個(gè)事實(shí)實(shí)表和幾幾個(gè)維表表),而而且事實(shí)實(shí)表(大大表)存存在恰當(dāng)當(dāng)?shù)乃饕?i可以使使用位圖圖索引);/*+s

29、tar */提示之三三:反連連接提示示反連接是是在SQL語(yǔ)句句中包含含not in或notexist子子句時(shí)執(zhí)執(zhí)行的操操作;如如果子查查詢返回回的任何何一條記記錄包含含空值,那么該該查詢將將不會(huì)返返回記錄錄;應(yīng)盡盡量避免免使用。Hash_aj,Merge_aj:在notin子子查詢的的字段中中不存在在空值的的時(shí)候,根據(jù)連連接的類類型,考考慮使用用這兩個(gè)個(gè)提示之之一,可可以在很很大程度度上提高高not in子查詢?cè)兊男阅苣埽?*+hash_aj */提示之四四:索引引提示Index:優(yōu)優(yōu)化器將將使用指指定的索索引;如如果沒有有指定索索引,優(yōu)優(yōu)化器將將使用表表中最佳佳的索引引;/*+index(t

30、able,index)*/Index_join:要求求優(yōu)化器器使用索索引連接接作為訪訪問(wèn)路徑徑;And_equal:如果表表?yè)碛蟹欠俏ㄒ坏牡膯为?dú)字字段索引引,而且且期望使使用多個(gè)個(gè)索引服服務(wù)于該該查詢,那么使使用該提提示將合合并這些些索引;至少兩兩個(gè)索引引名,但但不能超超過(guò)五個(gè)個(gè);/*+and_equal(table,index1,index2,)*/索引提示示(續(xù))Index_asc:要求在在范圍掃掃描中使使用升序序索引;優(yōu)化器器的默認(rèn)認(rèn)行為,不常用用;No_index:強(qiáng)強(qiáng)制優(yōu)化化器忽略略索引得得存在。一般用用在并行行全表掃掃描性能能高于索索引范圍圍掃描性性能的情情況下;等同于于full提

31、示示;Index_desc:要求求在范圍圍掃描中中使用降降序索引引;如在在max()計(jì)計(jì)算字段段的最大大值的時(shí)時(shí)候使用用;/*+index_desc(table,index)*/索引提示示(續(xù))Index_combine:強(qiáng)制制使用位位圖索引引作為表表的訪問(wèn)問(wèn)路徑,對(duì)兩個(gè)個(gè)位圖索索引執(zhí)行行ROWID交交集操作作。如果果沒有指指定索引引作參數(shù)數(shù),優(yōu)化化器將自自動(dòng)選擇擇最佳的的位圖索索引;/*+table(bitmap1,bitmap2)*/Index_ffs:強(qiáng)制使使用快速速完全索索引掃描描;如果果大表中中不存在在被查詢?cè)冏侄蔚牡母邔铀魉饕麈I鍵,比如如需要選選擇復(fù)合合索引中中第二個(gè)個(gè)字段的的值

32、時(shí),那么快快速完全全索引掃掃描總是是比全表表掃描速速度更快快;/*+index_ffs(table,comindex) */索引提示示(續(xù))Use_concat:要求求為查詢?cè)冎兴杏衞r條條件使用用unionall執(zhí)行計(jì)計(jì)劃;一一般用在在where子子句中存存在大量量的or條件;提示之五五:并行行提示Parallel:要要求表查查詢以并并行模式式執(zhí)行;一般用用在多個(gè)個(gè)cpu的服務(wù)務(wù)器上,與full提提示一起起使用;/*+ full(table) parallel(table,8) */Noparallel:不希希望對(duì)全全表掃描描使用并并行機(jī)制制,如對(duì)對(duì)小表執(zhí)執(zhí)行的全全表掃描描時(shí),使使用該提提

33、示;提示之六六:表訪訪問(wèn)提示示Full:要求求避開索索引,調(diào)調(diào)用全表表掃描;讀取表表中大量量的數(shù)據(jù)據(jù)塊時(shí);與parallel一起使使用;Hash:選擇擇散列掃掃描來(lái)訪訪問(wèn)指定定的簇表表;/*+hash */Cluster:選擇擇簇掃描描來(lái)訪問(wèn)問(wèn)指定的的簇表;/*+ cluster*/Nocache:指定定為keep池池分配的的表數(shù)據(jù)據(jù)塊放置置在default池池的中點(diǎn)點(diǎn);很少少使用;表訪問(wèn)提提示(續(xù)續(xù))Ordered:要求求表按照照f(shuō)rom子句句指定的的順序進(jìn)進(jìn)行連接接;對(duì)連連接多于于4個(gè)表表的查詢?cè)兎浅S杏杏茫煽梢怨?jié)省省sql解析的的時(shí)間;/*+ ordered*/Ordered_pred

34、icates:用來(lái)指指定where子句中中布爾條條件評(píng)估估的順序序;Push_subq:要求查查詢數(shù)據(jù)據(jù)塊中的的所有子子查詢?cè)谠趫?zhí)行計(jì)計(jì)劃中盡盡可能早早的被執(zhí)執(zhí)行;用用在子查查詢相對(duì)對(duì)來(lái)說(shuō)不不很昂貴貴,并且且在很大大程度上上降低返返回到記記錄數(shù);如果子子查詢使使用的是是排序合合并連接接或調(diào)用用遠(yuǎn)程表表,提示示將不起起作用;調(diào)整索引引常見的索索引類型型普通索引引:最常常見到的的索引,create index idx1ontable1 (f1);復(fù)合索引引:索引引建立在在多個(gè)字字段上;create idx2ontable2 (f1,f3);位圖索引引:使用用位圖的的方式存存儲(chǔ)索引引;createb

35、itmapindexidx3ontable3(f1);基于函數(shù)數(shù)的索引引:createidx4 on table4(upper(f2);索引無(wú)效效內(nèi)置函數(shù)數(shù)使索引引無(wú)效:from table1a where substr(a.f1,2,4),f1上的的索引無(wú)無(wú)效;執(zhí)行一個(gè)個(gè)數(shù)學(xué)函函數(shù)也會(huì)會(huì)使索引引無(wú)效:from table1a where a.f1*3 1000, f1上的索索引無(wú)效效;不相等運(yùn)運(yùn)算符有有時(shí)也會(huì)會(huì)使索引引無(wú)效:from table1a where a.f11000,導(dǎo)導(dǎo)致全表表掃描,f1上上的索引引無(wú)效;Where子子句中使使用復(fù)合合函數(shù)的的非第一一字段將將無(wú)法使使用索引引;索引無(wú)效效(續(xù))帶有l(wèi)ike條條件的查查詢:wherexxxlike%x;Nul

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論