Oracle優(yōu)化器模式與Oracle索引優(yōu)化規(guī)則_第1頁
Oracle優(yōu)化器模式與Oracle索引優(yōu)化規(guī)則_第2頁
Oracle優(yōu)化器模式與Oracle索引優(yōu)化規(guī)則_第3頁
Oracle優(yōu)化器模式與Oracle索引優(yōu)化規(guī)則_第4頁
Oracle優(yōu)化器模式與Oracle索引優(yōu)化規(guī)則_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Oracle優(yōu)化器介紹.Oracle索引介紹.SQL優(yōu)化規(guī)則介紹.索引優(yōu)化規(guī)則介紹.Oracle優(yōu)化器模式:Oracle在執(zhí)行一個(gè)SQL之前,首先要分析一下語句的執(zhí)行計(jì)劃,然后再按執(zhí)行計(jì)劃去執(zhí)行。分析語句的執(zhí)行計(jì)劃的工作是由優(yōu)化器(Optimizer)來完成的.Oracle優(yōu)化器(Optimizer)是Oracle在執(zhí)行SQL之前分析語句的工具.Oracle的優(yōu)化器有兩種優(yōu)化方式:基于規(guī)則的優(yōu)化方式(Rule-BasedOptimization,簡(jiǎn)稱為RBO)和基于代價(jià)的優(yōu)化方式(Cost-BasedOptimization,簡(jiǎn)稱為CBO).RBO方式︰優(yōu)化器在分析SQL語句時(shí),所遵循的是Oracle內(nèi)部預(yù)定的一些規(guī)則。比如我們常見的,當(dāng)一個(gè)where子句中的一列有索引時(shí)去走索引.CBO方式︰CBO是看語句的代價(jià),這里的代價(jià)主要指Cpu和內(nèi)存。優(yōu)化器在判斷是否用這種方式時(shí),主要參照的是表及索引的統(tǒng)計(jì)信息。統(tǒng)計(jì)信息給出表的大小、有少行、每行的長度等信息。這些統(tǒng)計(jì)信息起初在庫內(nèi)是沒有的,是你在做analyze后才出現(xiàn)的.在Oracle8及以后的版本,Oracle列推薦用CBO的方式。優(yōu)化器的優(yōu)化模式(OptermizerMode):包括Rule,Choose,Firstrows,Allrows這四種方式.Rule:不用多說,即走基于規(guī)則的方式。rboChoose:指的是當(dāng)一個(gè)表或或索引有統(tǒng)計(jì)信息,則走CBO的方式,如果表或索引沒統(tǒng)計(jì)信息,表又不是特別的小,而且相應(yīng)的列有索引時(shí),那么就走索引,走RBO的方式。FirstRows:它與Choose方式是類似的,所不同的是當(dāng)一個(gè)表有統(tǒng)計(jì)信息時(shí),它將是以最快的方式返回查詢的最先的幾行,從總體上減少了響應(yīng)時(shí)間。對(duì)于排序分頁頁顯示這種查詢尤其適用.AllRows:也就是我們所說的Cost的方式,當(dāng)一個(gè)表有統(tǒng)計(jì)信息時(shí),它將以最快的方式返回表的所有的行,從總體上提高查詢的吞吐量。沒有統(tǒng)計(jì)信息則走基于規(guī)則的方式.查看缺省的Oracle優(yōu)化器:SQL>showparametersoptimizer_mode;可以在init文件中對(duì)整個(gè)instance的所有會(huì)話設(shè)置.也可以單獨(dú)對(duì)某個(gè)會(huì)話設(shè)置:SQL>ALTERSESSIONSEToptimizer_mode

=FIRST_ROWS;

