




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
ORACLE培訓
--SQL性能優化ORACLE培訓
--SQL性能優化內容概述課程主要討論: SQL語句執行的過程、ORACLE優化器,表之間的關聯,如何得到SQL執行計劃,如何分析執行計劃等內容,從而由淺到深的方式了解SQL優化的過程,使大家逐步掌握SQL優化。內容概述課程主要討論:目錄優化基礎知識性能調整綜述
有效的應用設計
SQL語句的處理過程
Oracle的優化器
Oracle的執行計劃注意事項目錄優化基礎知識一、優化基礎知識一、優化基礎知識概述性能管理性能問題調整的方法SQL優化機制應用的調整SQL語句的處理過程共享SQL區域SQL語句處理的階段共享游標SQL編碼標準Oracle優化器介紹SQLTunningTips優化Tools概述性能管理性能管理盡早開始設立合適目標邊調整邊監控相關人員進行合作及時處理過程中發生的意外和變化80/20定律性能管理盡早開始SQL優化衡量指標隨著軟件技術的不斷發展,系統性能越來越重要。系統性能主要用:系統響應時間和并發性來衡量。造成SQL語句性能不佳大致有兩個原因:開發人員只關注查詢結果的正確性,忽視查詢語句的效率。開發人員只關注SQL語句本身的效率,對SQL語句執行原理、影響SQL執行效率的主要因素不清楚。*前者可以通過深入學習SQL語法及各種SQL調優技巧進行解決。SQL調優是一個系統工程,熟悉SQL語法、掌握各種內嵌函數、分析函數的用法只是編寫高效SQL的必要條件。*后者從分析SQL語句執行原理入手,指出SQL調優應在優化SQL解析和優化CBO上。SQL優化衡量指標隨著軟件技術的不斷發展,系統性能越來越重調優領域調優領域:應用程序級調優:*SQL語句調優*管理變化調優2.實例級調優*內存*數據結構*實例配置3.操作系統交互*I/O*SWAP*Parameters本課程內容只講解討論應用程序級:
OracleSQL語句調優及管理變化調優調優領域調優領域:調整的方法調整業務功能調整數據設計調整流程設計調整SQL語句調整物理結構調整內存分配調整I/O調整內存競爭調整操作系統調整的方法調整業務功能不同調整產生相應性能收益不同調整產生相應性能收益調整的角色調整的角色SQL語句優化是提高性能的重要環節開發人員不能只注重功能的實現,不管性能如何開發人員不能把Oracle當成一個黑盒子,必須了解其結構、處理SQL和數據的方法必需遵守既定的開發規范未經過SQL語句優化的模塊不要上線SQL語句優化是提高性能的重要環節開發人員不能只注重功能的實SQL語句優化的過程定位有問題的語句檢查執行計劃檢查執行過程中優化器的統計信息分析相關表的記錄數、索引情況改寫SQL語句、使用HINT、調整索引、表分析有些SQL語句不具備優化的可能,需要優化處理方式達到最佳執行計劃SQL語句優化的過程定位有問題的語句什么是好的SQL語句?盡量簡單,模塊化易讀、易維護節省資源內存CPU掃描的數據塊要少少排序不造成死鎖什么是好的SQL語句?盡量簡單,模塊化SQL共享原理
ORACLE將執行過的SQL語句存放在內存的共享池(sharedbufferpool)中,可以被所有的數據庫用戶共享。當你執行一個SQL語句(有時被稱為一個游標)時,如果它和之前的執行過的語句完全相同,ORACLE就能很快獲得已經被解析的語句以及最好的執行路徑.這個功能大大地提高了SQL的執行性能并節省了內存的使用。SQL共享原理ORACLE將執行過的SQL語句存放在內存的SQL共享原理 為了不重復解析相同的SQL語句,在第一次解析之后,Oracle將SQL語句存放在內存中。這塊位于系統全局區域SGA(systemglobalarea)的共享池(sharedbufferpoo1)中的內存可以被所有的數據庫用戶共享。因此,當你執行一個SQL語句(有時被稱為一個游標)時,如果它和之前執行過的語句完全相同,Oracle就能很快獲得已經被解析的語句以及最好的執行方案。Oracle的這個功能大大地提高了SQL的執行性能并節省了內存的使用。 可惜的是,Oracle只對簡單的表提供高速緩沖(cachebufferiIlg),這個功能并不適用于多表連接查詢。數據庫管理員必須在啟動參數文件中為這個區域設置合適的參數,當這個內存區域越大,就可以保留更多的語句,當然被共享的可能性也就越大了。當向Oracle提交一個SQL語句時,Oracle會首先在這塊內存中查找相同的語句。SQL共享原理 為了不重復解析相同的SQL語句,在第一次解SQL共享的三個條件當前被執行的語句和共享池中的語句必須完全相同(包括大小寫、空格、換行等)兩個語句所指的對象必須完全相同(同義詞與表是不同的對象)兩個SQL語句中必須使用相同的名字的綁定變量(bindvariables)SQL共享的三個條件當前被執行的語句和共享池中的語句必須完全共享SQL語句注意:Oracle對兩者采取的是一種嚴格匹配策略,要達成共享。SQL語句必須完全相同(包括空格、換行等)。能夠使用共享的語句必須滿足三個條件:①字符級的比較。 當前被執行的語句和共享池中的語句必須完全相同。 例如:SELECT*FROMATABLE;和下面每一個SQL語句都不同: SELECT*fromATABLE Select*FromAtable;②語句所指對象必須完全相同即兩條SQL語句操作的數據庫對象必須同一。③語句中必須使用相同命名的綁定變量。如:第一組的兩個SQL語句是相同的,可以共享;而第二組中兩個語句不同,即使在運行時賦予不同的綁定變量以相同的值:●第一組
selectpin,namefrompeoplewherepin=:blk1.pin; selectpin,namefrompeoplewherepin=:blk1.pin;●第二組
selectpin,namefrompeoplewherepin=:blk1.ot_jnd; selectpin,namefrompeoplewherepin=:blk1.ov_jnd;共享SQL語句注意:SQL語句的處理過程共享SQL區域SQL語句的處理過程共享SQL區域Sql處理過程Sql處理過程SQLPARSE與共享SQL語句當一個Oracle實例接收一條sql后1、CreateaCursor創建游標2、ParsetheStatement分析語句3、DescribeResultsofaQuery描述查詢的結果集4、DefineOutputofaQuery定義查詢的輸出數據5、BindAnyVariables綁定變量6、ParallelizetheStatement并行執行語句7、RuntheStatement運行語句8、FetchRowsofaQuery取查詢出來的行9、ClosetheCursor關閉游標
SQLPARSE與共享SQL語句當一個Oracle實例接收為什么要bindvariables?字符級的比較:SELECT*FROMUSER_FILESWHEREUSER_NO=‘10001234’;
與SELECT*FROMUSER_FILESWHEREUSER_NO=‘10004321’;檢查:selectname,executionsfromv$db_object_cachewherenamelike'select*fromuser_files%'為什么要bindvariables?字符級的比較:什么叫做重編譯問題什么叫做重編譯?下面這個語句每執行一次就需要在SHAREPOOL硬解析一次,一百萬用戶就是一百萬次,消耗CPU和內存,如果業務量大,很可能導致宕庫……如果綁定變量,則只需要硬解析一次,重復調用即可select*fromdConMsgwherecontract_no=32013484095139什么叫做重編譯問題什么叫做重編譯?綁定變量解決重編譯問題未使用綁定變量的語句sprintf(sqlstr,"insertintoscott.test1(num1,num2)values(%d,%d)",n_var1,n_var2);EXECSQLEXECUTEIMMEDIATE:sqlstr;EXECSQLCOMMIT;
使用綁定變量的語句strcpy(sqlstr,"insertintotest(num1,num2)values(:v1,:v2)");EXECSQLPREPAREsql_stmtFROM:sqlstr;EXECSQLEXECUTEsql_stmtUSING:n_var1,:n_var2;EXECSQLCOMMIT;綁定變量解決重編譯問題未使用綁定變量的語句綁定變量的注意事項注意:1、不要使用數據庫級的變量綁定參數cursor_sharing來強制綁定,無論其值為force還是similar2、有些帶><的語句綁定變量后可能導致優化器無法正確使用索引綁定變量的注意事項注意:SQL語句的四個處理階段SQL語句的處理過程SQL語句的四個處理階段SQL語句的處理過程解析(PARSE):SQL語句的處理過程在共享池中查找SQL語句檢查語法檢查語義和相關的權限合并(MERGE)視圖定義和子查詢確定執行計劃解析(PARSE):SQL語句的處理過程在共享池中查找SQL綁定(BIND):SQL語句的處理過程
在語句中查找綁定變量
賦值(或重新賦值)綁定(BIND):SQL語句的處理過程在語句中查找綁定變量執行(EXECUTE):SQL語句的處理過程應用執行計劃執行必要的I/O和排序操作提取(FETCH):從查詢結果中返回記錄必要時進行排序使用ARRAYFETCH機制執行(EXECUTE):SQL語句的處理過程應用執行計劃提共享游標:好處
減少解析
動態內存調整
提高內存使用率共享游標:好處減少解析書寫可共享的SQL書寫可共享的SQL綁定變量和共享游標綁定變量和共享游標ORACLE優化器模式概述Oracle的優化器共有3種模式:RULE(基于規則)、COST(基于成本)、CHOOSE(基于選擇)。
設置缺省的優化器的方法,是在啟動參數文件中針對OPTIMIZER_MODE參數的各種聲明進行選擇,如RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS。當然也可以在SQL語句級別或是會話級別對其進行覆蓋。
為了使用基于成本的優化器(CBO,Cost—BasedOptimizer),必須經常運行analyze命令,以增加數據庫中的對象統計信息(objectstatistics)的準確性。
如果數據庫的優化器模式設置為基于選擇,那么實際的優化器模式將和是否運行過analyze命令有關。如果數據表已經被analyze過,優化器模式將自動切換成CBO,反之,數據庫將采用RULE形式的優化器。在缺省情況下,Oracle采用CHOOSE優化器。為避免那些不必要的全表掃描,必須盡量避免使用CHOOSE優化器,而直接采用基于規則或者基于成本的優化器。ORACLE優化器模式概述Oracle的優化器共有3種模訪問數據表的方式①
全表掃描
全表掃描就是順序地訪問表中每條記錄。Oracle采用一次讀入多個數據塊(databaseblock)的方式優化全表掃描。②
通過ROWID訪問表
ROWID包含了表中記錄的物理位置信息。可以采用基于ROWID的訪問方式情況提高訪問表的效率。Oracle采用索引實現了數據和存放數據的物理位置(ROWID)之間的聯系通常索引提供了快速訪問ROWID的方法,因此那些基于索引列的查詢就可以得到性能的提高。訪問數據表的方式①全表掃描數據庫性能影響數據庫系統性能的要素:主機CPU,RAM,存儲系統;OS參數配置,ORACLE參數配置;應用方面:數據庫設計及SQL編程的質量一個性能優秀的應用系統需要:良好的硬件配置;正確合理的數據庫及中間件參數配置;合理的數據庫設計;良好的sql編程;運行期的性能優化數據庫性能影響數據庫系統性能的要素:SQLTunning的重點SQL:insert,update,delete,select;主要關注的是select關注的是:如何用最小的硬件資源消耗、最少的響應時間定位數據位置SQLTunning的重點SQL:insert,upSQL優化的一般性原則目標:減少服務器資源消耗(主要是磁盤IO);設計方面:盡量依賴oracle的優化器,并為其提供條件;合適的索引,索引的雙重效應,列的選擇性;編碼方面:利用索引,避免大表FULLTABLESCAN;合理使用臨時表;避免寫過于復雜的sql,不一定非要一個sql解決問題;在不影響業務的前提下減小事務的粒度;SQL優化的一般性原則目標:優化概括課程Oracle數據庫SQL語句優化的總體策略。以這些優化策略為指導,通過經驗總結,我們可以不斷地豐富優化方案,進而指導我們進行應用系統的數據庫性能優化。以下枚舉幾則被證明行之有效的優化方案:●創建表的時候。應盡量建立主鍵,盡量根據實際需要調整數據表的PCTFREE和PCTUSED參數;大數據表刪除,用truncatetable代替delete。●合理使用索引,在OLTP應用中一張表的索引不要太多。數據重復量大的列不要建立二叉樹索引,可以采用位圖索引;組合索引的列順序盡量與查詢條件列順序保持一致;對于數據操作頻繁的表,索引需要定期重建,以減少失效的索引和碎片。優化概括課程Oracle數據庫SQL語句優化的總體策略。以這優化概括●查詢盡量用確定的列名,少用*號。selectcount(key)fromtabwherekey>0性能優于selectcount(*)fromtab;盡量少嵌套子查詢,這種查詢會消耗大量的CPU資源;對于有比較多or運算的查詢,建議分成多個查詢,用unionall聯結起來;多表查詢的查詢語句中,選擇最有效率的表名順序。Oracle解析器對表解析從右到左,所以記錄少的表放在右邊。●盡量多用commit語句提交事務,可以及時釋放資源、解鎖、釋放日志空間、減少管理花費;在頻繁的、性能要求比較高的數據操作中,盡量避免遠程訪問,如數據庫鏈等,訪問頻繁的表可以常駐內存:altertable...cache;●在Oracle中動態執行SQL,盡量用execute方式,不用dbms_sql包。優化概括●查詢盡量用確定的列名,少用*號。selectc**SQLTunningTips****SQLTunningTips**sql語句的編寫原則和優化隨著數據庫中數據的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中一個很重要的方面就是SQL語句的優化。對于大量數據,劣質SQL語句和優質SQL語句之間的速度差別可以達到上百倍,對于一個系統不是簡單地能實現其功能就可,而是要寫出高質量的SQL語句,提高系統的可用性。在多數情況下,Oracle使用索引來更快地遍歷表,優化器主要根據定義的索引來提高性能。如果在SQL語句的where子句中寫的SQL代碼不合理,就會造成優化器刪去索引而使用全表掃描,一般就這種SQL語句就是所謂的劣質SQL語句。sql語句的編寫原則和優化隨著數據庫中數據的增加,系統的sql語句的編寫原則和優化在編寫SQL語句時我們應清楚優化器根據何種原則來使用索引,這有助于寫出高性能的SQL語句。SQL語句的編寫原則和SQL語句的優化,請跟我一起學習以下幾方面:sql語句的編寫原則和優化在編寫SQL語句時我們應清楚優TunningTip的各個方面1.不要讓Oracle做得太多;2.給優化器更明確的命令;
3.減少訪問次數;4.細節上的影響;TunningTip的各個方面1.不要讓Oracle做得太1.不要讓Oracle做得太多1.不要讓Oracle做得太多避免復雜的多表關聯select…fromuser_filesuf,df_money_filesdm,cw_charge_recordccwhereuf.user_no=dm.user_noanddm.user_no=cc.user_noand……andnotexists(select…)
???很難優化,隨著數據量的增加性能的風險很大。避免復雜的多表關聯select…避免使用‘*‘當你想在SELECT子句中列出所有的COLUMN時,使用動態SQL列引用‘*’是一個方便的方法.不幸的是,這是一個非常低效的方法.實際上,ORACLE在解析的過程中,會將’*’依次轉換成所有的列名,這個工作是通過查詢數據字典完成的,這意味著將耗費更多的時間;只提取你所要使用的列;使用別名能夠加快解析速度;避免使用‘*‘當你想在SELECT子句中列出所有的CO避免使用耗費資源的操作帶有DISTINCT,UNION,MINUS,INTERSECT,ORDERBY的SQL語句會啟動SQL引擎執行耗費資源的排序(SORT)功能.DISTINCT需要一次排序操作,而其他的至少需要執行兩次排序.例如,一個UNION查詢,其中每個查詢都帶有GROUPBY子句,GROUPBY會觸發嵌入排序(NESTEDSORT);這樣,每個查詢需要執行一次排序,然后在執行UNION時,又一個唯一排序(SORTUNIQUE)操作被執行而且它只能在前面的嵌入排序結束后才能開始執行.嵌入的排序的深度會大大影響查詢的效率.通常,帶有UNION,MINUS,INTERSECT的SQL語句都可以用其他方式重寫.避免使用耗費資源的操作帶有DISTINCT,UNION,MI用EXISTS替換DISTINCT例如:低效:SELECTDISTINCTDEPT_NO,DEPT_NAMEFROMDEPTD,EMPEWHERED.DEPT_NO=E.DEPT_NO高效:SELECTDEPT_NO,DEPT_NAMEFROMDEPTDWHEREEXISTS(SELECT‘X’FROMEMPEWHEREE.DEPT_NO=D.DEPT_NO);用EXISTS替換DISTINCT例如:用UNION-ALL替換UNION(ifpossible)當SQL語句需要UNION兩個查詢結果集合時,這兩個結果集合會以UNION-ALL的方式被合并,然后在輸出最終結果前進行排序.舉例:
低效:
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’用UNION-ALL替換UNION(ifpossib2.給優化器更明確的命令2.給優化器更明確的命令自動選擇索引如果表中有兩個以上(包括兩個)索引,其中有一個唯一性索引,而其他是非唯一性.在這種情況下,ORACLE將使用唯一性索引而完全忽略非唯一性索引.舉例:SELECTENAMEFROMEMPWHEREEMPNO=2326ANDDEPTNO=20;這里,只有EMPNO上的索引是唯一性的,所以EMPNO索引將用來檢索記錄.TABLEACCESSBYROWIDONEMPINDEXUNIQUESCANONEMP_NO_IDX自動選擇索引如果表中有兩個以上(包括兩個)索引,其中有一個唯至少要包含組合索引的第一列如果索引是建立在多個列上,只有在它的第一個列(leadingcolumn)被where子句引用時,優化器才會選擇使用該索引.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'
很明顯,當僅引用索引的第二個列時,優化器使用了全表掃描而忽略了索引至少要包含組合索引的第一列如果索引是建立在多個列上,只有在避免在索引列上使用函數WHERE子句中,如果索引列是函數的一部分.優化器將不使用索引而使用全表掃描.舉例:低效:SELECT…FROMDEPTWHERESAL*12>25000;高效:SELECT…FROMDEPTWHERESAL>25000/12;避免在索引列上使用函數WHERE子句中,如果索引列是函數的一避免使用前置通配符WHERE子句中,如果索引列所對應的值的第一個字符由通配符(WILDCARD)開始,索引將不被采用.
SELECTUSER_NO,USER_NAME,ADDRESS
FROMUSER_FILES
WHEREUSER_NOLIKE'%109204421';
在這種情況下,ORACLE將使用全表掃描.避免使用前置通配符WHERE子句中,如果索引列所對應的值的避免在索引列上使用NOT通常,我們要避免在索引列上使用NOT,NOT會產生在和在索引列上使用函數相同的影響.當ORACLE”遇到”NOT,他就會停止使用索引轉而執行全表掃描.舉例:
低效:(這里,不使用索引)SELECT…FROMDEPTWHEREDEPT_CODENOT=0;
高效:(這里,使用了索引)SELECT…FROMDEPTWHEREDEPT_CODE>0;避免在索引列上使用NOT通常,我們要避免在索引列上使用NOT避免在索引列上使用ISNULL和ISNOTNULL避免在索引中使用任何可以為空的列,ORACLE將無法使用該索引.對于單列索引,如果列包含空值,索引中將不存在此記錄.對于復合索引,如果每個列都為空,索引中同樣不存在此記錄.如果至少有一個列不為空,則記錄存在于索引中.如果唯一性索引建立在表的A列和B列上,并且表中存在一條記錄的A,B值為(123,null),ORACLE將不接受下一條具有相同A,B值(123,null)的記錄(插入).然而如果所有的索引列都為空,ORACLE將認為整個鍵值為空而空不等于空.因此你可以插入1000條具有相同鍵值的記錄,當然它們都是空!因為空值不存在于索引列中,所以WHERE子句中對索引列進行空值比較將使ORACLE停用該索引.任何在where子句中使用isnull或isnotnull的語句優化器是不允許使用索引的。避免在索引列上使用ISNULL和ISNOTNULL避避免出現索引列自動轉換當比較不同數據類型的數據時,ORACLE自動對列進行簡單的類型轉換.假設EMP_TYPE是一個字符類型的索引列.SELECTUSER_NO,USER_NAME,ADDRESSFROMUSER_FILESWHEREUSER_NO=109204421這個語句被ORACLE轉換為:SELECTUSER_NO,USER_NAME,ADDRESSFROMUSER_FILESWHERETO_NUMBER(USER_NO)=109204421 因為內部發生的類型轉換,這個索引將不會被用到!避免出現索引列自動轉換當比較不同數據類型的數據時,ORAC在查詢時盡量少用格式轉換如用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)在查詢時盡量少用格式轉換如用WHEREa.order_n3.減少訪問次數3.減少訪問次數減少訪問數據庫的次數當執行每條SQL語句時,ORACLE在內部執行了許多工作:解析SQL語句,估算索引的利用率,綁定變量,讀數據塊等等.由此可見,減少訪問數據庫的次數,就能實際上減少ORACLE的工作量.類比,工程實施減少訪問數據庫的次數當執行每條SQL語句時,ORACLE在使用DECODE來減少處理時間例如:SELECTCOUNT(*),SUM(SAL)FROM
EMPWHEREDEPT_NO=0020ANDENAMELIKE‘SMITH%’;SELECTCOUNT(*),SUM(SAL)FROM
EMPWHEREDEPT_NO=0030ANDENAMELIKE‘SMITH%’;你可以用DECODE函數高效地得到相同結果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%’;使用DECODE來減少處理時間例如:減少對表的查詢在含有子查詢的SQL語句中,要特別注意減少對表的查詢.例如:
低效
SELECTTAB_NAMEFROMTABLESWHERETAB_NAME=(SELECTTAB_NAMEFROMTAB_COLUMNSWHEREVERSION=604)AND
DB_VER=(SELECTDB_VERFROMTAB_COLUMNSWHEREVERSION=604)
高效
SELECTTAB_NAMEFROMTABLESWHERE(TAB_NAME,DB_VER) =(SELECTTAB_NAME,DB_VER)FROMTAB_COLUMNSWHEREVERSION=604)減少對表的查詢在含有子查詢的SQL語句中,要特別注意減少對表4.細節上的影響4.細節上的影響WHERE子句中的連接順序ORACLE采用自下而上的順序解析WHERE子句,根據這個原理,當在WHERE子句中有多個表聯接時,WHERE子句中排在最后的表應當是返回行數可能最少的表,有過濾條件的子句應放在WHERE子句中的最后。如:設從emp表查到的數據比較少或該表的過濾條件比較確定,能大大縮小查詢范圍,則將最具有選擇性部分放在WHERE子句中的最后: select*fromempe,deptd whered.deptno>10ande.deptno=30;如果dept表返回的記錄數較多的話,上面的查詢語句會比下面的查詢語句響應快得多。 select*fromempe,deptd wheree.deptno=30andd.deptno>10;WHERE子句中的連接順序ORACLE采用自下而上的順序解析WHERE子句——函數、表達式使用最好不要在WHERE子句中使用函或表達式,如果要使用的話,最好統一使用相同的表達式或函數,這樣便于以后使用合理的索引。WHERE子句——函數、表達式使用最好不要在WHERE子句Orderby語句ORDERBY語句決定了Oracle如何將返回的查詢結果排序。Orderby語句對要排序的列沒有什么特別的限制,也可以將函數加入列中(象聯接或者附加等)。任何在Orderby語句的非索引項或者有計算表達式都將降低查詢速度。仔細檢查orderby語句以找出非索引項或者表達式,它們會降低性能。解決這個問題的辦法就是重寫orderby語句以使用索引,也可以為所使用的列建立另外一個索引,同時應絕對避免在orderby子句中使用表達式。Orderby語句ORDERBY語句決定了Oracle聯接列對于有聯接的列,即使最后的聯接值為一個靜態值,優化器是不會使用索引的。 select*fromemployss
where
first_name||''||last_name='BeillCliton';系統優化器對基于last_name創建的索引沒有使用。當采用下面這種SQL語句的編寫,Oracle系統就可以采用基于last_name創建的索引。
select*fromemployee
where
first_name='Beill'andlast_name='Cliton';聯接列對于有聯接的列,即使最后的聯接值為一個靜態值,優化器帶通配符(%)的like語句通配符(%)在搜尋詞首出現,Oracle系統不使用last_name的索引。
select*fromemployeewherelast_namelike'%cliton%';在很多情況下可能無法避免這種情況,但是一定要心中有底,通配符如此使用會降低查詢速度。然而當通配符出現在字符串其他位置時,優化器就能利用索引。在下面的查詢中索引得到了使用:
select*fromemployeewherelast_namelike'c%';
帶通配符(%)的like語句通配符(%)在搜尋詞首出現,O用Where子句替換HAVING子句避免使用HAVING子句,HAVING只會在檢索出所有記錄之后才對結果集進行過濾.這個處理需要排序,總計等操作.如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷.例如:
低效:
SELECTREGION,AVG(LOG_SIZE)FROMLOCATIONGROUPBYREGIONHAVINGREGIONREGION!=‘SYDNEY’ANDREGION!=‘PERTH’
高效
SELECTREGION,AVG(LOG_SIZE)FROMLOCATIONWHEREREGIONREGION!=‘SYDNEY’ANDREGION!=‘PERTH’GROUPBYREGION
順序 WHERE>GROUP>HAVING用Where子句替換HAVING子句避免使用HAVING子句用NOTEXISTS替代NOTIN在子查詢中,NOTIN子句將執行一個內部的排序和合并.無論在哪種情況下,NOTIN都是最低效的(因為它對子查詢中的表執行了一個全表遍歷).使用NOTEXISTS子句可以有效地利用索引。盡可能使用NOTEXISTS來代替NOTIN,盡管二者都使用了NOT(不能使用索引而降低速度),NOTEXISTS要比NOTIN查詢效率更高。例如:語句1SELECTdname,deptnoFROMdeptWHERE deptnoNOTIN(SELECTdeptnoFROMemp);語句2SELECTdname,deptnoFROMdeptWHERE NOTEXISTS(SELECTdeptnoFROMempWHEREdept.deptno=emp.deptno);
2要比1的執行性能好很多。 因為1中對emp進行了fulltablescan,這是很浪費時間的操作。而且1中沒有用到emp的index,因為沒有where子句。而2中的語句對emp進行的是縮小范圍的查詢。用NOTEXISTS替代NOTIN在子查詢中,NOT用索引提高效率索引是表的一個概念部分,用來提高檢索數據的效率,ORACLE使用了一個復雜的自平衡B-tree結構.通常,通過索引查詢數據比全表掃描要快.當ORACLE找出執行查詢和Update語句的最佳路徑時,ORACLE優化器將使用索引.同樣在聯結多個表時使用索引也可以提高效率.另一個使用索引的好處是,它提供了主鍵(primarykey)的唯一性驗證。通常,在大型表中使用索引特別有效.當然,你也會發現,在掃描小表時,使用索引同樣能提高效率.雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價.索引需要空間來存儲,也需要定期維護,每當有記錄在表中增減或索引列被修改時,索引本身也會被修改.這意味著每條記錄的INSERT,DELETE,UPDATE將為此多付出4,5次的磁盤I/O.因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢.。定期的重構索引是有必要的。用索引提高效率索引是表的一個概念部分,用來提高檢索數據的效率避免在索引列上使用計算WHERE子句中,如果索引列是函數的一部分.優化器將不使用索引而使用全表掃描.低效: SELECT…FROMDEPTWHERESAL*12>25000;高效: SELECT…FROMDEPTWHERESAL>25000/12;避免在索引列上使用計算WHERE子句中,如果索引列是函數的一用>=替代>如果DEPTNO上有一個索引。高效:
SELECT*FROMEMPWHEREDEPTNO>=4
低效:
SELECT*FROMEMPWHEREDEPTNO>3用>=替代>如果DEPTNO上有一個索引。通過使用>=、<=等,避免使用NOT命令例子:select*fromemployeewheresalary<>3000;對這個查詢,可以改寫為不使用NOT:select*fromemployeewheresalary<3000orsalary>3000; 雖然這兩種查詢的結果一樣,但是第二種查詢方案會比第一種查詢方案更快些。第二種查詢允許Oracle對salary列使用索引,而第一種查詢則不能使用索引。通過使用>=、<=等,避免使用NOT命令例子:如果有其它辦法,不要使用子查詢。如果有其它辦法,不要使用子查詢。外部聯接"+"的用法外部聯接"+"按其在"="的左邊或右邊分左聯接和右聯接。若不帶"+"運算符的表中的一個行不直接匹配于帶"+"預算符的表中的任何行,則前者的行與后者中的一個空行相匹配并被返回。利用外部聯接"+",可以替代效率十分低下的notin運算,大大提高運行速度。例如,下面這條命令執行起來很慢:selecta.empnofromempawherea.empnonotin (selectempnofromemp1wherejob='SALE');利用外部聯接,改寫命令如下:selecta.empnofromempa,emp1bwherea.empno=b.empno(+)andb.empnoisnullandb.job='SALE'; 這樣運行速度明顯提高.外部聯接"+"的用法外部聯接"+"按其在"="的左邊或右邊盡量多使用COMMIT
事務是消耗資源的,大事務還容易引起死鎖
COMMIT所釋放的資源:回滾段上用于恢復數據的信息.被程序語句獲得的鎖redologbuffer中的空間ORACLE為管理上述3種資源中的內部花費盡量多使用COMMIT事務是消耗資源的,大事務還容易引起死用TRUNCATE替代DELETE
當刪除表中的記錄時,在通常情況下,回滾段(rollbacksegments)用來存放可以被恢復的信息.如果你沒有COMMIT事務,ORACLE會將數據恢復到刪除之前的狀態(準確地說是恢復到執行刪除命令之前的狀況) 而當運用TRUNCATE時,回滾段不再存放任何可被恢復的信息.當命令運行后,數據不能被恢復.因此很少的資源被調用,執行時間也會很短.用TRUNCATE替代DELETE 當刪除表中的記錄時,在通計算記錄條數和一般的觀點相反,count(*)比count(1)稍快,當然如果可以通過索引檢索,對索引列的計數仍舊是最快的.
例如 COUNT(EMPNO)計算記錄條數和一般的觀點相反,count(*)比coun字符型字段的引號比如有的表PHONE_NO字段是CHAR型,而且創建有索引,但在WHERE條件中忘記了加引號,就不會用到索引。WHEREPHONE_NO=WHEREPHONE_NO符型字段的引號比如有的表PHONE_NO字段是CHAR型,優化EXPORT和IMPORT使用較大的BUFFER(比如10MB,10,240,000)可以提高EXPORT和IMPORT的速度;ORACLE將盡可能地獲取你所指定的內存大小,即使在內存不滿足,也不會報錯.這個值至少要和表中最大的列相當,否則列值會被截斷;優化EXPORT和IMPORT使用較大的BUFFER(比如1**
優化Tools****優化Tools**SQL語句的執行步驟語法分析,分析語句的語法是否符合規范,衡量語句中各表達式的意義。語義分析,檢查語句中涉及的所有數據庫對象是否存在,且用戶有相應的權限。視圖轉換,將涉及視圖的查詢語句轉換為相應的對基表查詢語句。表達式轉換,將復雜的SQL表達式轉換為較簡單的等效連接表達式。選擇優化器,不同的優化器一般產生不同的“執行計劃”選擇連接方式,ORACLE有三種連接方式,對多表連接ORACLE可選擇適當的連接方式。選擇連接順序,對多表連接ORACLE選擇哪一對表先連接,選擇這兩表中哪個表做為源數據表。選擇數據的搜索路徑,根據以上條件選擇合適的數據搜索路徑,如是選用全表搜索還是利用索引或是其他的方式。運行“執行計劃”SQL語句的執行步驟語法分析,分析語句的語法是否符合規范優化器與執行計劃Oracle在執行一個SQL之前,首先要分析一下語句的執行計劃,然后再按執行計劃去執行。分析語句的執行計劃的工作是由優化器(Optimizer)來完成的Oracle的優化器共有兩種的優化方式,即基于規則的優化方式(Rule-BasedOptimization,簡稱為RBO)和基于代價的優化方式(Cost-BasedOptimization,簡稱為CBO)。
A、RBO方式:優化器在分析SQL語句時,所遵循的是Oracle內部預定的一些規則。比如我們常見的,當一個where子句中的一列有索引時去走索引。B、CBO方式:是看語句的代價(Cost)了,這里的代價主要指Cpu和內存。優化器在判斷是否用這種方式時,主要參照的是表及索引的統計信息,很多的時侯過期統計信息會令優化器做出一個錯誤的執行計劃在Oracle8及以后的版本,Oracle推薦用CBO的方式。在Oracle10g中,取消了RBO的支持。優化器與執行計劃Oracle在執行一個SQL之前,首先要分析優化器與執行計劃Rule:即走基于規則的方式Choose:默認的情況下Oracle用的便是這種方式。當一個表或或索引有統計信息,則走CBO的方式,如果表或索引沒統計信息,表又不是特別的小,而且相應的列有索引時,那么就走索引,走RBO的方式FirstRows:它與Choose方式是類似的,所不同的是當一個表有統計信息時,它將是以最快的方式返回查詢的最先的幾行,從總體上減少了響應時間AllRows:all_rows是oracle優化器默認的模式,它將選擇一種在最短時間內返回所有數據的執行計劃,它將基于整體成本的考慮.first_rows_n:first_rows_n是根據成本而不是基于硬編碼的規則來選擇執行計劃.n可以是1,10,100,1000或者直接用first_rows(n)hint指定任意正數.這里的n是我們想獲取結果集的前n條記錄,這種需求在很多分頁語句的需求中會碰到.優化器與執行計劃Rule:即走基于規則的方式用EXPLAINPLAN分析SQL語句EXPLAINPLAN是一個很好的分析SQL語句的工具,它甚至可以在不執行SQL的情況下分析語句.通過分析,我們就可以知道ORACLE是怎么樣連接表,使用什么方式掃描表(索引掃描或全表掃描)以及使用到的索引名稱.你需要按照從里到外,從上到下的次序解讀分析的結果.EXPLAINPLAN分析的結果是用縮進的格式排列的,最內部的操作將被最先解讀,如果兩個操作處于同一層中,帶有最小操作號的將被首先執行.NESTEDLOOP是少數不按照上述規則處理的操作,正確的執行路徑是檢查對NESTEDLOOP提供數據的操作,其中操作號最小的將被最先處理.用EXPLAINPLAN分析SQL語句EXPLAINPAutotrace解讀Currentmode: 對于修改的數據從數據段中讀Read-consistentmode: 讀一致性模式Physicalblock: 物理塊(如8192字節)Recursivecalls: 嵌套調用次數Autotrace解讀Currentmode: 對于修改使用TKPROF工具SQLtrace工具收集正在執行的SQL的性能狀態數據并記錄到一個跟蹤文件中.這個跟蹤文件提供了許多有用的信息,例如解析次數.執行次數,CPU使用時間等.這些數據將可以用來優化你的系統.設置SQLTRACE在會話級別:有效ALTERSESSIONSETSQL_TRACETRUE設置SQLTRACE在整個數據庫有效,你必須將SQL_TRACE參數在init.ora中設為TRUE,USER_DUMP_DEST參數說明了生成跟蹤文件的目錄再使用TKPROF對TRACE文件進行分析分析結果更加準確、清楚使用TKPROF工具SQLtrace工具收集正在執行的在SQLPLUS配置AUTOTRACEAUTOTRACE參數解釋SETAUTOTRACEOFF不能獲得AUTOTRACE報告.這是默認的.SETAUTOTRACEONEXPLAIN僅僅顯示優化器執行計劃的AUTOTRACE報告SETAUTOTRACEONSTATISTICS僅僅顯示SQL語句執行的統計結果的AUTOTRACE報告SETAUTOTRACEON包括上面兩項內容的AUTOTRACE報告SETAUTOTRACETRACEONLY與SETAUTOTRACEON類似,所有的統計和數據都在,但不可以打印在SQLPLUS配置AUTOTRACEAUTOTRACE在SQLPLUS配置AUTOTRACE1、首先創建PLUSTRACE角色并且賦給public:Sql>@$ORACLE_HOME/sqlplus/admin/plustrce.sql2、賦權限給用戶Sql>grantplustracetopublic(預賦權的用戶名);3、以SYSTEM用戶創建PLAN_TABLE表Sql>@$ORACLE_HOME/rdbms/admin/utlxplan.sqlSql>createpublicsynonymplan_tableforplan_table;Sql>grantallonplan_tabletopublic;在每個用戶下設置AUTOTRACE可顯示其執行計劃。在SQLPLUS配置AUTOTRACE1、首先創建PLU優化器與執行計劃SQL>selectename,dname
fromemp,dept
whereemp.deptno=dept.deptno
anddept.dnamein('ACCOUNTING','RESEARCH','SALES','OPERATIONS');
ExecutionPlan
----------------------------------------------------------
0
SELECTSTATEMENTOptimizer=CHOOSE
1
0
NESTEDLOOPS
2
1
TABLEACCESS(FULL)OF'EMP'
3
1
TABLEACCESS(BYINDEXROWID)OF'DEPT'
4
3
INDEX(UNIQUESCAN)OF'PK_DEPT'(UNIQUE)最起碼要解決全表掃描問題改變where條件的次序一般沒有用優化器與執行計劃SQL>selectename,dnam目錄優化基礎知識
性能調整綜述
有效的應用設計
SQL語句的處理過程
Oracle的優化器
Oracle的執行計劃注意事項目錄優化基礎知識性能調整綜述誰來調整系統?什么時候調整?建立有效調整的目標在設計和開發時的調整性能調整綜述誰來調整系統?誰來調整系統應用設計人員必須傳達應用系統的設計,使得每個人都清楚應用中的數據流動.應用開發人員必須傳達他們選擇的實現策略,使得語句調整的過程中能快速、容易地識別有問題的應用模塊和可疑的SQL語句.數據庫管理人員必須仔細地監控系統活動并提供它們的資料,使得異常的系統性能可被快速得識別和糾正.硬件/軟件管理人員必須傳達系統的硬件、軟件配置并提供它們的資料,使得相關人員能有效地設計和管理系統。誰來調整系統應用設計人員必須傳達應用系統的設計,使得每個人都誰來調整系統與系統涉及的每個人都在調整過程中起某些作用,當上面提及的那些人員傳達了系統的特性并提供了它們的資料,調整就能相對的容易和更快一些。事實上的結果是:數據庫管理員對調整負有全部或主要的責任。但是,數據庫管理員很少有合適的系統方面的資料,而且,在很多情況下,數據庫管理員往往是在實施階段才介入數據庫,這就給調整工作帶來許多負面的影響,因為在設計階段的缺陷是不能通過DBA的調整而得以解決,而設計階段的缺陷往往對數據庫性能造成極大的影響。在真正成熟的開發環境下,開發人員作為純代碼編寫人員時,對性能的影響最小,此時大部分的工作應由應用設計人員完成,而且數據庫管理員往往在前期的需求管理階段就介入,為設計人員提供必要的技術支持。調整并不是數據庫管理員的專利,相反大部分應該是設計人員和開發人員的工作,這就需要設計人員和開發人員具體必要的數據庫知識,這樣才能組成一個高效的團隊,然而事實上往往并非如此。誰來調整系統與系統涉及的每個人都在調整過程中起某些作用,當上誰來調整系統與系統涉及的每個人都在調整過程中起某些作用,當上面提及的那些人員傳達了系統的特性并提供了它們的資料,調整就能相對的容易和更快一些。事實上的結果是:數據庫管理員對調整負有全部或主要的責任。但是,數據庫管理員很少有合適的系統方面的資料,而且,在很多情況下,數據庫管理員往往是在實施階段才介入數據庫,這就給調整工作帶來許多負面的影響,因為在設計階段的缺陷是不能通過DBA的調整而得以解決,而設計階段的缺陷往往對數據庫性能造成極大的影響。在真正成熟的開發環境下,開發人員作為純代碼編寫人員時,對性能的影響最小,此時大部分的工作應由應用設計人員完成,而且數據庫管理員往往在前期的需求管理階段就介入,為設計人員提供必要的技術支持。調整并不是數據庫管理員的專利,相反大部分應該是設計人員和開發人員的工作,這就需要設計人員和開發人員具體必要的數據庫知識,這樣才能組成一個高效的團隊,然而事實上往往并非如此。誰來調整系統與系統涉及的每個人都在調整過程中起某些作用,當上什么時候調整系統多數人認為當用戶感覺性能差時才進行調整,這對調整過程中使用某些最有效的調整策略來說往往是太遲了。此時,如果你不愿意重新設計應用的話,你只能通過重新分配內存(調整SGA)和調整I/O的辦法或多或少地提高性能。Oracle提供了許多特性,這些特性只有應用到正確地設計的系統中時才能夠很大地提高性能。應用設計人員需要在設計階段設置應用的性能期望值。然后在設計和開發期間,應用設計人員應考慮哪些Oracle特性可以對系統有好處,并使用這些特性。
通過良好的系統設計,你就可以在應用的生命周期中消除性能調整的代價和挫折。下圖說明在應用的生命周期中調整的相對代價和收益,最有效的調整時間是在設計階段。在設計期間的調整能以最低的代價給你最大的收益。什么時候調整系統多數人認為當用戶感覺性能差時才進行調整,這對什么時候調整系統圖:在應用生命周期中調整的代價
什么時候調整系統圖:在應用生命周期中調整的代價什么時候調整系統圖:在應用生命周期中調整的收益什么時候調整系統圖:在應用生命周期中調整的收益調整的目標不管正在設計或維護系統,應該建立專門的性能目標,它使你知道何時要作調整。調整你的系統的最有效方法如下:當設計系統時考慮性能調整操作系統的硬件和軟件識別性能瓶頸確定問題的原因采取糾正的動作當你設計系統時,制定專門的目標;例如,響應時間小于3秒。當應用不能滿足此目標時,識別造成變慢的瓶頸(例如,I/O競爭),確定原因,采取糾正動作。在開發期間,你應測試應用研究,確定在采取應用之前是否滿足設計的性能目標。調整的目標不管正在設計或維護系統,應該建立專門的性能目標,它調整的目標調整通常是一系列開銷。一旦確定了瓶頸,可能要犧牲一些其它方面的指標來達到所要的結果。例如,如果I/O有問題,你可能需要更多內存或磁盤。如果不可能買,你可能要限制系統的并發性,來獲取所需的性能。如果你已經明確地定義了性能的目標,那用什么來交換高性能的決策就變的很容易的,因為已經確定了哪些方面是最重要的,如果我的目標為高性能,可能犧牲一些空間資源。隨著應用的越來越龐大,硬件性能的提高,全面的調整應用逐漸變成代價高昂的行為,在這樣情況下,要取得最大的投入/效率之比,較好的辦法是調整應用的關鍵部分,使其達到比較高的性能,這樣從總體上來說,整個系統的性能也是比較高的。這也就是有名的20/80原則,調整應用的20%(關鍵部分),能解決80%的問題。調整的目標調整通常是一系列開銷。一旦確定了瓶頸,可能要犧牲一SQL調整的目標去掉不必要的大型表的全表掃描。緩存小型表的全表掃描。校驗優化索引的使用。檢驗優化的連接技術。以上目標任務將占據SQL調整90%以上的工作。SQL調整的目標去掉不必要的大型表的全表掃描。在設計和開發時調整良好設計的系統可防止在應用生命周期中產生性能問題。系統設計人員和應用開發人員必須了解Oracle的查詢處理機制以便寫出高效的SQL語句。“有效的應用設計”討論了你的系統中各種可用的配置,以及每種配置更適合哪種類型的應用。“優化器”討論了Oracle的查詢優化器,以及如何寫語句以獲取最快的結果。在設計和開發時調整良好設計的系統可防止在應用生命周期中產生性在設計和開發時調整當設計你的系統時,使用下列優化性能的準則:-消除客戶機/服務器應用中不必要的網絡傳輸。使用存儲過程。-使用適合你系統的Oracle服務器選件(例如,并行查詢或分布式數據庫)。-除非你的應用有特殊的需要,否則使用缺省的Oracle鎖。-利用數據庫記住應用模塊,以便能以每個模塊為基礎來追蹤性能。-選擇你的數據塊的最佳大小。--原則上來說大一些的性能較好。-分布你的數據,使得一個節點使用的數據本地存貯在該節點中。在設計和開發時調整當設計你的系統時,使用下列優化性能的準則:目錄優化基礎知識性能調整綜述
有效的應用設計
SQL語句的處理過程
Oracle的優化器
Oracle的執行計劃注意事項目錄優化基礎知識有效的應用設計將最常用的應用分為2種類型:聯機事務處理類型(OLTP),決策支持系統(DSS)。聯機事務處理(OLTP)該類型的應用是高吞吐量,插入、更新、刪除操作比較多的系統,這些系統以不斷增長的大容量數據為特征,它們提供給成百用戶同時存取,典型的OLTP系統是訂票系統,銀行的業務系統,訂單系統。OTLP的主要目標是可用性、速度、并發性和可恢復性。當設計這類系統時,必須確保大量的并發用戶不能干擾系統的性能。還需要避免使用過量的索引與cluster表,因為這些結構會使插入和更新操作變慢。有效的應用設計將最常用的應用分為2種類型:聯機事務處理類型(有效的應用設計將最常用的應用分為2種類型:聯機事務處理類型(OLTP),決策支持系統(DSS)。決策支持(DSS)該類型的應用將大量信息進行提取形成報告,協助決策者作出正確的判斷。典型情況是:決策支持系統將OLTP應用收集的大量數據進行查詢。典型的應用為客戶行為分析系統(超市,保險等)。決策支持的關鍵目標是速度、精確性和可用性。該種類型的設計往往與OLTP設計的理念背道而馳,一般建議使用數據冗余、大量索引、clustertable、并行查詢等。近年來,該類型的應用逐漸與OLAP、數據倉庫緊密的聯系在一起,形成的一個新的應用方向。有效的應用設計將最常用的應用分為2種類型:聯機事務處理類型(目錄優化基礎知識性能調整綜述
有效的應用設計
SQL語句的處理過程
Oracle的優化器
Oracle的執行計劃注意事項目錄優化基礎知識SQL語句的處理過程1查詢語句處理2DML語句處理(insert,update,delete)3DDL語句處理(create..,drop..,alter..,)4事務控制(commit,rollback)SQL語句的處理過程1查詢語句處理SQL語句執行過程如圖:列出了處理和運行一個sql語句的需要各個重要階段。在某些情況下,Oracle運行sql的過程可能與下面列出的各個階段的順序有所不同。如DEFINE階段可能在FETCH階段之前,這主要依賴你如何書寫代碼SQL語句執行過程如圖:DML語句的處理假設你使用Pro*C程序來為指定部門的所有職員增加工資。程序已經連到正確的用戶,你可以在你的程序中嵌入如下的SQL語句:EXECSQLUPDATEemployeesSETsalary=1.10*salaryWHEREdepartment_id=:var_department_id;
var_department_id是程序變量,里面包含部門號,我們要修改該部門的職員的工資。當這個SQL語句執行時,使用該變量的值。DML語句的處理假設你使用Pro*C程序來為指定部門的所有DML語句的處理每種類型的語句都需要如下階段:?第1步:CreateaCursor創建游標?第2步:ParsetheStatement分析語句?第5步:BindAnyVariables綁定變量?第7步:RuntheStatement運行語句?第9步:ClosetheCursor關閉游標如果使用了并行功能,還會包含下面這個階段:?第6步:ParallelizetheStatement并行執行語句如果是查詢語句,則需要
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南京市六校聯合體高三語文作文
- 環保工程生態環境規劃考核試卷
- 中醫兒童保健專科建設專家共識解讀 2
- AIGC應用基礎課件
- 江西應用工程職業學院《外國文學二》2023-2024學年第二學期期末試卷
- 吉林省長春市九臺市2025年初三2月初三網上質量檢測試題生物試題含解析
- 江蘇省姜堰區溱潼二中市級名校2025屆初三期末生物試題含解析
- 上海市五愛高級中學2025屆第二學期高三年級期末教學質量檢測試題(一模)化學試題含解析
- 四川體育職業學院《數字欄目包裝技巧》2023-2024學年第二學期期末試卷
- 天津體育職業學院《影視作品鑒賞》2023-2024學年第二學期期末試卷
- 2025銀行協議存款合同
- DB32/T 3278-2017 油菜耐鹽性鑒定及評價技術規程
- 《高級語言程序設計》課程思政教學案例設計-以循環結構程序設計為例
- 2024年中國酸奶乳品市場調查研究報告
- 滬科版八年級物理全冊《8 復習:大氣壓強、流體壓強》教案
- 中醫治療盆腔炎
- 2023年高考英語試卷(新課標Ⅰ卷)含答案解析
- DB32T 4878-2024居住區供配電設施建設標準
- 微專題含膜電池-2024高考化學一輪考點擊破
- BRC內部審核檢查表(BRC內審檢查表)
- 古建筑修繕施工質量控制方案
評論
0/150
提交評論