版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ORACLE培訓(xùn)
--SQL性能優(yōu)化內(nèi)容概述課程主要討論: SQL語(yǔ)句執(zhí)行的過程、ORACLE優(yōu)化器,表之間的關(guān)聯(lián),如何得到SQL執(zhí)行計(jì)劃,如何分析執(zhí)行計(jì)劃等內(nèi)容,從而由淺到深的方式了解SQL優(yōu)化的過程,使大家逐步掌握SQL優(yōu)化。目錄優(yōu)化基礎(chǔ)知識(shí)性能調(diào)整綜述
有效的應(yīng)用設(shè)計(jì)
SQL語(yǔ)句的處理過程
Oracle的優(yōu)化器
Oracle的執(zhí)行計(jì)劃注意事項(xiàng)一、優(yōu)化基礎(chǔ)知識(shí)概述性能管理性能問題調(diào)整的方法SQL優(yōu)化機(jī)制應(yīng)用的調(diào)整SQL語(yǔ)句的處理過程共享SQL區(qū)域SQL語(yǔ)句處理的階段共享游標(biāo)SQL編碼標(biāo)準(zhǔn)Oracle優(yōu)化器介紹SQLTunningTips優(yōu)化Tools性能管理盡早開始設(shè)立合適目標(biāo)邊調(diào)整邊監(jiān)控相關(guān)人員進(jìn)行合作及時(shí)處理過程中發(fā)生的意外和變化80/20定律SQL優(yōu)化衡量指標(biāo)隨著軟件技術(shù)的不斷發(fā)展,系統(tǒng)性能越來越重要。系統(tǒng)性能主要用:系統(tǒng)響應(yīng)時(shí)間和并發(fā)性來衡量。造成SQL語(yǔ)句性能不佳大致有兩個(gè)原因:開發(fā)人員只關(guān)注查詢結(jié)果的正確性,忽視查詢語(yǔ)句的效率。開發(fā)人員只關(guān)注SQL語(yǔ)句本身的效率,對(duì)SQL語(yǔ)句執(zhí)行原理、影響SQL執(zhí)行效率的主要因素不清楚。*前者可以通過深入學(xué)習(xí)SQL語(yǔ)法及各種SQL調(diào)優(yōu)技巧進(jìn)行解決。SQL調(diào)優(yōu)是一個(gè)系統(tǒng)工程,熟悉SQL語(yǔ)法、掌握各種內(nèi)嵌函數(shù)、分析函數(shù)的用法只是編寫高效SQL的必要條件。*后者從分析SQL語(yǔ)句執(zhí)行原理入手,指出SQL調(diào)優(yōu)應(yīng)在優(yōu)化SQL解析和優(yōu)化CBO上。調(diào)優(yōu)領(lǐng)域調(diào)優(yōu)領(lǐng)域:應(yīng)用程序級(jí)調(diào)優(yōu):*SQL語(yǔ)句調(diào)優(yōu)*管理變化調(diào)優(yōu)2.實(shí)例級(jí)調(diào)優(yōu)*內(nèi)存*數(shù)據(jù)結(jié)構(gòu)*實(shí)例配置3.操作系統(tǒng)交互*I/O*SWAP*Parameters本課程內(nèi)容只講解討論應(yīng)用程序級(jí):
OracleSQL語(yǔ)句調(diào)優(yōu)及管理變化調(diào)優(yōu)調(diào)整的方法調(diào)整業(yè)務(wù)功能調(diào)整數(shù)據(jù)設(shè)計(jì)調(diào)整流程設(shè)計(jì)調(diào)整SQL語(yǔ)句調(diào)整物理結(jié)構(gòu)調(diào)整內(nèi)存分配調(diào)整I/O調(diào)整內(nèi)存競(jìng)爭(zhēng)調(diào)整操作系統(tǒng)不同調(diào)整產(chǎn)生相應(yīng)性能收益調(diào)整整的的角角色色SQL語(yǔ)句句優(yōu)優(yōu)化化是是提提高高性性能能的的重重要要環(huán)環(huán)節(jié)節(jié)開發(fā)發(fā)人人員員不不能能只只注注重重功功能能的的實(shí)實(shí)現(xiàn)現(xiàn),,不不管管性性能能如如何何開發(fā)發(fā)人人員員不不能能把把Oracle當(dāng)成成一一個(gè)個(gè)黑黑盒盒子子,,必必須須了了解解其其結(jié)結(jié)構(gòu)構(gòu)、、處處理理SQL和數(shù)數(shù)據(jù)據(jù)的的方方法法必需需遵遵守守既既定定的的開開發(fā)發(fā)規(guī)規(guī)范范未經(jīng)經(jīng)過過SQL語(yǔ)句句優(yōu)優(yōu)化化的的模模塊塊不不要要上上線線SQL語(yǔ)句句優(yōu)優(yōu)化化的的過過程程定位位有有問問題題的的語(yǔ)語(yǔ)句句檢查查執(zhí)執(zhí)行行計(jì)計(jì)劃劃?rùn)z查查執(zhí)執(zhí)行行過過程程中中優(yōu)優(yōu)化化器器的的統(tǒng)統(tǒng)計(jì)計(jì)信信息息分析析相相關(guān)關(guān)表表的的記記錄錄數(shù)數(shù)、、索索引引情情況況改寫寫SQL語(yǔ)句句、、使使用用HINT、調(diào)調(diào)整整索索引引、、表表分分析析有些些SQL語(yǔ)句句不不具具備備優(yōu)優(yōu)化化的的可可能能,,需需要要優(yōu)優(yōu)化化處處理理方方式式達(dá)到到最最佳佳執(zhí)執(zhí)行行計(jì)計(jì)劃劃什么么是是好好的的SQL語(yǔ)句句??盡量量簡(jiǎn)簡(jiǎn)單單,,模模塊塊化化易讀讀、、易易維維護(hù)護(hù)節(jié)省省資資源源內(nèi)存存CPU掃描描的的數(shù)數(shù)據(jù)據(jù)塊塊要要少少少排排序序不造造成成死死鎖鎖SQL共享享原原理理ORACLE將執(zhí)執(zhí)行行過過的的SQL語(yǔ)句句存存放放在在內(nèi)內(nèi)存存的的共共享享池池(sharedbufferpool)中,,可可以以被被所所有有的的數(shù)數(shù)據(jù)據(jù)庫(kù)庫(kù)用用戶戶共共享享。。當(dāng)你你執(zhí)執(zhí)行行一一個(gè)個(gè)SQL語(yǔ)句句(有時(shí)時(shí)被被稱稱為為一一個(gè)個(gè)游游標(biāo)標(biāo))時(shí),如果果它它和和之之前前的的執(zhí)執(zhí)行行過過的的語(yǔ)語(yǔ)句句完完全全相相同同,ORACLE就能能很很快快獲獲得得已已經(jīng)經(jīng)被被解解析析的的語(yǔ)語(yǔ)句句以以及及最最好好的的執(zhí)執(zhí)行行路路徑徑.這個(gè)個(gè)功功能能大大大大地地提提高高了了SQL的執(zhí)執(zhí)行行性性能能并并節(jié)節(jié)省省了了內(nèi)內(nèi)存存的的使使用用。。SQL共享享原原理理為了了不不重重復(fù)復(fù)解解析析相相同同的的SQL語(yǔ)句句,,在在第第一一次次解解析析之之后后,,Oracle將SQL語(yǔ)句句存存放放在在內(nèi)內(nèi)存存中中。。這這塊塊位位于于系系統(tǒng)統(tǒng)全全局局區(qū)區(qū)域域SGA(systemglobalarea)的共共享享池池(sharedbufferpoo1)中的的內(nèi)存存可可以以被被所所有有的的數(shù)數(shù)據(jù)據(jù)庫(kù)庫(kù)用用戶戶共共享享。。因因此此,,當(dāng)當(dāng)你你執(zhí)執(zhí)行行一一個(gè)個(gè)SQL語(yǔ)句句(有時(shí)時(shí)被被稱稱為為一一個(gè)個(gè)游游標(biāo)標(biāo))時(shí),,如如果果它它和和之之前前執(zhí)執(zhí)行行過過的的語(yǔ)語(yǔ)句句完完全全相同同,,Oracle就能能很很快快獲獲得得已已經(jīng)經(jīng)被被解解析析的的語(yǔ)語(yǔ)句句以以及及最最好好的的執(zhí)執(zhí)行行方案案。。Oracle的這這個(gè)個(gè)功功能能大大大大地地提提高高了了SQL的執(zhí)執(zhí)行行性性能能并并節(jié)節(jié)省省了內(nèi)內(nèi)存存的的使使用用。??上У牡氖鞘?,,Oracle只對(duì)對(duì)簡(jiǎn)簡(jiǎn)單單的的表表提提供供高高速速緩緩沖沖(cachebufferiIlg),這這個(gè)個(gè)功功能能并并不不適適用用于于多多表表連連接接查查詢?cè)?。。?shù)數(shù)據(jù)據(jù)庫(kù)管管理理員員必必須須在在啟啟動(dòng)動(dòng)參參數(shù)數(shù)文文件件中中為為這這個(gè)個(gè)區(qū)區(qū)域域設(shè)設(shè)置置合合適適的的參參數(shù)數(shù),,當(dāng)這個(gè)內(nèi)內(nèi)存區(qū)域域越大,,就可以以保留更更多的語(yǔ)語(yǔ)句,當(dāng)當(dāng)然被共共享的可能性也也就越大大了。當(dāng)當(dāng)向Oracle提交一個(gè)個(gè)SQL語(yǔ)句時(shí),,Oracle會(huì)首先在在這塊內(nèi)內(nèi)存中查查找相同同的語(yǔ)句句。SQL共享的三三個(gè)條件件當(dāng)前被執(zhí)執(zhí)行的語(yǔ)語(yǔ)句和共共享池中中的語(yǔ)句句必須完完全相同同(包包括大小小寫、空空格、換換行等))兩個(gè)語(yǔ)句句所指的的對(duì)象必必須完全全相同((同義義詞與表表是不同同的對(duì)象象)兩個(gè)SQL語(yǔ)句中必必須使用用相同的的名字的的綁定變變量(bindvariables)共享SQL語(yǔ)句注意:Oracle對(duì)兩者采采取的是是一種嚴(yán)嚴(yán)格匹配配策略,,要達(dá)成成共享。。SQL語(yǔ)句必須完全相相同(包括空格格、換行行等)。能夠使使用共享享的語(yǔ)句句必須滿滿足三個(gè)個(gè)條件:①字符符級(jí)的比比較。當(dāng)前被執(zhí)執(zhí)行的語(yǔ)語(yǔ)句和共共享池中中的語(yǔ)句句必須完完全相同同。例如:SELECT*FROMATABLE;和下面面每一個(gè)個(gè)SQL語(yǔ)句都不不同:SELECT*fromATABLESelect*FromAtable;②語(yǔ)句句所指對(duì)對(duì)象必須須完全相相同即即兩條SQL語(yǔ)句操作作的數(shù)據(jù)據(jù)庫(kù)對(duì)象象必須同同一。③語(yǔ)句中中必須使使用相同同命名的的綁定變變量。如如:第一一組的兩兩個(gè)SQL語(yǔ)句是相相同的,可以以共享;;而第二二組中兩兩個(gè)語(yǔ)句句不同,,即使在在運(yùn)行時(shí)時(shí)賦予不不同的綁綁定變量以相同同的值::●第一一組selectpin,namefrompeoplewherepin=:blk1.pin;selectpin,namefrompeoplewherepin=:blk1.pin;●第二組組selectpin,namefrompeoplewherepin=:blk1.ot_jnd;selectpin,namefrompeoplewherepin=:blk1.ov_jnd;SQL語(yǔ)句的處處理過程程共享SQL區(qū)域Sql處理過程程SQLPARSE與共享SQL語(yǔ)句當(dāng)一個(gè)Oracle實(shí)實(shí)例接收收一條sql后后1、CreateaCursor創(chuàng)建游標(biāo)標(biāo)2、ParsetheStatement分析語(yǔ)句句3、DescribeResultsofaQuery描述查詢?cè)兊慕Y(jié)果果集4、DefineOutputofaQuery定義查詢?cè)兊妮敵龀鰯?shù)據(jù)5、BindAnyVariables綁定變量量6、ParallelizetheStatement并行執(zhí)行行語(yǔ)句7、RuntheStatement運(yùn)行語(yǔ)句句8、FetchRowsofaQuery取查詢出出來的行行9、ClosetheCursor關(guān)閉游標(biāo)標(biāo)為什么要要bindvariables?字符級(jí)的的比較:SELECT*FROMUSER_FILESWHEREUSER_NO=‘‘10001234’;與SELECT*FROMUSER_FILESWHEREUSER_NO=‘‘10004321’;檢查:selectname,executionsfromv$db_object_cachewherenamelike'select*fromuser_files%'什么叫做做重編譯譯問題什么叫做做重編譯譯?下面這個(gè)個(gè)語(yǔ)句每每執(zhí)行一一次就需需要在SHAREPOOL硬解析一一次,一百百萬用戶戶就是一一百萬次次,消耗耗CPU和內(nèi)存,,如果業(yè)業(yè)務(wù)量大,很很可能導(dǎo)導(dǎo)致宕庫(kù)庫(kù)……如果綁定定變量,,則只需需要硬解解析一次次,重復(fù)復(fù)調(diào)用即即可select*fromdConMsgwherecontract_no=32013484095139綁定變量量解決重重編譯問問題未使用綁綁定變量量的語(yǔ)句句sprintf(sqlstr,"insertintoscott.test1(num1,num2)values(%d,%d)",n_var1,n_var2);EXECSQLEXECUTEIMMEDIATE:sqlstr;EXECSQLCOMMIT;使用綁定定變量的的語(yǔ)句strcpy(sqlstr,"insertintotest(num1,num2)values(:v1,:v2)");EXECSQLPREPAREsql_stmtFROM:sqlstr;EXECSQLEXECUTEsql_stmtUSING:n_var1,:n_var2;EXECSQLCOMMIT;綁定變量量的注意意事項(xiàng)注意:1、不要使使用數(shù)據(jù)據(jù)庫(kù)級(jí)的的變量綁綁定參數(shù)數(shù)cursor_sharing來強(qiáng)制綁定,,無論其其值為force還是similar2、有些帶帶><的語(yǔ)句綁綁定變量量后可能能導(dǎo)致優(yōu)優(yōu)化器無無法正確確使用索引SQL語(yǔ)句的四個(gè)處理階段SQL語(yǔ)句的處理過過程解析(PARSE):SQL語(yǔ)句的處理過過程在共享池中查查找SQL語(yǔ)語(yǔ)句檢查語(yǔ)法檢查語(yǔ)義和相相關(guān)的權(quán)限合并(MERGE)視圖圖定義和子查查詢確定執(zhí)行計(jì)劃劃綁定(BIND):SQL語(yǔ)句的處理過過程在語(yǔ)句中查找找綁定變量賦值(或重新新賦值)執(zhí)行(EXECUTE):SQL語(yǔ)句的處理過過程應(yīng)用執(zhí)行計(jì)劃劃執(zhí)行必要的I/O和排序操作提取(FETCH):從查詢結(jié)果中中返回記錄必要時(shí)進(jìn)行排排序使用ARRAYFETCH機(jī)制共享游標(biāo):好好處減少解析動(dòng)態(tài)內(nèi)存調(diào)整整提高內(nèi)存使用用率書寫可共享的的SQL綁定變量和共共享游標(biāo)ORACLE優(yōu)化器模式概概述Oracle的優(yōu)化器共共有3種模式:RULE(基于規(guī)規(guī)則)、COST(基于成本)、CHOOSE(基于于選擇)。設(shè)置缺省的優(yōu)優(yōu)化器的方法法,是在啟動(dòng)動(dòng)參數(shù)文件中中針對(duì)OPTIMIZER_MODE參數(shù)的各各種聲明進(jìn)行行選擇,如RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS。當(dāng)然然也可以在SQL語(yǔ)句級(jí)別或是會(huì)會(huì)話級(jí)別對(duì)其其進(jìn)行覆蓋。。為了使用基于于成本的優(yōu)化化器(CBO,Cost—BasedOptimizer),必須經(jīng)常運(yùn)行行analyze命令,,以增加數(shù)據(jù)據(jù)庫(kù)中的對(duì)象象統(tǒng)計(jì)信息(objectstatistics)的準(zhǔn)準(zhǔn)確性。如果數(shù)據(jù)庫(kù)的的優(yōu)化器模式式設(shè)置為基于選擇,,那么實(shí)際的的優(yōu)化器模式將和是是否運(yùn)行過analyze命令有關(guān)關(guān)。如果數(shù)據(jù)據(jù)表已經(jīng)被analyze過,優(yōu)化化器模式將自自動(dòng)切換成CBO,反之之,數(shù)據(jù)庫(kù)將將采用RULE形式式的優(yōu)化器。。在缺省情況況下,Oracle采用用CHOOSE優(yōu)化器。為避免那那些不必要的的全表掃描,,必須盡量避避免使用CHOOSE優(yōu)化器,而而直接采用基基于規(guī)則或者者基于成本的的優(yōu)化器。訪問數(shù)據(jù)表的的方式①全表掃描全表掃描就是是順序地訪問問表中每條記記錄。Oracle采用一次讀入多個(gè)數(shù)據(jù)塊塊(databaseblock)的方式優(yōu)化化全表掃描。。②通過ROWID訪問表ROWID包包含了表中記記錄的物理位位置信息??煽梢圆捎没谟赗OWID的訪問方式式情況提高訪訪問表的效率率。Oracle采用索索引實(shí)現(xiàn)了數(shù)數(shù)據(jù)和存放數(shù)數(shù)據(jù)的物理位位置(ROWID)之間間的聯(lián)系通常索引提供供了快速訪問ROWID的的方法,因此此那些基于索索引列的查詢?cè)兙涂梢缘玫降叫阅艿奶岣吒?。?shù)據(jù)庫(kù)性能影響數(shù)據(jù)庫(kù)系系統(tǒng)性能的要要素:主機(jī)CPU,RAM,存儲(chǔ)系統(tǒng);OS參數(shù)配置,ORACLE參數(shù)配置;應(yīng)用方面:數(shù)數(shù)據(jù)庫(kù)設(shè)計(jì)及及SQL編程的質(zhì)量一個(gè)性能優(yōu)秀秀的應(yīng)用系統(tǒng)統(tǒng)需要:良好的硬件配配置;正確合理的數(shù)數(shù)據(jù)庫(kù)及中間間件參數(shù)配置置;合理的數(shù)據(jù)庫(kù)庫(kù)設(shè)計(jì);良好的sql編程;運(yùn)行期的性能能優(yōu)化SQLTunning的重點(diǎn)SQL:insert,update,delete,select;主要關(guān)注的是是select關(guān)注的是:如如何用最小的的硬件資源消消耗、最少的的響應(yīng)時(shí)間定定位數(shù)據(jù)位置置SQL優(yōu)化的一般性性原則目標(biāo):減少服務(wù)器資資源消耗(主主要是磁盤IO);設(shè)計(jì)方面:盡量依賴oracle的優(yōu)化器,并并為其提供條條件;合適的索引,,索引的雙重重效應(yīng),列的的選擇性;編碼方面:利用索引,避避免大表FULLTABLESCAN;合理使用臨臨時(shí)表;避免寫過于于復(fù)雜的sql,不一定非非要一個(gè)sql解決問題;;在不影響業(yè)業(yè)務(wù)的前提提下減小事事務(wù)的粒度度;優(yōu)化概括課程Oracle數(shù)據(jù)庫(kù)SQL語(yǔ)句優(yōu)化的的總體策略略。以這些些優(yōu)化策略為為指導(dǎo),通通過經(jīng)驗(yàn)總總結(jié),我們們可以不斷斷地豐富優(yōu)優(yōu)化方案,進(jìn)進(jìn)而指導(dǎo)我我們進(jìn)行應(yīng)應(yīng)用系統(tǒng)的的數(shù)據(jù)庫(kù)性性能優(yōu)化。。以下枚舉幾幾則被證明明行之有效效的優(yōu)化方方案:●創(chuàng)建表表的時(shí)候。。應(yīng)盡量建建立主鍵,,盡量根據(jù)據(jù)實(shí)際需要要調(diào)整數(shù)據(jù)據(jù)表的PCTFREE和PCTUSED參數(shù);大數(shù)數(shù)據(jù)表刪除除,用truncatetable代替delete?!窈侠硎故褂盟饕?,在OLTP應(yīng)用中一張張表的索引引不要太多多。數(shù)據(jù)重重復(fù)量大的的列不要建建立二叉樹樹索引,可可以采用位位圖索引;;組合索引引的列順序序盡量與查查詢條件列列順序保持持一致;對(duì)對(duì)于數(shù)據(jù)操操作頻繁的的表,索引引需要定期期重建,以以減少失效效的索引和和碎片。優(yōu)化概括●查詢盡量用用確定的列列名,少用用*號(hào)。selectcount(key)fromtabwherekey>0性能優(yōu)于selectcount(*)fromtab;盡量少嵌套套子查詢,,這種查詢?cè)儠?huì)消耗大大量的CPU資源;對(duì)于于有比較多多or運(yùn)算的查詢?cè)?,建議分分成多個(gè)查查詢,用unionall聯(lián)結(jié)起來;;多表查詢?cè)兊牟樵冋Z(yǔ)句句中,選擇擇最有效率率的表名順順序。Oracle解析器對(duì)表表解析從右到左,所所以記錄少少的表放在在右邊?!癖M量多多用commit語(yǔ)句提交事事務(wù),可以以及時(shí)釋放放資源、解解鎖、釋放日日志空間、、減少管理理花費(fèi);在在頻繁的、、性能要求求比較高的的數(shù)據(jù)操作中中,盡量避避免遠(yuǎn)程訪訪問,如數(shù)數(shù)據(jù)庫(kù)鏈等等,訪問頻頻繁的表可可以常駐內(nèi)存存:altertable...cache;●在Oracle中動(dòng)態(tài)執(zhí)行行SQL,盡量用execute方式,不用用dbms_sql包。**SQLTunningTips**sql語(yǔ)句的編寫寫原則和優(yōu)優(yōu)化隨著數(shù)據(jù)庫(kù)庫(kù)中數(shù)據(jù)的的增加,系系統(tǒng)的響應(yīng)應(yīng)速度就成成為目前系系統(tǒng)需要解解決的最主主要的問題題之一。系系統(tǒng)優(yōu)化中中一個(gè)很重重要的方面面就是SQL語(yǔ)句的優(yōu)化化。對(duì)于大大量數(shù)據(jù),,劣質(zhì)SQL語(yǔ)句和優(yōu)質(zhì)質(zhì)SQL語(yǔ)句之間的的速度差別別可以達(dá)到到上百倍,,對(duì)于一個(gè)個(gè)系統(tǒng)不是是簡(jiǎn)單地能能實(shí)現(xiàn)其功功能就可,,而是要寫寫出高質(zhì)量量的SQL語(yǔ)句,提高高系統(tǒng)的可可用性。在多數(shù)情況況下,Oracle使用索引來來更快地遍遍歷表,優(yōu)優(yōu)化器主要要根據(jù)定義義的索引來來提高性能能。如果在在SQL語(yǔ)句的where子句中寫的的SQL代碼不合理理,就會(huì)造造成優(yōu)化器器刪去索引引而使用全全表掃描,,一般就這這種SQL語(yǔ)句就是所所謂的劣質(zhì)SQL語(yǔ)句。sql語(yǔ)句的編寫寫原則和優(yōu)優(yōu)化在編寫SQL語(yǔ)句時(shí)我們們應(yīng)清楚優(yōu)優(yōu)化器根據(jù)據(jù)何種原則則來使用索索引,這有有助于寫出出高性能的的SQL語(yǔ)句。SQL語(yǔ)句的編寫寫原則和SQL語(yǔ)句的優(yōu)化化,請(qǐng)跟我我一起學(xué)習(xí)習(xí)以下幾方方面:TunningTip的各個(gè)方面面1.不要讓Oracle做得太多;;2.給優(yōu)化器更更明確的命命令;3.減少訪問次次數(shù);4.細(xì)節(jié)上的影影響;1.不要讓Oracle做得太多避免復(fù)雜的的多表關(guān)聯(lián)聯(lián)select…fromuser_filesuf,df_money_filesdm,cw_charge_recordccwhereuf.user_no=dm.user_noanddm.user_no=cc.user_noand………andnotexists(select…)???很難優(yōu)化,,隨著數(shù)據(jù)據(jù)量的增加加性能的風(fēng)風(fēng)險(xiǎn)很大。。避免使用‘‘*‘當(dāng)你想在SELECT子句中列出出所有的COLUMN時(shí),使用動(dòng)態(tài)SQL列引用‘‘*’是是一個(gè)方便便的方法.不幸的是,這是一個(gè)非非常低效的方法.實(shí)際上,ORACLE在解析的過過程中,會(huì)將’*’’依次轉(zhuǎn)轉(zhuǎn)換成所有的的列名,這個(gè)工作是是通過查詢?cè)償?shù)據(jù)字典典完成的,這意味著將耗費(fèi)費(fèi)更多的時(shí)時(shí)間;只提取你所所要使用的的列;使用別名能能夠加快解解析速度;;避免使用耗耗費(fèi)資源的的操作帶有DISTINCT,UNION,MINUS,INTERSECT,ORDERBY的SQL語(yǔ)句會(huì)啟動(dòng)動(dòng)SQL引擎執(zhí)行耗耗費(fèi)資源的的排序(SORT)功能.DISTINCT需要一次排排序操作,而其他的至至少需要執(zhí)執(zhí)行兩次排序.例如,一個(gè)UNION查詢,其中每個(gè)查查詢都帶有有GROUPBY子句,GROUPBY會(huì)觸發(fā)嵌入入排序(NESTEDSORT);這樣,每個(gè)查詢需要執(zhí)執(zhí)行一次排排序,然后在執(zhí)行行UNION時(shí),又一個(gè)唯一一排序(SORTUNIQUE)操作被執(zhí)行行而且它只只能在前面面的嵌入排序結(jié)束后后才能開始始執(zhí)行.嵌入的排序序的深度會(huì)會(huì)大大影響響查詢的效率.通常,帶有UNION,MINUS,INTERSECT的SQL語(yǔ)句都可以以用其他方式式重寫.用EXISTS替換DISTINCT例如:低效:SELECTDISTINCTDEPT_NO,DEPT_NAMEFROMDEPTD,EMPEWHERED.DEPT_NO=E.DEPT_NO高效:SELECTDEPT_NO,DEPT_NAMEFROMDEPTDWHEREEXISTS(SELECT‘X’’FROMEMPEWHEREE.DEPT_NO=D.DEPT_NO);用UNION-ALL替換UNION(ifpossible)當(dāng)SQL語(yǔ)句需要UNION兩個(gè)查詢結(jié)結(jié)果集合時(shí)時(shí),這兩個(gè)結(jié)果果集合會(huì)以以UNION-ALL的方式被合合并,然后在輸出出最終結(jié)果果前進(jìn)行排排序.舉例:低效:SELECTACCT_NUM,BALANCE_AMTFROMDEBIT_TRANSACTIONSWHERETRAN_DATE=’31-DEC-95’’UNIONSELECTACCT_NUM,BALANCE_AMTFROMDEBIT_TRANSACTIONSWHERETRAN_DATE=’31-DEC-95’’高效:SELECTACCT_NUM,BALANCE_AMTFROMDEBIT_TRANSACTIONSWHERETRAN_DATE=’31-DEC-95’’UNIONALLSELECTACCT_NUM,BALANCE_AMTFROMDEBIT_TRANSACTIONSWHERETRAN_DATE=’31-DEC-95’’2.給優(yōu)化器更更明確的命命令自動(dòng)選擇索索引如果表中有有兩個(gè)以上上(包括兩兩個(gè))索引引,其中有有一個(gè)唯一一性索引,而其其他是非唯唯一性.在這種情況況下,ORACLE將使用唯一一性索引而而完全忽略略非唯一性索引..舉例:SELECTENAMEFROMEMPWHEREEMPNO=2326ANDDEPTNO=20;這里,只有有EMPNO上的索引是是唯一性的的,所以EMPNO索引將用來檢檢索記錄..TABLEACCESSBYROWIDONEMPINDEXUNIQUESCANONEMP_NO_IDX至少要包含含組合索引引的第一列列如果索引是是建立在多多個(gè)列上,只有在它的的第一個(gè)列列(leadingcolumn)被where子句引用時(shí)時(shí),優(yōu)化器才會(huì)會(huì)選擇使用用該索引.SQL>createtablemultiindexusage(indanumber,indbnumber,descrvarchar2(10));Tablecreated.SQL>createindexmultindexonmultiindexusage(inda,indb);Indexcreated.SQL>setautotracetraceonlySQL>select*frommultiindexusagewhereinda=1;ExecutionPlan----------------------------------------------------------0SELECTSTATEMENTOptimizer=CHOOSE10TABLEACCESS(BYINDEXROWID)OF'MULTIINDEXUSAGE'21INDEX(RANGESCAN)OF'MULTINDEX'(NON-UNIQUE)SQL>select*frommultiindexusagewhereindb=1;ExecutionPlan----------------------------------------------------------0SELECTSTATEMENTOptimizer=CHOOSE10TABLEACCESS(FULL)OF'MULTIINDEXUSAGE'很明顯,當(dāng)僅引用索索引的第二二個(gè)列時(shí),優(yōu)化器使用用了全表掃掃描而忽略略了索引避免在索引引列上使用用函數(shù)WHERE子句中,如如果索引列列是函數(shù)的的一部分..優(yōu)化器將將不使用索引而而使用全表表掃描.舉例:低效:SELECT…FROMDEPTWHERESAL*12>25000;高效:SELECT…FROMDEPTWHERESAL>25000/12;避免使用前前置通配符符WHERE子句中,如果索引列列所對(duì)應(yīng)的的值的第一一個(gè)字符由由通配符(WILDCARD)開始,索引將不被被采用.SELECTUSER_NO,USER_NAME,ADDRESSFROMUSER_FILESWHEREUSER_NOLIKE'%109204421';在這種情況況下,ORACLE將使用全表表掃描.避免在索引引列上使用用NOT通常,我們們要避免在在索引列上上使用NOT,NOT會(huì)產(chǎn)生在和和在索引列上使使用函數(shù)相相同的影響響.當(dāng)ORACLE””遇到到””NOT,他就就會(huì)停停止止使使用用索索引引轉(zhuǎn)轉(zhuǎn)而而執(zhí)執(zhí)行行全全表表掃掃描描.舉例例:低效效:(這里里,不使使用用索索引引)SELECT……FROMDEPTWHEREDEPT_CODENOT=0;高效:(這里,使用了索索引)SELECT……FROMDEPTWHEREDEPT_CODE>0;避免在索索引列上上使用ISNULL和ISNOTNULL避免在索索引中使使用任何何可以為為空的列列,ORACLE將無法使使用該索引..對(duì)于單單列索引引,如果果列包含含空值,,索引中中將不存存在此記記錄.對(duì)于復(fù)合合索引,,如果每每個(gè)列都都為空,,索引中中同樣不不存在此此記錄.如果至少少有一個(gè)個(gè)列不為為空,則則記錄存存在于索索引中..如果唯一一性索引引建立在在表的A列和B列上,并且表中中存在一一條記錄的A,B值為(123,null),ORACLE將不接受受下一條條具有相相同A,B值(123,null)的記錄錄(插入).然而如果果所有的的索引列列都為空,ORACLE將認(rèn)為整整個(gè)鍵值值為空而而空不等等于空.因此你可可以插入1000條具有相相同鍵值值的記錄錄,當(dāng)然它們們都是空空!因?yàn)榭罩抵挡淮嬖谠谟谒饕兄?所以WHERE子句中對(duì)對(duì)索引列列進(jìn)行空值比較較將使ORACLE停用該索索引.任何在where子句中使使用isnull或isnotnull的語(yǔ)句優(yōu)優(yōu)化器是是不允許使使用索引引的。避免出現(xiàn)現(xiàn)索引列列自動(dòng)轉(zhuǎn)轉(zhuǎn)換當(dāng)比較不不同數(shù)據(jù)據(jù)類型的的數(shù)據(jù)時(shí)時(shí),ORACLE自動(dòng)對(duì)列列進(jìn)行簡(jiǎn)簡(jiǎn)單的類型轉(zhuǎn)轉(zhuǎn)換.假設(shè)EMP_TYPE是一個(gè)字符符類型的索索引列.SELECTUSER_NO,USER_NAME,ADDRESSFROMUSER_FILESWHEREUSER_NO=109204421這個(gè)語(yǔ)句被被ORACLE轉(zhuǎn)換為:SELECTUSER_NO,USER_NAME,ADDRESSFROMUSER_FILESWHERETO_NUMBER(USER_NO)=109204421因?yàn)閮?nèi)部發(fā)發(fā)生的類型型轉(zhuǎn)換,這個(gè)索引將將不會(huì)被用用到!在查詢時(shí)盡盡量少用格格式轉(zhuǎn)換如用WHEREa.order_no=b.order_no不用WHERETO_NUMBER(substr(a.order_no,instr(b.order_no,'.')-1)=TO_NUMBER(substr(a.order_no,instr(b.order_no,'.')-1)3.減少訪問次次數(shù)減少訪問數(shù)數(shù)據(jù)庫(kù)的次次數(shù)當(dāng)執(zhí)行每條條SQL語(yǔ)句時(shí),ORACLE在內(nèi)部執(zhí)行行了許多工工作:解析SQL語(yǔ)句,估算索引的的利用率,綁定變量,讀數(shù)據(jù)塊等等等.由此可見,減少訪問數(shù)數(shù)據(jù)庫(kù)的次次數(shù),就能實(shí)際上上減少ORACLE的工作量.類比,工程程實(shí)施使用DECODE來減少處理理時(shí)間例如:SELECTCOUNT(*),SUM(SAL)FROMEMPWHEREDEPT_NO=0020ANDENAMELIKE‘SMITH%’;SELECTCOUNT(*),SUM(SAL)FROMEMPWHEREDEPT_NO=0030ANDENAMELIKE‘SMITH%’;你可以用DECODE函數(shù)高效地地得到相同同結(jié)果SELECTCOUNT(DECODE(DEPT_NO,0020,’X’,NULL))D0020_COUNT,COUNT(DECODE(DEPT_NO,0030,’X’’,NULL))D0030_COUNT,SUM(DECODE(DEPT_NO,0020,SAL,NULL))D0020_SAL,SUM(DECODE(DEPT_NO,0030,SAL,NULL))D0030_SALFROMEMPWHEREENAMELIKE‘SMITH%’;減少對(duì)表的的查詢?cè)诤凶硬椴樵兊腟QL語(yǔ)句中,要特別注意意減少對(duì)表表的查詢.例如:低效SELECTTAB_NAMEFROMTABLESWHERETAB_NAME=(SELECTTAB_NAMEFROMTAB_COLUMNSWHEREVERSION=604)ANDDB_VER=(SELECTDB_VERFROMTAB_COLUMNSWHEREVERSION=604)高效SELECTTAB_NAMEFROMTABLESWHERE(TAB_NAME,DB_VER)=(SELECTTAB_NAME,DB_VER)FROMTAB_COLUMNSWHEREVERSION=604)4.細(xì)節(jié)上的影影響WHERE子句中的連連接順序ORACLE采用自下而而上的順序序解析WHERE子句,根據(jù)這個(gè)原原理,當(dāng)在WHERE子句中有多多個(gè)表聯(lián)接接時(shí),WHERE子句中排在最后的表表應(yīng)當(dāng)是返返回行數(shù)可可能最少的的表,有過過濾條件的的子句應(yīng)放在WHERE子句中的最最后。如:設(shè)從emp表查到的數(shù)數(shù)據(jù)比較少少或該表的的過濾條件件比較確定定,能大大大縮小查詢?cè)兎秶?,則則將最具有有選擇性部部分放在WHERE子句中的最最后:select*fromempe,deptdwhered.deptno>10ande.deptno=30;如果dept表返回的記記錄數(shù)較多多的話,上上面的查詢?cè)冋Z(yǔ)句會(huì)比比下面的查查詢語(yǔ)句響響應(yīng)快得多多。select*fromempe,deptdwheree.deptno=30andd.deptno>10;WHERE子句——函數(shù)、表達(dá)達(dá)式使用最好不要在在WHERE子句中中使用函或或表達(dá)式,,如果要使使用的話,,最好統(tǒng)一一使用相同同的表達(dá)式式或函數(shù),,這樣便于于以后使用用合理的索索引。Orderby語(yǔ)句ORDERBY語(yǔ)句決定了了Oracle如何將返回回的查詢結(jié)結(jié)果排序。。Orderby語(yǔ)句對(duì)要排排序的列沒沒有什么特特別的限制制,也可以以將函數(shù)加加入列中((象聯(lián)接或或者附加等等)。任何在Orderby語(yǔ)句的非索索引項(xiàng)或者者有計(jì)算表表達(dá)式都將將降低查詢?cè)兯俣?。仔?xì)檢查orderby語(yǔ)句以找出出非索引項(xiàng)項(xiàng)或者表達(dá)達(dá)式,它們們會(huì)降低性性能。解決決這個(gè)問題題的辦法就就是重寫orderby語(yǔ)句以使用用索引,也也可以為所所使用的列列建立另外外一個(gè)索引引,同時(shí)應(yīng)應(yīng)絕對(duì)避免免在orderby子句中使用用表達(dá)式。。聯(lián)接列對(duì)于有聯(lián)接接的列,即即使最后的的聯(lián)接值為為一個(gè)靜態(tài)態(tài)值,優(yōu)化化器是不會(huì)使用用索引的。。select*fromemploysswherefirst_name||''||last_name='BeillCliton';系統(tǒng)優(yōu)化器對(duì)對(duì)基于last_name創(chuàng)建的索引沒沒有使用。當(dāng)采用下面這這種SQL語(yǔ)句的編寫,,Oracle系統(tǒng)就可以采采用基于last_name創(chuàng)建的索引。。select*fromemployeewherefirst_name='Beill'andlast_name='Cliton';帶通配符(%)的like語(yǔ)句通配符(%)在搜尋詞首首出現(xiàn),Oracle系統(tǒng)不使用last_name的索引。select*fromemployeewherelast_namelike'%cliton%';在很多情況下下可能無法避避免這種情況況,但是一定定要心中有底底,通配符如此此使用會(huì)降低低查詢速度。。然而當(dāng)通配配符出現(xiàn)在字字符串其他位置置時(shí),優(yōu)化器器就能利用索索引。在下面面的查詢中索索引得到了使用用:select*fromemployeewherelast_namelike'c%';用Where子句替換HAVING子句避免使用HAVING子句,HAVING只會(huì)在檢索出出所有記錄之之后才對(duì)結(jié)果果集進(jìn)行過濾.這個(gè)處理需要要排序,總計(jì)等操作.如果能通過WHERE子句限制記錄的數(shù)目目,那就能減少這這方面的開銷銷.例如:低效:SELECTREGION,AVG(LOG_SIZE)FROMLOCATIONGROUPBYREGIONHAVINGREGIONREGION!=‘SYDNEY’ANDREGION!=‘PERTH’’高效SELECTREGION,AVG(LOG_SIZE)FROMLOCATIONWHEREREGIONREGION!=‘SYDNEY’’ANDREGION!=‘PERTH’’GROUPBYREGION順序WHERE>GROUP>HAVING用NOTEXISTS替代NOTIN在子查詢中,NOTIN子句將執(zhí)行一一個(gè)內(nèi)部的排排序和合并.無論在哪種情情況下,NOTIN都是最低效的的(因?yàn)樗鼘?duì)子查查詢中的表執(zhí)執(zhí)行了一個(gè)全全表遍歷).使用NOTEXISTS子句可可以有效地利利用索引。盡盡可能使用NOTEXISTS來代替NOTIN,盡盡管二者都使使用了NOT(不能使用用索引而降低低速度),NOTEXISTS要要比NOTIN查詢效效率更高。例如:語(yǔ)句1SELECTdname,deptnoFROMdeptWHEREdeptnoNOTIN(SELECTdeptnoFROMemp);語(yǔ)句2SELECTdname,deptnoFROMdeptWHERENOTEXISTS(SELECTdeptnoFROMempWHEREdept.deptno=emp.deptno);2要比1的執(zhí)行性能好好很多。因?yàn)?中對(duì)emp進(jìn)行了fulltablescan,這是很浪費(fèi)時(shí)時(shí)間的操作。。而且1中沒有用到emp的index,因?yàn)闆]有有where子句。而2中的語(yǔ)句對(duì)emp進(jìn)行的是縮小小范圍的查詢?cè)?。用索引提高效效率索引是表的一一個(gè)概念部分分,用來提高檢索索數(shù)據(jù)的效率率,ORACLE使用了一個(gè)復(fù)雜雜的自平衡B-tree結(jié)構(gòu).通常,通過索引查詢?cè)償?shù)據(jù)比全表表掃描要快.當(dāng)ORACLE找出執(zhí)行查詢?cè)兒蚒pdate語(yǔ)句的最佳路路徑時(shí),ORACLE優(yōu)化器將使用用索引.同樣在聯(lián)結(jié)多多個(gè)表時(shí)使用用索引也可以以提高效率.另一個(gè)使用索索引的好處是是,它提供了主鍵鍵(primarykey)的唯一性驗(yàn)證證。通常,在大型表中使使用索引特別別有效.當(dāng)然,你也會(huì)發(fā)現(xiàn),在掃描小表時(shí),使用索引同樣樣能提高效率率.雖然使用索引引能得到查詢?cè)冃实奶岣?但是我們也必必須注意到它它的代價(jià).索引需要空間間來存儲(chǔ),也需要定期維護(hù),每當(dāng)有記錄在在表中增減或或索引列被修修改時(shí),索引本身也會(huì)被修改.這意味著每條條記錄的INSERT,DELETE,UPDATE將為此多付出4,5次的磁盤I/O.因?yàn)樗饕枰~外的存儲(chǔ)儲(chǔ)空間和處理理,那些不必要的的索引反而會(huì)會(huì)使查詢反應(yīng)應(yīng)時(shí)間變慢.。定期的重構(gòu)構(gòu)索引是有必要的。。避免在索引列列上使用計(jì)算算WHERE子句中,如果果索引列是函函數(shù)的一部分分.優(yōu)化器將將不使用索引而使使用全表掃描描.低效:SELECT…FROMDEPTWHERESAL*12>25000;高效:SELECT…FROMDEPTWHERESAL>25000/12;用>=替代>如果DEPTNO上有一個(gè)索引引。高效:SELECT*FROMEMPWHEREDEPTNO>=4低效:SELECT*FROMEMPWHEREDEPTNO>3通過使用>=、<=等,避免使用用NOT命令例子:select*fromemployeewheresalary<>3000;對(duì)這個(gè)查詢,,可以改寫為為不使用NOT:select*fromemployeewheresalary<3000orsalary>3000;雖然這兩種查查詢的結(jié)果一一樣,但是第第二種查詢方方案會(huì)比第一一種查詢方案案更快些。第第二種查詢?cè)试试SOracle對(duì)salary列使用索引,,而第一種查查詢則不能使使用索引。如果有其它辦辦法,不要使使用子查詢。。外部聯(lián)接"+"的用法外部聯(lián)接"+"按其在"="的左邊或右邊邊分左聯(lián)接和和右聯(lián)接。若若不帶"+"運(yùn)算符的表中中的一個(gè)行不不直接匹配于于帶"+"預(yù)算符的表中中的任何行,,則前者的行行與后者中的的一個(gè)空行相相匹配并被返返回。利用外外部聯(lián)接"+",可以替代效效率十分低下下的notin運(yùn)算,大大提提高運(yùn)行速度度。例如,下下面這條命令令執(zhí)行起來很很慢:selecta.empnofromempawherea.empnonotin(selectempnofromemp1wherejob='SALE');利用外部聯(lián)接接,改寫命令令如下:selecta.empnofromempa,emp1bwherea.empno=b.empno(+)andb.empnoisnullandb.job='SALE';這樣運(yùn)行速度度明顯提高.盡量多使用COMMIT事務(wù)是消耗資資源的,大事事務(wù)還容易引引起死鎖COMMIT所釋放的資源源:回滾段上用于于恢復(fù)數(shù)據(jù)的的信息.被程序語(yǔ)句獲獲得的鎖redologbuffer中的空間ORACLE為管理上述3種資源中的內(nèi)內(nèi)部花費(fèi)用TRUNCATE替代DELETE當(dāng)刪除表中的的記錄時(shí),在通常情況下下,回滾段(rollbacksegments)用來存放可以以被恢復(fù)的信信息.如果你沒有COMMIT事務(wù),ORACLE會(huì)將數(shù)據(jù)恢復(fù)復(fù)到刪除之前前的狀態(tài)(準(zhǔn)確地說是恢復(fù)復(fù)到執(zhí)行刪除除命令之前的的狀況)而當(dāng)運(yùn)用TRUNCATE時(shí),回滾段不再存存放任何可被被恢復(fù)的信息.當(dāng)命令運(yùn)行后后,數(shù)據(jù)不能被恢恢復(fù).因此很少的資資源被調(diào)用,執(zhí)行時(shí)間也會(huì)會(huì)很短.計(jì)算記錄條數(shù)數(shù)和一般的觀點(diǎn)點(diǎn)相反,count(*)比count(1)稍快,當(dāng)然如果可以通過索引檢檢索,對(duì)索引列的計(jì)計(jì)數(shù)仍舊是最最快的.例如COUNT(EMPNO)字符型字段的的引號(hào)比如有的表PHONE_NO字段是CHAR型,而且創(chuàng)建有索索引,但在WHERE條件中忘記了了加引號(hào),就就不會(huì)用到索索引。WHEREPHONE_NO=‘WHEREPHONE_NO化EXPORT和IMPORT使用較大的BUFFER(比如10MB,10,240,000)可以提高EXPORT和IMPORT的速度;ORACLE將盡可能地獲獲取你所指定定的內(nèi)存大小小,即使在內(nèi)存不滿足,也不會(huì)報(bào)錯(cuò).這個(gè)值至少要要和表中最大大的列相當(dāng),否則列值會(huì)被截?cái)鄶?**優(yōu)化Tools**SQL語(yǔ)句的執(zhí)行步步驟語(yǔ)法分析,,分析語(yǔ)句的的語(yǔ)法是否符符合規(guī)范,衡衡量語(yǔ)句中各各表達(dá)式的意意義。語(yǔ)義分析,,檢查語(yǔ)句中中涉及的所有有數(shù)據(jù)庫(kù)對(duì)象象是否存在,,且用戶有相相應(yīng)的權(quán)限。。視圖轉(zhuǎn)換,將將涉及視圖的的查詢語(yǔ)句轉(zhuǎn)轉(zhuǎn)換為相應(yīng)的的對(duì)基表查詢?cè)冋Z(yǔ)句。表達(dá)式轉(zhuǎn)換,,將復(fù)雜的的SQL表達(dá)式轉(zhuǎn)換為為較簡(jiǎn)單的等等效連接表達(dá)達(dá)式。選擇優(yōu)化器,,不同的優(yōu)化化器一般產(chǎn)生生不同的“執(zhí)執(zhí)行計(jì)劃”選擇連接方式式,ORACLE有三種連接方方式,對(duì)多表表連接ORACLE可選擇適當(dāng)?shù)牡倪B接方式。。選擇連接順序序,對(duì)多表表連接ORACLE選擇哪一對(duì)表表先連接,選選擇這兩表中中哪個(gè)表做為為源數(shù)據(jù)表。。選擇數(shù)據(jù)的搜搜索路徑,根根據(jù)以上條條件選擇合適適的數(shù)據(jù)搜索索路徑,如是是選用全表搜搜索還是利用用索引或是其其他的方式。。運(yùn)行“執(zhí)行計(jì)計(jì)劃”優(yōu)化器與執(zhí)行行計(jì)劃Oracle在執(zhí)行一個(gè)SQL之前,首先要分析一一下語(yǔ)句的執(zhí)執(zhí)行計(jì)劃,然后再按執(zhí)行行計(jì)劃去執(zhí)行行。分析語(yǔ)句句的執(zhí)行計(jì)劃劃的工作是由優(yōu)優(yōu)化器器(Optimizer)來完成成的Oracle的優(yōu)化化器共共有兩兩種的的優(yōu)化化方式式,即基于規(guī)規(guī)則的的優(yōu)化化方式(Rule-BasedOptimization,簡(jiǎn)稱為為RBO)和基于代代價(jià)的的優(yōu)化方式式(Cost-BasedOptimization,簡(jiǎn)稱為為CBO)。A、RBO方式::優(yōu)化化器在在分析析SQL語(yǔ)句時(shí)時(shí),所遵循循的是是Oracle內(nèi)部預(yù)預(yù)定的一些些規(guī)則則。比比如我我們常常見的的,當(dāng)一個(gè)個(gè)where子句中中的一一列有有索引引時(shí)去去走索引。。B、CBO方式::是看看語(yǔ)句句的代代價(jià)(Cost)了,這里的的代價(jià)價(jià)主要要指Cpu和內(nèi)存存。優(yōu)化化器在在判斷斷是否否用這這種方方式時(shí)時(shí),主要參參照的的是表表及索索引的的統(tǒng)計(jì)計(jì)信息息,很多的的時(shí)侯侯過期期統(tǒng)計(jì)計(jì)信息息會(huì)令令優(yōu)化化器做做出一一個(gè)錯(cuò)錯(cuò)誤的的執(zhí)行行計(jì)劃劃在Oracle8及以后后的版版本,Oracle推薦用用CBO的方式式。在Oracle10g中,取消了了RBO的支持持。優(yōu)化器器與執(zhí)執(zhí)行計(jì)計(jì)劃Rule:即走基基于規(guī)規(guī)則的的方式式Choose:默認(rèn)的的情況況下Oracle用的便便是這這種方方式。。當(dāng)一一個(gè)表表或或或索引引有統(tǒng)計(jì)信信息,則走CBO的方式式,如果表表或索索引沒沒統(tǒng)計(jì)計(jì)信息息,表又不不是特特別的的小,而且相相應(yīng)的的列有有索引引時(shí),那么就就走索索引,走RBO的方式式FirstRows:它與Choose方式是是類似似的,所不同同的是是當(dāng)一一個(gè)表表有統(tǒng)統(tǒng)計(jì)信信息時(shí),它將是是以最最快的的方式式返回回查詢?cè)兊淖钭钕鹊牡膸仔行?從總體體上減減少了了響應(yīng)應(yīng)時(shí)間AllRows:all_rows是oracle優(yōu)化器器默認(rèn)認(rèn)的模模式,它將選選擇一一種在在最短短時(shí)間內(nèi)返返回所所有數(shù)數(shù)據(jù)的的執(zhí)行行計(jì)劃劃,它將基基于整整體成成本的的考慮慮.first_rows_n:first_rows_n是根據(jù)據(jù)成本本而不不是基基于硬硬編碼碼的規(guī)規(guī)則來來選擇擇執(zhí)行計(jì)計(jì)劃.n可以是是1,10,100,1000或者直直接用用first_rows(n)hint指定任任意正數(shù).這里的的n是我們們想獲獲取結(jié)結(jié)果集集的前前n條記錄錄,這種需需求在在很多多分頁(yè)頁(yè)語(yǔ)句的需需求中中會(huì)碰碰到.用EXPLAINPLAN分析SQL語(yǔ)句EXPLAINPLAN是一個(gè)個(gè)很好好的分分析SQL語(yǔ)句的的工具具,它甚至至可以在在不執(zhí)執(zhí)行SQL的情況況下分分析語(yǔ)語(yǔ)句.通過分分析,我們就就可以以知道ORACLE是怎么么樣連連接表表,使用什什么方方式掃掃描表表(索引掃掃描或全全表掃掃描)以及使使用到到的索索引名名稱.你需要要按照照從里里到外外,從上到到下的的次序序解讀讀分析析的結(jié)結(jié)果.EXPLAINPLAN分析的的結(jié)果果是用用縮進(jìn)進(jìn)的格格式排排列的的,最內(nèi)部部的操作作將被被最先先解讀讀,如果兩兩個(gè)操操作處處于同同一層層中,帶有最最小操作號(hào)號(hào)的將將被首首先執(zhí)執(zhí)行.NESTEDLOOP是少數(shù)數(shù)不按按照上上述規(guī)規(guī)則處處理的的操作作,正確的的執(zhí)行路路徑是是檢查查對(duì)NESTEDLOOP提供數(shù)數(shù)據(jù)的的操作作,其中操操作號(hào)最最小的的將被被最先先處理理.Autotrace解讀Currentmode:對(duì)于修修改的的數(shù)據(jù)據(jù)從數(shù)數(shù)據(jù)段段中讀讀Read-consistentmode:讀一致致性模模式Physicalblock:物理塊塊(如如8192字節(jié)))Recursivecalls:嵌套調(diào)調(diào)用次次數(shù)使用TKPROF工具SQLtrace工具收收集正正在執(zhí)執(zhí)行的的SQL的性能能狀態(tài)態(tài)數(shù)據(jù)據(jù)并記記錄到到一個(gè)跟跟蹤文文件中中.這個(gè)跟跟蹤文文件提提供了了許多多有用用的信信息,例如解解析次數(shù).執(zhí)行次數(shù),CPU使用時(shí)間等等.這些數(shù)據(jù)將將可以用來來優(yōu)化你的系統(tǒng).設(shè)置SQLTRACE在會(huì)話級(jí)別別:有效ALTERSESSIONSETSQL_TRACETRUE設(shè)置SQLTRACE在整個(gè)數(shù)據(jù)據(jù)庫(kù)有效,你必須將SQL_TRACE參數(shù)在init.ora中設(shè)為TRUE,USER_DUMP_DEST參數(shù)說明了了生成跟蹤文文件的目錄錄再使用TKPROF對(duì)TRACE文件進(jìn)行分分析分析結(jié)果更更加準(zhǔn)確、、清楚在SQLPLUS配置AUTOTRACEAUTOTRACE參數(shù)解釋SETAUTOTRACEOFF不能獲得AUTOTRACE報(bào)告.這是默認(rèn)的.SETAUTOTRACEONEXPLAIN僅僅顯示優(yōu)化器執(zhí)行計(jì)劃的AUTOTRACE報(bào)告SETAUTOTRACEONSTATISTICS僅僅顯示SQL語(yǔ)句執(zhí)行的統(tǒng)計(jì)結(jié)果的AUTOTRACE報(bào)告SETAUTOTRACEON包括上面兩項(xiàng)內(nèi)容的AUTOTRACE報(bào)告SETAUTOTRACETRACEONLY與SETAUTOTRACEON類似,所有的統(tǒng)計(jì)和數(shù)據(jù)都在,但不可以打印在SQLPLUS配置AUTOTRACE1、首先創(chuàng)建PLUSTRACE角色并且賦賦給public:Sql>@$ORACLE_HOME/sqlplus/admin/plustrce.sql2、賦權(quán)限限給用戶Sql>grantplustracetopublic(預(yù)賦權(quán)的的用戶名));3、以SYSTEM用戶創(chuàng)建PLAN_TABLE表Sql>@$ORACLE_HOME/rdbms/admin/utlxplan.sqlSql>createpublicsynonymplan_tableforplan_table;Sql>grantallonplan_tabletopublic;在每個(gè)用戶戶下設(shè)置AUTOTRACE可顯示其執(zhí)執(zhí)行計(jì)劃。。優(yōu)化器與執(zhí)執(zhí)行計(jì)劃SQL>selectename,dnamefromemp,deptwhereemp.deptno=dept.deptnoanddept.dnamein('ACCOUNTING','RESEARCH','SALES','OPERATIONS');ExecutionPlan
----------------------------------------------------------0SELECTSTATEMENTOptimizer=CHOOSE10NESTEDLOOPS21TABLEACCESS(FULL)OF'EMP'31TABLEACCESS(BYINDEXROWID)OF'DEPT'43INDEX(UNIQUESCAN)OF'PK_DEPT'(UNIQUE)最起碼要解解決全表掃掃描問題改變where條件的次序序一般沒有有用目錄優(yōu)化基礎(chǔ)知知識(shí)性能調(diào)整綜綜述有效的應(yīng)用用設(shè)計(jì)SQL語(yǔ)句的處理理過程Oracle的優(yōu)化器Oracle的執(zhí)行計(jì)劃劃注意事項(xiàng)性能調(diào)整綜綜述誰來調(diào)整系系統(tǒng)?什么時(shí)候調(diào)調(diào)整?建立有效調(diào)調(diào)整的目標(biāo)標(biāo)在設(shè)計(jì)和開開發(fā)時(shí)的調(diào)調(diào)整誰來調(diào)整系系統(tǒng)應(yīng)用設(shè)計(jì)人人員必須傳達(dá)應(yīng)應(yīng)用系統(tǒng)的的設(shè)計(jì),使使得每個(gè)人人都清楚應(yīng)應(yīng)用中的數(shù)數(shù)據(jù)流動(dòng).應(yīng)用開發(fā)人人員必須傳達(dá)他他們選擇的的實(shí)現(xiàn)策略略,使得語(yǔ)語(yǔ)句調(diào)整的的過程中能能快速、容容易地識(shí)別別有問題的的應(yīng)用模塊塊和可疑的的SQL語(yǔ)句.數(shù)據(jù)庫(kù)管理理人員必須仔細(xì)地地監(jiān)控系統(tǒng)統(tǒng)活動(dòng)并提提供它們的的資料,使使得異常的的系統(tǒng)性能能可被快速速得識(shí)別和和糾正.硬件/軟件管理人人員必須傳達(dá)系系統(tǒng)的硬件件、軟件配配置并提供供它們的資資料,使得得相關(guān)人員員能有效地地設(shè)計(jì)和管管理系統(tǒng)。。誰來調(diào)整系系統(tǒng)與系統(tǒng)涉及及的每個(gè)人人都在調(diào)整整過程中起起某些作用用,當(dāng)上面面提及的那那些人員傳傳達(dá)了系統(tǒng)統(tǒng)的特性并并提供了它它們的資料料,調(diào)整就就能相對(duì)的的容易和更更快一些。。事實(shí)上的結(jié)結(jié)果是:數(shù)數(shù)據(jù)庫(kù)管理理員對(duì)調(diào)整整負(fù)有全部部或主要的的責(zé)任。但但是,數(shù)據(jù)據(jù)庫(kù)管理員員很少有合合適的系統(tǒng)統(tǒng)方面的資資料,而且且,在很多多情況下,,數(shù)據(jù)庫(kù)管管理員往往往是在實(shí)施施階段才介介入數(shù)據(jù)庫(kù)庫(kù),這就給給調(diào)整工作作帶來許多多負(fù)面的影影響,因?yàn)闉樵谠O(shè)計(jì)階階段的缺陷陷是不能通通過DBA的調(diào)整而得得以解決,,而設(shè)計(jì)階階段的缺陷陷往往對(duì)數(shù)數(shù)據(jù)庫(kù)性能能造成極大大的影響。。在真正成熟熟的開發(fā)環(huán)環(huán)境下,開開發(fā)人員作作為純代碼碼編寫人員員時(shí),對(duì)性性能的影響響最小,此此時(shí)大部分分的工作應(yīng)應(yīng)由應(yīng)用設(shè)設(shè)計(jì)人員完完成,而且且數(shù)據(jù)庫(kù)管管理員往往往在前期的的需求管理理階段就介介入,為設(shè)設(shè)計(jì)人員提提供必要的的技術(shù)支持持。調(diào)整并不是是數(shù)據(jù)庫(kù)管管理員的專專利,相反反大部分應(yīng)應(yīng)該是設(shè)計(jì)計(jì)人員和開開發(fā)人員的的工作,這這就需要設(shè)設(shè)計(jì)人員和和開發(fā)人員員具體必要要的數(shù)據(jù)庫(kù)庫(kù)知識(shí),這這樣才能組組成一個(gè)高高效的團(tuán)隊(duì)隊(duì),然而事事實(shí)上往往往并非如此此。誰來調(diào)整系系統(tǒng)與系統(tǒng)涉及及的每個(gè)人人都在調(diào)整整過程中起起某些作用用,當(dāng)上面面提及的那那些人員傳傳達(dá)了系統(tǒng)統(tǒng)的特性并并提供了它它們的資料料,調(diào)整就就能相對(duì)的的容易和更更快一些。。事實(shí)上的結(jié)結(jié)果是:數(shù)數(shù)據(jù)庫(kù)管理理員對(duì)調(diào)整整負(fù)有全部部或主要的的責(zé)任。但但是,數(shù)據(jù)據(jù)庫(kù)管理員員很少有合合適的系統(tǒng)統(tǒng)方面的資資料,而且且,在很多多情況下,,數(shù)據(jù)庫(kù)管管理員往往往是在實(shí)施施階段才介介入數(shù)據(jù)庫(kù)庫(kù),這就給給調(diào)整工作作帶來許多多負(fù)面的影影響,因?yàn)闉樵谠O(shè)計(jì)階階段的缺陷陷是不能通通過DBA的調(diào)整而得得以解決,,而設(shè)計(jì)階階段的缺陷陷往往對(duì)數(shù)數(shù)據(jù)庫(kù)性能能造成極大大的影響。。在真正成熟熟的開發(fā)環(huán)環(huán)境下,開開發(fā)人員作作為純代碼碼編寫人員員時(shí),對(duì)性性能的影響響最小,此此時(shí)大部分分的工作應(yīng)應(yīng)由應(yīng)用設(shè)設(shè)計(jì)人員完完成,而且且數(shù)據(jù)庫(kù)管管理員往往往在前期的的需求管理理階段就介介入,為設(shè)設(shè)計(jì)人員提提供必要的的技術(shù)支持持。調(diào)整并不是是數(shù)據(jù)庫(kù)管管理員的專專利,相反反大部分應(yīng)應(yīng)該是設(shè)計(jì)計(jì)人員和開開發(fā)人員的的工作,這這就需要設(shè)設(shè)計(jì)人員和和開發(fā)人員員具體必要要的數(shù)據(jù)庫(kù)庫(kù)知識(shí),這這樣才能組組成一個(gè)高高效的團(tuán)隊(duì)隊(duì),然而事事實(shí)上往往往并非如此此。什么時(shí)候調(diào)調(diào)整系統(tǒng)多數(shù)人認(rèn)為為當(dāng)用戶感感覺性能差差時(shí)才進(jìn)行行調(diào)整,這這對(duì)調(diào)整過過程中使用用某些最有有效的調(diào)整整策略來說說往往是太太遲了。此此時(shí),如果果你不愿意意重新設(shè)計(jì)計(jì)應(yīng)用的話話,你只能能通過重新分配內(nèi)存存(調(diào)整SGA)和調(diào)整I/O的辦法或多或或少地提高性性能。Oracle提供了許多特特性,這些特特性只有應(yīng)用用到正確地設(shè)設(shè)計(jì)的系統(tǒng)中中時(shí)才能夠很很大地提高性性能。應(yīng)用設(shè)計(jì)人員員需要在設(shè)計(jì)計(jì)階段設(shè)置應(yīng)應(yīng)用的性能期期望值。然后后在設(shè)計(jì)和開開發(fā)期間,應(yīng)應(yīng)用設(shè)計(jì)人員員應(yīng)考慮哪些些Oracle特性可以對(duì)系系統(tǒng)有好處,,并使用這些些特性。通過良好的系系統(tǒng)設(shè)計(jì),你你就可以在應(yīng)應(yīng)用的生命周周期中消除性性能調(diào)整的代代價(jià)和挫折。。下圖說明在在應(yīng)用的生命命周期中調(diào)整整的相對(duì)代價(jià)價(jià)和收益,最最有效的調(diào)整整時(shí)間是在在設(shè)計(jì)階段。。在設(shè)計(jì)期間間的調(diào)整能以以最低的代價(jià)價(jià)給你最大的的收益。什么時(shí)候調(diào)整整系統(tǒng)圖:在應(yīng)用生命周周期中調(diào)整的的代價(jià)什么時(shí)候調(diào)整整系統(tǒng)圖:在應(yīng)用生命周周期中調(diào)整的的收益調(diào)整的目標(biāo)不管正在設(shè)計(jì)計(jì)或維護(hù)系統(tǒng)統(tǒng),應(yīng)該建立立專門的性能能目標(biāo),它使使你知道何時(shí)時(shí)要作調(diào)整。。調(diào)整你的系系統(tǒng)的最有效效方法如下::當(dāng)設(shè)計(jì)計(jì)系統(tǒng)時(shí)考慮慮性能調(diào)整操操作系統(tǒng)的硬硬件和軟件識(shí)別性性能瓶頸確定問題的原原因采取糾糾正的動(dòng)作當(dāng)你設(shè)計(jì)系統(tǒng)統(tǒng)時(shí),制定專專門的目標(biāo);;例如,響應(yīng)應(yīng)時(shí)間小于33秒。當(dāng)應(yīng)用不能滿足此此目標(biāo)時(shí),識(shí)識(shí)別造成變慢慢的瓶頸(例例如,I/O競(jìng)爭(zhēng)),確定原因,采取取糾正動(dòng)作。。在開發(fā)期間間,你應(yīng)測(cè)試試應(yīng)用研究,,確定在采取應(yīng)用之前是是否滿足設(shè)計(jì)計(jì)的性能目標(biāo)標(biāo)。調(diào)整的目標(biāo)調(diào)整通常是一一系列開銷。。一旦確定了了瓶頸,可能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年健康管理與個(gè)人健康體檢購(gòu)銷合同3篇
- 2024版UPS主機(jī)全面節(jié)能版保修及售后全面保障合同3篇
- 2024按摩技師與養(yǎng)生館合作經(jīng)營(yíng)協(xié)議模板2篇
- 2024年度呼和浩特市二手房買賣合同樣本
- 2024年度牛奶品牌推廣與銷售合作合同3篇
- 2024年二零二四年度機(jī)場(chǎng)擴(kuò)建項(xiàng)目三通一平工程合同2篇
- 2024年版豬肉制品質(zhì)量安全監(jiān)管合同3篇
- 2024年意外傷害賠償合同樣本6篇
- 2024年度土地承包經(jīng)營(yíng)權(quán)轉(zhuǎn)包合同范本3篇
- 2024版分公司數(shù)據(jù)安全保護(hù)與處理合同3篇
- 兒童健康管理服務(wù)總結(jié)分析報(bào)告
- 殯葬行業(yè)的風(fēng)險(xiǎn)分析
- 下肢靜脈血栓個(gè)案查房
- 通信工程冬季施工安全培訓(xùn)
- 痛風(fēng)病科普講座課件
- 工作崗位風(fēng)險(xiǎn)評(píng)估報(bào)告
- 護(hù)理查房肺部感染心衰
- 拒執(zhí)罪申請(qǐng)書范本
- 《阿米巴經(jīng)營(yíng)》讀書分享
- 鉛酸鋰電池回收項(xiàng)目計(jì)劃書
- 北京市朝陽(yáng)區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末檢測(cè)語(yǔ)文試卷+
評(píng)論
0/150
提交評(píng)論