查看統(tǒng)計(jì)信息:1.selecttt.table_name,tt.num_rows,tt.blocks,tt.empty_blocks,tt.avg_row_lenfromdba_tablesttwherett.owner='SCOTT';2.selectttt.index_name,ttt.num_rows,ttt.distinct_keys,ttt.avg_leaf_blocks_per_key,ttt.clustering_factorfromdba_indexestttwherettt.owner='SCOTT';人工進(jìn)行統(tǒng)計(jì):對(duì)某一個(gè)用戶下的所有表和索引執(zhí)行統(tǒng)計(jì)分析:executedbms_stats.gather_schema_stats(ownname=>‘SCOTT',cascade=>true);對(duì)單個(gè)表執(zhí)行統(tǒng)計(jì)分析:EXECUTEdbms_stats.gather_table_stats(ownname=>‘SCOTT',tabname=>‘EMP',estimate_percent=>50,cascade=>true).從OracleDatabase10g開始,Oracle在建庫后就默認(rèn)創(chuàng)建了一個(gè)名為GATHER_STATS_JOB的定時(shí)任務(wù),用于自動(dòng)收集CBO的統(tǒng)計(jì)信息,調(diào)用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集統(tǒng)計(jì)信息.默認(rèn)情況下在工作日晚上10:00-6:00和周末全天開啟.一起運(yùn)行的還有另外一個(gè)Job:AUTO_SPACE_ADVISOR_JOB.可以通過以下查詢這個(gè)JOB的運(yùn)行情況:

select*fromDba_Scheduler_JobswhereJOB_NAME='GATHER_STATS_JOB'.關(guān)閉自動(dòng)統(tǒng)計(jì)功能:SQL>execBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');Oracle索引介紹Oracle索引簡(jiǎn)介索引是建立在表的一列或多個(gè)列上的輔助對(duì)象,目的是加快訪問表中的數(shù)據(jù)(加快查詢);索引由根節(jié)點(diǎn)、分支節(jié)點(diǎn)和葉子節(jié)點(diǎn)組成,上級(jí)索引塊包含下級(jí)索引塊的索引數(shù)據(jù),葉節(jié)點(diǎn)包含索引數(shù)據(jù)和確定行實(shí)際位置的rowid。查詢DBA_INDEXES視圖可得到表中所有索引的列表,注意只能通過USER_INDEXES的方法來檢索模式(schema)的索引。訪問USER_IND_COLUMNS視圖可得到一個(gè)給定表中被索引的特定列。通過每個(gè)行的ROWID,索引Oracle提供了訪問單行數(shù)據(jù)的能力。ROWID其實(shí)就是直接指向單獨(dú)行的線路圖。索引分類邏輯上:單列索引,多列索引,唯一索引,非惟一索引。物理上:B*-Tree索引,反向索引,位圖索引。單列索引和復(fù)合索引單列索引是基于單個(gè)列所建立的索引。多列索引是基于兩列或多列所建立的索引。單列索引

Createindexemp_ind1onemp(ename);復(fù)合索引

Createindexemp_ind2onemp(ename,job);惟一索引和非惟一索引惟一索引是索引列值不能重復(fù)的索引。非惟一索引是索引列值可以重復(fù)的索引。無論是惟一索引還是非惟一索引,索引列都允許NULL。B*-tree索引引B*Tree索引引是是最最常常見見的的索索引引結(jié)結(jié)構(gòu)構(gòu),,默默認(rèn)認(rèn)建建立立的的索索引引就就是是這這種種類類型型的的索索引引。。B*Tree索引引在在檢檢索索高高基基數(shù)數(shù)數(shù)數(shù)據(jù)據(jù)列列((高高基基數(shù)數(shù)數(shù)數(shù)據(jù)據(jù)列列是是指指該該列列有有很很多多不不同同的的值值))時(shí)時(shí)提提供供了了最最好好的的性性能能。。當(dāng)當(dāng)取取出出的的行行數(shù)數(shù)占占總總行行數(shù)數(shù)比比例例較較小小時(shí)時(shí)B-Tree索引引比比全全表表檢檢索索提提供供了了更更有有效效的的方方法法。。但但當(dāng)當(dāng)檢檢查查的的范范圍圍超超過過表表的的10%時(shí)就就不不能能提提高高取取回回?cái)?shù)數(shù)據(jù)據(jù)的的性性能能。。B-Tree索引引是是基基于于二二叉叉樹樹的的,,由由分分支支塊塊((branchblock)和和葉葉塊塊((leafblock)組組成成。。在在樹樹結(jié)結(jié)構(gòu)構(gòu)中中,,位位于于最最底底層層底底塊塊被被稱稱為為葉葉塊塊,,包包含含每每個(gè)個(gè)被被索索引引列列的的值值和和行行所所對(duì)對(duì)應(yīng)應(yīng)的的rowid。在在葉葉節(jié)節(jié)點(diǎn)點(diǎn)的的上上面面是是分分支支塊塊,,用用來來導(dǎo)導(dǎo)航航結(jié)結(jié)構(gòu)構(gòu),,包包含含了了索索引引列列((關(guān)關(guān)鍵鍵字字))范范圍圍和和另另一一索索引引塊塊的的地地址址.創(chuàng)建建索索引引::1:createindexSTUDENT_IND_nameonSTUDENT(NAME)tablespaceUSERS;2:createindexSTUDENT_IND_nameonSTUDENT(NAME,AGE)tablespaceUSERS;B*-tree索引引B*-tree索引引假設(shè)設(shè)我我們們要要找找索索引引中中值值為為80的行行,,從從索索引引樹樹的的最最上上層層入入口口開開始始,,定定位位到到大大于于等等于于50,然然后后往往左左找找,,找找到到第第2個(gè)分分支支塊塊,,定定位位為為75-100,最最后后再再定定位位到到葉葉塊塊上上,,找找到到80所對(duì)應(yīng)的的rowid,然后根根據(jù)rowid去讀取數(shù)數(shù)據(jù)塊獲獲取數(shù)據(jù)據(jù)。如果果查詢條條件是范范圍選擇擇的,比比如wherecolumn>20andcolumn<80,那么會(huì)會(huì)先定位位到第一一個(gè)包含含20的葉塊,,然后橫橫向查找找其他的的葉塊,,直到找找到包含含80的塊為止止,不用用每次都都從入口口進(jìn)去再再重新定定位。反向索引引反向索引引是B*Tree索引的一一個(gè)分支支,它的的設(shè)計(jì)是是為了運(yùn)運(yùn)用在某某些特定定的環(huán)境境下的。。Oracle推出它的的主要目目的就是是為了降降低在并并行服務(wù)務(wù)器(OracleParallelServer)環(huán)境下下索引葉葉塊的爭(zhēng)爭(zhēng)用。當(dāng)當(dāng)B*Tree索引中有有一列是是由遞增增的序列列號(hào)產(chǎn)生生的話,,那么這這些索引引信息基基本上分分布在同同一個(gè)葉葉塊,當(dāng)當(dāng)用戶修修改或訪訪問相似似的列時(shí)時(shí),索引引塊很容容易產(chǎn)生生爭(zhēng)用。。反向索索引中的的索引碼碼將會(huì)被被分布到到各個(gè)索索引塊中中,減少少了爭(zhēng)用用。反向向索引反反轉(zhuǎn)了索索引碼中中每列的的字節(jié)。。建立反向向索引:createindexreversed_ind_emponemp(Order_ID)reverse;反向索引引如果有一一個(gè)名稱稱為order_id的列值在在某行上上是12345,oracle就將它顛顛倒為54321。這樣連連續(xù)的幾幾個(gè)數(shù)不不會(huì)在同同一個(gè)頁頁塊里。。不過反反向索引引又一個(gè)個(gè)缺點(diǎn)就就是不能能在所有有使用常常規(guī)索引引的地方方使用。。在范圍圍搜索中中其不能能被使用用,例如如,wherecolumn>value,因?yàn)樵谒魉饕娜~葉塊中索索引碼沒沒有分類類,所以以不能通通過搜索索相鄰葉葉塊完成成區(qū)域掃掃描。注注意::只有索索引中的的值是逆逆向的,,表中的的值保持持不變。。位圖索引引位圖索引引主要用用于決策策支持系系統(tǒng)或靜靜態(tài)數(shù)據(jù)據(jù),不支支持行級(jí)級(jí)鎖定。。位圖索索引最好好用于低低cardinality列(即列列的唯一一值除以以行數(shù)為為一個(gè)很很小的值值,接近近零),,例如又又一個(gè)““性別””列,列列值有““Male”,“Female””,“Null”等3種,但一一共有300萬條記錄錄,那么么3/3000000約等于0,這種情情況下最最適合用用位圖索索引。創(chuàng)建位圖圖索引:createbitmapindexinx_bitmap_emponemp(sex);位圖索引引的格式式行值12

345

678

910Male100

000

001

1Female0

111

001

100Null000

011

000

0位圖索引引如果搜索索wheregender=’Male’’,要統(tǒng)計(jì)性性別是””Male”的列行數(shù)數(shù)的話,,Oracle很快就能能從位圖圖中找到到共3行即第1,9,10行是符合合條件的的;如果果要搜索索wheregender=’Male’’

or

gender=’’Female’的列的行行數(shù)的話話,也很很容易從從位圖中中找到共共8行即1,2,3,4,7,8,9,10行是符合合條件的的。如果果要搜索索表的值值的話,,那么Oracle會(huì)用內(nèi)部部的轉(zhuǎn)換換函數(shù)將將位圖中中的相關(guān)關(guān)信息轉(zhuǎn)轉(zhuǎn)換成rowid來訪問數(shù)數(shù)據(jù)塊。。聚簇聚簇是根根據(jù)碼值值找到數(shù)數(shù)據(jù)的物物理存儲(chǔ)儲(chǔ)位置,,從而達(dá)達(dá)到快速速檢索數(shù)數(shù)據(jù)的目目的。聚聚簇索引引的順序序就是數(shù)數(shù)據(jù)的物物理存儲(chǔ)儲(chǔ)順序,,葉節(jié)點(diǎn)點(diǎn)就是數(shù)數(shù)據(jù)節(jié)點(diǎn)點(diǎn)。非聚聚簇索引引的順序序與數(shù)據(jù)據(jù)物理排排列順序序無關(guān),,葉節(jié)點(diǎn)點(diǎn)仍然是是索引節(jié)節(jié)點(diǎn),只只不過有有一個(gè)指指針指向向?qū)?yīng)的的數(shù)據(jù)塊塊。一個(gè)個(gè)表最多多只能有有一個(gè)聚聚簇索引引。使用Oracle聚簇索引引在Oracle當(dāng)中,聚聚簇不是是索引的的組織形形式,而而是表的的組織形形式。多多用于表表之間的的連接字字段。例例:dept(deptno,dnma,eloc)和表emp(empno,ename,job,mgr,...deptno),常在deptno上進(jìn)行連連接,可以針對(duì)對(duì)deptno字段建立立聚簇,,然后建建立基于于該聚簇簇的索引引,并讓讓兩個(gè)表表都使用用上該聚聚簇。Oracle聚簇索引引CREATECLUSTERpersonnel(department_numberNUMBER(2))SIZE512STORAGE(INITIAL100KNEXT50K);CREATETABLEemp(empnoNUMBERPRIMARYKEY,enameVARCHAR2(10)NOTNULLCHECK(ename=UPPER(ename)),jobVARCHAR2(9),mgrNUMBER,commNUMBER(9,0)DEFAULTNULL,deptnoNUMBER(2)NOTNULL)CLUSTERpersonnel(deptno);CREATETABLEdept(deptnoNUMBER(2),dnameVARCHAR2(9),locVARCHAR2(9))CLUSTERpersonnel(deptno);CREATEINDEXidx_personnelONCLUSTERpersonnel;Oracle聚簇索引引這樣可以以讓兩個(gè)個(gè)表同時(shí)時(shí)用上聚聚簇索引引。保證證兩個(gè)表表的記錄錄按照depno值盡盡量存放放到同一一個(gè)物理理塊當(dāng)中中。使用索引引的一些些規(guī)則1.索引對(duì)大大表最有有用,不不要在小小表上加加索引.2.為每個(gè)表表中的主主碼指定定一個(gè)唯唯一索引引。3.索引對(duì)于于那些頻頻繁出現(xiàn)現(xiàn)在SQL命令中的where子句中的列最最有用,不管管這些列在選選擇中用來限限定行還是為為了表連接。。4.當(dāng)一個(gè)屬性中中存在很多不不同的值時(shí),,可以使用索索引。Oracle建議當(dāng)一個(gè)屬屬性中有少于于30個(gè)不同值時(shí),,索引不是很很有用,當(dāng)屬屬性中有100或更多不同值值時(shí)索引就很很明顯地有用用了。相似地地,只有當(dāng)使使用索引進(jìn)行行查詢的結(jié)果果不超過文件件中所有記錄錄總數(shù)的20%時(shí),使用索引引才有幫助。。5.檢查你的DBMS對(duì)索引的限制制,即便要在在每個(gè)表允許許的索引個(gè)數(shù)數(shù)上。許多系系統(tǒng)不超過16個(gè)索引而且限限制每個(gè)索引引鍵值的大小小。對(duì)一個(gè)表表創(chuàng)建的索引引數(shù)一般不超超過5個(gè).7.對(duì)于包含空值值的屬性建立立索引時(shí)要小小心,在很多多DBMS里有空值的行行不能在索引引中作為參照照。8.時(shí)常需要做刪刪除、更新、、插入操作的的表不要?jiǎng)?chuàng)建建索引.9.將表和索引建建立在不同的的表空間內(nèi)(TABLESPACES).不要將不屬于于ORACLE內(nèi)部系統(tǒng)的的對(duì)象存放放到SYSTEM表空間里.同時(shí),確保數(shù)據(jù)表表空間和索索引表空間間置于不同同的硬盤上上.減少I/O競(jìng)爭(zhēng).SQL優(yōu)化的一些些規(guī)則:(有些規(guī)則只只有在基于于規(guī)則的優(yōu)優(yōu)化器里有有效).1>選擇最有效效率的表名名順序:1.把記錄少的的表放在from子句的最后后面一個(gè)表表.2.如果有3個(gè)以上的表表連接查詢?cè)?那就需要選選擇交叉表表(intersectiontable)作為基礎(chǔ)表表,交叉表是指指那個(gè)被其其他表所引引用的表.原因:ORACLE的解析器按按照從右到到左的順序序處理FROM子句中的表表名,因此FROM子句中寫在在最后的表表(基礎(chǔ)表drivingtable)將被最先處處理.在FROM子句中包含含多個(gè)表的的情況下,你必須選擇擇記錄條數(shù)數(shù)最少的表表作為基礎(chǔ)礎(chǔ)表.當(dāng)ORACLE處理多個(gè)表表時(shí),會(huì)運(yùn)用排序序及合并的的方式連接接它們.首先,掃描第一個(gè)表(FROM子句中最后后的那個(gè)表表)并對(duì)記錄進(jìn)進(jìn)行排序,然后掃描第第二個(gè)表(FROM子句中最后后第二個(gè)表表),最后將所有有從第二個(gè)個(gè)表中檢索索出的記錄錄與第一個(gè)個(gè)表中合適適記錄進(jìn)行行合并.2>WHERE子句中的連連接順序::ORACLE采用自右向向左的順序序解析WHERE子句,,那些可以過過濾掉最大大數(shù)量記錄錄的條件必必須寫在WHERE子句的末尾尾.3.>SELECT子句中避免免使用‘‘*‘‘ORACLE在解析的過過程中,需要通過查查詢數(shù)據(jù)字字典將'*'依次轉(zhuǎn)換成成所有的列列名.4.>使用表的別別名(Alias)當(dāng)在SQL語句中連接接多個(gè)表時(shí)時(shí),請(qǐng)使用表的的別名并把把別名前綴綴于每個(gè)Column上.這樣一來,就可以減少少解析的時(shí)時(shí)間并減少少那些由Column歧義引起的的語法錯(cuò)誤誤.

(Column歧義指的是是由于SQL中不同的表表具有相同同的Column名,當(dāng)SQL語句中出現(xiàn)現(xiàn)這個(gè)Column時(shí),SQL解析器無法法判斷這個(gè)個(gè)Column的歸屬)5.>減少訪問數(shù)數(shù)據(jù)庫的次次數(shù):當(dāng)執(zhí)行每條條SQL語句時(shí),ORACLE在內(nèi)部執(zhí)行行了許多工工作:解析SQL語句,估算索引的的利用率,綁定變量,讀數(shù)據(jù)塊等等等.由此可見,減少訪問數(shù)數(shù)據(jù)庫的次次數(shù),就能實(shí)際上上減少ORACLE的工作量.6.>(可能的話)用TRUNCATE替代DELETE.當(dāng)刪除表中中的記錄時(shí)時(shí),在通常情況況下,回滾段(rollbacksegments)用來存放可可以被恢復(fù)復(fù)的信息.如果你沒有有COMMIT事務(wù),ORACLE會(huì)將數(shù)據(jù)恢恢復(fù)到執(zhí)行行刪除命令令之前的狀狀況.而當(dāng)運(yùn)用TRUNCATE時(shí),回滾段不再再存放任何何可被恢復(fù)復(fù)的信息.當(dāng)命令運(yùn)行行后,數(shù)據(jù)不能被被恢復(fù).因此很少的的資源被調(diào)調(diào)用,執(zhí)行時(shí)間也也會(huì)很短.

(TRUNCATE只在刪除全全表里的記記錄時(shí)適用用,TRUNCATE是DDL不是DML)7.>(可能的話)使用COMMIT只要有可能能,在程序中盡盡量多使用用COMMIT,這樣程序的的性能得到到提高,需求也會(huì)因因?yàn)镃OMMIT所釋放的資資源而減少少:

COMMIT所釋放的資資源:

a.回滾段上用用于恢復(fù)數(shù)數(shù)據(jù)的信息息.

b.被程序語句句獲得的鎖鎖c.redologbuffer中的空間d.ORACLE為管理上述述3種資源中的的內(nèi)部花費(fèi)費(fèi)8.>(可能的話)用Where子句替換HAVING子句盡量少使用用HAVING子句,HAVING只會(huì)在檢索索出所有記記錄之后才才對(duì)結(jié)果集集進(jìn)行過濾濾.這個(gè)處理需需要排序,總計(jì)等操作作.如果能通過過WHERE子句限制記記錄的數(shù)目目,那就能減少少這方面的的開銷.9.>(某些情況下下)可以用EXISTS替代IN.NOTEXISTS替代NOTIN性能比較:1.Select*fromt1wherexin(selectyfromt2)2.select*fromt1whereexists(select1fromt2wheret2.y=t1.x)當(dāng)t1記錄比較少少,t2比較大時(shí)適適合用exists(exists大部分情況況會(huì)利用到到index),當(dāng)子查詢記記錄集很小小時(shí)用in比較合適.原因分析::1.Select*fromT1wherexin(selectyfromT2)執(zhí)行的過程程相當(dāng)于:select*fromt1,(selectdistinctyfromt2)t3wheret1.x=t3.y;2.select*fromt1whereexists(select1fromt2wheret2.y=t1.x)執(zhí)行的過程程相當(dāng)于:

forxin(select*fromt1)loopif(exists(select1fromt2wheret2.y=t1.x)thenOUTPUTTHERECORDendifendloop這樣表T1要被完全掃掃描一遍.所以可以得得出結(jié)論:當(dāng)t1記錄比較少少,t2比較大時(shí)適適合用exists(exists大部分情況況會(huì)利用到到index),當(dāng)子查詢記記錄集很小小時(shí)用in比較合適.10.>用表連接替替換EXISTS改進(jìn)第9打優(yōu)化規(guī)則則的例子.11.>用EXISTS替換DISTINCTEXISTS使查詢更為為迅速,因?yàn)镽DBMS核心模塊在在子查詢的的條件一旦旦滿足后立刻返回結(jié)結(jié)果.DISTINCT會(huì)先進(jìn)行排排序,然后會(huì)根據(jù)據(jù)排序后的的順序去除除相同的行行.12.>使用顯式的的游標(biāo)(CURSOR)使用隱式的的游標(biāo),將會(huì)執(zhí)行兩兩次操作.第一次檢索索記錄,第二次檢查查TOOMANYROWS這個(gè)exception.而顯式游標(biāo)標(biāo)不執(zhí)行第第二次操作作.11-例:1.(低效)SELECTDISTINCTDEPT_NO,DEPT_NAMEFROMDEPTD,EMPE

WHERED.DEPT_NO=E.DEPT_NO;2.高效:

SELECTDEPT_NO,DEPT_NAMEFROMDEPTDWHEREEXISTS(SELECT*FROMEMPEWHEREE.DEPT_NO=D.DEPT_NO);13.用索引提高高效率通常,通過索引查查詢數(shù)據(jù)比比全表掃描描要快.當(dāng)ORACLE找出執(zhí)行查查詢和Update語句的最佳佳路徑時(shí),ORACLE優(yōu)化器將使使用索引.除了那些LONG或LONGRAW數(shù)據(jù)類型,你可以索引引幾乎所有有的列.在大型表中中使用索引引特別有效效.雖然使用索索引能得到到查詢效率率的提高,但是我們也也必須注意意到它的代代價(jià).索引需要空空間來存存儲(chǔ),也需要定期期維護(hù),每當(dāng)有記錄錄在表中增增減或索引引列被修改改時(shí),索引本身也也會(huì)被修改改.這意味著每每條記錄的的INSERT,DELETE,UPDATE將為此多付付出4,5次的磁盤I/O.因?yàn)樗饕栊枰~外的的存儲(chǔ)空間間和處理,那些不必要要的索引反反而會(huì)使查查詢反應(yīng)時(shí)時(shí)間變慢.定期的重構(gòu)構(gòu)索引是有有必要的.ALTERINDEX<INDEXNAME>REBUILD<TABLESPACENAME>Oracle索引優(yōu)化規(guī)規(guī)則索引優(yōu)化規(guī)規(guī)則:1.like件中不要以以通配符(WILDCARD)開始,否則索引將將不被采用用.例:SELECTLODGINGFROMLODGINGWHEREMANAGERLIKE‘%HANMAN';2.避免在索引引列上使用用計(jì)算或改改變索引列列的類型或或使用‘!=’及<>例:SELECT……FROMDEPTWHERESAL*12>25000;SELECT…FROMEMPWHEREEMP_TYPE=to_char(123);select….WhereACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';select……whereempno!=8888;3.避免免在在索索引引列列上上使使用用NOT.4.用>=替代代>.高效效:SELECT*FROMEMPWHEREDEPTNO>=4低效效:SELECT*FROMEMPWHEREDEPTNO>3兩者者的的區(qū)區(qū)別別在在于于,前者者DBMS將直直接接跳跳到到第第一一個(gè)個(gè)DEPT等于于4的記記錄錄而而后后者者將將首首先先定定位位到到DEPTNO=3的記記錄錄并并且且向向前前掃掃描描到到第第一一個(gè)個(gè)DEPT大于于3的記記錄錄.5.用UNION替換換OR(適用用于于索索引引列列)通常常情情況況下下,用UNION替換換WHERE子句句中中的的OR將會(huì)會(huì)起起到到較較好好的的效效果果.對(duì)索索引引列列使使用用OR將造造成成全全表表掃掃描描.注意意,以上上規(guī)規(guī)則則只只針針對(duì)對(duì)多多個(gè)個(gè)索索引引列列有有效效.如果果有有column沒有有被被索索引引,查詢?cè)冃事士煽赡苣軙?huì)會(huì)因因?yàn)闉槟隳銢]沒有有選選擇擇OR而降降低低.在下下面面的的例例子子中中,LOC_ID和REGION上都都建建有有索索引引.高效效:SELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHERELOC_ID=10UNIONSELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHEREREGION=““MELBOURNE””低效效:SELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHERELOC_ID=10ORREGION=““MELBOURNE””如果果你你堅(jiān)堅(jiān)持持要要用用OR,那就就需需要要返返回回記記錄錄最最少少的的索索引引列列寫寫在在最最前前面面注意意::WHEREKEY1=10(返返回回最最少少記記錄錄))ORKEY2=20(返返回回最最多多記記錄錄))ORACLE內(nèi)部部將將以以上上轉(zhuǎn)轉(zhuǎn)換換為為WHEREKEY1=10AND(((NOTKEY1=10)ANDKEY2=20)6.避免免在在索索引引列列上上使使用用ISNU

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論