版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、ORACLE培訓(xùn)-SQL性能優(yōu)化內(nèi)容概述課程主要討論: SQL語句執(zhí)行的過程、ORACLE優(yōu)化器,表之間的關(guān)聯(lián),如何得到SQL執(zhí)行計(jì)劃,如何分析執(zhí)行計(jì)劃等內(nèi)容,從而由淺到深的方式了解SQL優(yōu)化的過程,使大家逐步掌握SQL優(yōu)化。目錄 優(yōu)化基礎(chǔ)知識 性能調(diào)整綜述 有效的應(yīng)用設(shè)計(jì) SQL語句的處理過程 Oracle的優(yōu)化器 Oracle的執(zhí)行計(jì)劃 注意事項(xiàng)一、優(yōu)化基礎(chǔ)知識概述性能管理性能問題調(diào)整的方法SQL優(yōu)化機(jī)制應(yīng)用的調(diào)整SQL語句的處理過程共享SQL區(qū)域SQL語句處理的階段共享游標(biāo)SQL編碼標(biāo)準(zhǔn)Oracle 優(yōu)化器介紹SQL Tunning Tips優(yōu)化Tools性能管理盡早開始設(shè)立合適目標(biāo)邊調(diào)
2、整邊監(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語句性能不佳大致有兩個(gè)原因:開發(fā)人員只關(guān)注查詢結(jié)果的正確性,忽視查詢語句的效率。開發(fā)人員只關(guān)注SQL語句本身的效率,對SQL語句執(zhí)行原理、影響SQL執(zhí)行效率的主要因素不清楚。* 前者可以通過深入學(xué)習(xí)SQL語法及各種SQL調(diào)優(yōu)技巧進(jìn)行解決。 SQL調(diào)優(yōu)是一個(gè)系統(tǒng)工程,熟悉SQL語法、掌握各種內(nèi)嵌函數(shù)、分 析函數(shù)的用法只是編寫高效SQL的必要條件。* 后者從分析SQL語句執(zhí)行原理入手,指出SQL調(diào)優(yōu)應(yīng)在優(yōu)化SQL解
3、 析和優(yōu)化CBO上。調(diào)優(yōu)領(lǐng)域調(diào)優(yōu)領(lǐng)域:應(yīng)用程序級調(diào)優(yōu): * SQL語句調(diào)優(yōu) * 管理變化調(diào)優(yōu)2. 實(shí)例級調(diào)優(yōu) * 內(nèi)存 * 數(shù)據(jù)結(jié)構(gòu) * 實(shí)例配置3. 操作系統(tǒng)交互 * I/O * SWAP * Parameters本課程內(nèi)容只講解討論應(yīng)用程序級:Oracle SQL語句調(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語句調(diào)整物理結(jié)構(gòu)調(diào)整內(nèi)存分配調(diào)整I/O調(diào)整內(nèi)存競爭調(diào)整操作系統(tǒng)不同調(diào)整產(chǎn)生相應(yīng)性能收益調(diào)整的角色SQL語句優(yōu)化是提高性能的重要環(huán)節(jié)開發(fā)人員不能只注重功能的實(shí)現(xiàn),不管性能如何開發(fā)人員不能把Oracle當(dāng)成一個(gè)黑盒子,必須了解其結(jié)構(gòu)、處理SQL和數(shù)據(jù)的方法必
4、需遵守既定的開發(fā)規(guī)范未經(jīng)過SQL語句優(yōu)化的模塊不要上線SQL語句優(yōu)化的過程定位有問題的語句檢查執(zhí)行計(jì)劃檢查執(zhí)行過程中優(yōu)化器的統(tǒng)計(jì)信息分析相關(guān)表的記錄數(shù)、索引情況改寫SQL語句、使用HINT、調(diào)整索引、表分析有些SQL語句不具備優(yōu)化的可能,需要優(yōu)化處理方式達(dá)到最佳執(zhí)行計(jì)劃什么是好的SQL語句?盡量簡單,模塊化易讀、易維護(hù)節(jié)省資源內(nèi)存CPU掃描的數(shù)據(jù)塊要少少排序不造成死鎖SQL共享原理 ORACLE將執(zhí)行過的SQL語句存放在內(nèi)存的共享池(shared buffer pool)中,可以被所有的數(shù)據(jù)庫用戶共享。當(dāng)你執(zhí)行一個(gè)SQL語句(有時(shí)被稱為一個(gè)游標(biāo))時(shí),如果它和之前的執(zhí)行過的語句完全相同, ORA
5、CLE就能很快獲得已經(jīng)被解析的語句以及最好的 執(zhí)行路徑. 這個(gè)功能大大地提高了SQL的執(zhí)行性能并節(jié)省了內(nèi)存的使用。SQL共享原理為了不重復(fù)解析相同的SQL語句,在第一次解析之后,Oracle將SQL語句存放在內(nèi)存中。這塊位于系統(tǒng)全局區(qū)域SGA(systemglobal area)的共享池(shared buffer poo1)中的內(nèi)存可以被所有的數(shù)據(jù)庫用戶共享。因此,當(dāng)你執(zhí)行一個(gè)SQL語句(有時(shí)被稱為一個(gè)游標(biāo))時(shí),如果它和之前執(zhí)行過的語句完全相同,Oracle就能很快獲得已經(jīng)被解析的語句以及最好的執(zhí)行方案。Oracle的這個(gè)功能大大地提高了SQL的執(zhí)行性能并節(jié)省了內(nèi)存的使用??上У氖?,Orac
6、le只對簡單的表提供高速緩沖(cache bufferiIlg),這個(gè)功能并不適用于多表連接查詢。數(shù)據(jù)庫管理員必須在啟動(dòng)參數(shù)文件中為這個(gè)區(qū)域設(shè)置合適的參數(shù),當(dāng)這個(gè)內(nèi)存區(qū)域越大,就可以保留更多的語句,當(dāng)然被共享的可能性也就越大了。當(dāng)向Oracle提交一個(gè)SQL語句時(shí),Oracle會(huì)首先在這塊內(nèi)存中查找相同的語句。SQL共享的三個(gè)條件當(dāng)前被執(zhí)行的語句和共享池中的語句必須完全相同 (包括大小寫、空格、換行等)兩個(gè)語句所指的對象必須完全相同 (同義詞與表是不同的對象)兩個(gè)SQL語句中必須使用相同的名字的綁定變量(bind variables) 共享SQL語句注意:Oracle對兩者采取的是一種嚴(yán)格匹配
7、策略,要達(dá)成共享。SQL語句必須完全相同(包括空格、換行等)。能夠使用共享的語句必須滿足三個(gè)條件: 字符級的比較。當(dāng)前被執(zhí)行的語句和共享池中的語句必須完全相同。例如: SELECT * FROM ATABLE;和下面每一個(gè)SQL語句都不同:SELECT *from ATABLESelect * From Atable; 語句所指對象必須完全相同 即兩條SQL語句操作的數(shù)據(jù)庫對象必須同一。語句中必須使用相同命名的綁定變量。如:第一組的兩個(gè)SQL語句是相同的,可以共享;而第二組中兩個(gè)語句不同,即使在運(yùn)行時(shí)賦予不同的綁定變量以相同的值: 第一組 select pin,name from people
8、 where pin = :blk1.pin;select pin,name from people where pin =:blk1.pin;第二組 select pin,name from people where pin =:blk1.ot_jnd;select pin,name from people where pin = :blk1.ov_jnd;SQL語句的處理過程共享SQL區(qū)域Sql 處理過程SQL PARSE與共享SQL語句當(dāng)一個(gè)Oracle實(shí)例接收一條sql后1、Create a Cursor 創(chuàng)建游標(biāo)2、Parse the Statement 分析語句3、Describe
9、 Results of a Query 描述查詢的結(jié)果集4、Define Output of a Query 定義查詢的輸出數(shù)據(jù)5、Bind Any Variables 綁定變量6、Parallelize the Statement 并行執(zhí)行語句7、Run the Statement 運(yùn)行語句8、Fetch Rows of a Query 取查詢出來的行9、Close the Cursor 關(guān)閉游標(biāo) 為什么要bind variables?字符級的比較:SELECT * FROM USER_FILES WHERE USER_NO = 10001234; 與SELECT * FROM USER_F
10、ILES WHERE USER_NO = 10004321;檢查:select name,executionsfrom v$db_object_cachewhere name like select * from user_files%什么叫做重編譯問題什么叫做重編譯?下面這個(gè)語句每執(zhí)行一次就需要在SHARE POOL 硬解析一次,一百萬用戶就是一百萬次,消耗CPU和內(nèi)存,如果業(yè)務(wù)量大,很可能導(dǎo)致宕庫如果綁定變量,則只需要硬解析一次,重復(fù)調(diào)用即可select * from dConMsg where contract_no = 32013484095139綁定變量解決重編譯問題未使用綁定變量的
11、語句sprintf(sqlstr, insert into scott.test1 (num1, num2) values (%d,%d),n_var1, n_var2);EXEC SQL EXECUTE IMMEDIATE :sqlstr ;EXEC SQL COMMIT; 使用綁定變量的語句 strcpy(sqlstr, insert into test (num1, num2) values (:v1, :v2);EXEC SQL PREPARE sql_stmt FROM :sqlstr;EXEC SQL EXECUTE sql_stmt USING :n_var1, :n_var2;
12、EXEC SQL COMMIT; 綁定變量的注意事項(xiàng)注意:1、不要使用數(shù)據(jù)庫級的變量綁定參數(shù)cursor_sharing來強(qiáng)制綁定,無論其值為 force 還是similar2、有些帶 0性能優(yōu)于select count(*)from tab;盡量少嵌套子查詢,這種查詢會(huì)消耗大量的CPU資源;對于有比較多or運(yùn)算的查詢,建議分成多個(gè)查詢,用union all聯(lián)結(jié)起來;多表查詢的查詢語句中,選擇最有效率的表名順序。Oracle解析器對表解析從右到左,所以記錄少的表放在右邊。 盡量多用commit語句提交事務(wù),可以及時(shí)釋放資源、解鎖、釋放日志空間、減少管理花費(fèi);在頻繁的、性能要求比較高的數(shù)據(jù)操作中
13、,盡量避免遠(yuǎn)程訪問,如數(shù)據(jù)庫鏈等,訪問頻繁的表可以常駐內(nèi)存:alter tablecache; 在Oracle中動(dòng)態(tài)執(zhí)行SQL,盡量用execute方式,不用dbms_sql包。* SQL Tunning Tips *sql 語句的編寫原則和優(yōu)化 隨著數(shù)據(jù)庫中數(shù)據(jù)的增加,系統(tǒng)的響應(yīng)速度就成為目前系統(tǒng)需要解決的最主要的問題之一。系統(tǒng)優(yōu)化中一個(gè)很重要的方面就是SQL語句的優(yōu)化。對于大量數(shù)據(jù),劣質(zhì)SQL語句和優(yōu)質(zhì)SQL語句之間的速度差別可以達(dá)到上百倍,對于一個(gè)系統(tǒng)不是簡單地能實(shí)現(xiàn)其功能就可,而是要寫出高質(zhì)量的SQL語句,提高系統(tǒng)的可用性。在多數(shù)情況下,Oracle使用索引來更快地遍歷表,優(yōu)化器主要根
14、據(jù)定義的索引來提高性能。如果在SQL語句的where子句中寫的SQL代碼不合理,就會(huì)造成優(yōu)化器刪去索引而使用全表掃描,一般就這種SQL語句就是所謂的劣質(zhì)SQL語句。sql 語句的編寫原則和優(yōu)化 在編寫SQL語句時(shí)我們應(yīng)清楚優(yōu)化器根據(jù)何種原則來使用索引,這有助于寫出高性能的SQL語句。SQL語句的編寫原則和SQL語句的優(yōu)化,請跟我一起學(xué)習(xí)以下幾方面:Tunning Tip的各個(gè)方面1.不要讓Oracle做得太多;2.給優(yōu)化器更明確的命令; 3.減少訪問次數(shù);4.細(xì)節(jié)上的影響;1.不要讓Oracle做得太多避免復(fù)雜的多表關(guān)聯(lián)select from user_files uf, df_money_f
15、iles dm, cw_charge_record ccwhere uf.user_no = dm.user_noand dm.user_no = cc.user_noand and not exists(select )?很難優(yōu)化,隨著數(shù)據(jù)量的增加性能的風(fēng)險(xiǎn)很大。避免使用 * 當(dāng)你想在SELECT子句中列出所有的COLUMN時(shí),使用動(dòng)態(tài)SQL列引用 * 是一個(gè)方便的方法.不幸的是,這是一個(gè)非常低效的方法. 實(shí)際上,ORACLE在解析的過程中, 會(huì)將* 依次轉(zhuǎn)換成所有的列名, 這個(gè)工作是通過查詢數(shù)據(jù)字典完成的, 這意味著將耗費(fèi)更多的時(shí)間;只提取你所要使用的列;使用別名能夠加快解析速度;避免使用
16、耗費(fèi)資源的操作帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會(huì)啟動(dòng)SQL引擎執(zhí)行耗費(fèi)資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執(zhí)行兩次排序.例如,一個(gè)UNION查詢,其中每個(gè)查詢都帶有GROUP BY子句, GROUP BY會(huì)觸發(fā)嵌入排序(NESTED SORT) ; 這樣, 每個(gè)查詢需要執(zhí)行一次排序, 然后在執(zhí)行UNION時(shí), 又一個(gè)唯一排序(SORT UNIQUE)操作被執(zhí)行而且它只能在前面的嵌入排序結(jié)束后才能開始執(zhí)行. 嵌入的排序的深度會(huì)大大影響查詢的效率.通常, 帶有UNION, MINUS , I
17、NTERSECT的SQL語句都可以用其他方式重寫.用EXISTS替換DISTINCT例如:低效: SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO高效: SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT X FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);用UNION-ALL 替換UNION ( if possible)當(dāng)SQL語句需要UNION兩個(gè)查詢結(jié)果集合時(shí),這兩個(gè)結(jié)果集合會(huì)以UN
18、ION-ALL的方式被合并, 然后在輸出最終結(jié)果前進(jìn)行排序.舉例: 低效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 31-DEC-95 UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 31-DEC-95高效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 31-DEC-95 UNION ALL
19、SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 31-DEC-952. 給優(yōu)化器更明確的命令自動(dòng)選擇索引如果表中有兩個(gè)以上(包括兩個(gè))索引,其中有一個(gè)唯一性索引,而其他是非唯一性在這種情況下,ORACLE將使用唯一性索引而完全忽略非唯一性索引舉例:SELECT ENAMEFROM EMPWHERE EMPNO = 2326 AND DEPTNO = 20 ;這里,只有EMPNO上的索引是唯一性的,所以EMPNO索引將用來檢索記錄TABLE ACCESS BY ROWID ON EMP INDEX UN
20、IQUE SCAN ON EMP_NO_IDX至少要包含組合索引的第一列如果索引是建立在多個(gè)列上, 只有在它的第一個(gè)列(leading column)被where子句引用時(shí),優(yōu)化器才會(huì)選擇使用該索引. SQL create table multiindexusage ( inda number , indb number , descr varchar2(10);Table created.SQL create index multindex on multiindexusage(inda,indb);Index created.SQL set autotrace traceonlySQL s
21、elect * from multiindexusage where inda = 1;Execution Plan- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF MULTIINDEXUSAGE 2 1 INDEX (RANGE SCAN) OF MULTINDEX (NON-UNIQUE)SQL select * from multiindexusage where indb = 1;Execution Plan- 0 SELECT STATEMENT Optimizer=CHOOSE 1
22、0 TABLE ACCESS (FULL) OF MULTIINDEXUSAGE 很明顯, 當(dāng)僅引用索引的第二個(gè)列時(shí),優(yōu)化器使用了全表掃描而忽略了索引避免在索引列上使用函數(shù)WHERE子句中,如果索引列是函數(shù)的一部分優(yōu)化器將不使用索引而使用全表掃描舉例:低效:SELECT FROM DEPTWHERE SAL * 12 25000;高效:SELECT FROM DEPTWHERE SAL 25000/12;避免使用前置通配符WHERE子句中, 如果索引列所對應(yīng)的值的第一個(gè)字符由通配符(WILDCARD)開始, 索引將不被采用. SELECT USER_NO,USER_NAME,ADDRESSFR
23、OM USER_FILESWHERE USER_NO LIKE %109204421; 在這種情況下,ORACLE將使用全表掃描.避免在索引列上使用NOT通常,我們要避免在索引列上使用NOT, NOT會(huì)產(chǎn)生在和在索引列上使用函數(shù)相同的影響. 當(dāng)ORACLE”遇到”NOT,他就會(huì)停止使用索引轉(zhuǎn)而執(zhí)行全表掃描.舉例: 低效: (這里,不使用索引) SELECT FROM DEPT WHERE DEPT_CODE NOT = 0; 高效: (這里,使用了索引) SELECT FROM DEPT WHERE DEPT_CODE 0;避免在索引列上使用 IS NULL和IS NOT NULL避免在索引中
24、使用任何可以為空的列,ORACLE將無法使用該索引 對于單列索引,如果列包含空值,索引中將不存在此記錄. 對于復(fù)合索引,如果每個(gè)列都為空,索引中同樣不存在此記錄.如果至少有一個(gè)列不為空,則記錄存在于索引中如果唯一性索引建立在表的A列和B列上, 并且表中存在一條記錄的A,B值為(123,null) , ORACLE將不接受下一條具有相同A,B值(123,null)的記錄(插入). 然而如果所有的索引列都為空,ORACLE將認(rèn)為整個(gè)鍵值為空而空不等于空. 因此你可以插入1000條具有相同鍵值的記錄,當(dāng)然它們都是空!因?yàn)榭罩挡淮嬖谟谒饕兄?所以WHERE子句中對索引列進(jìn)行空值比較將使ORACLE停
25、用該索引.任何在where子句中使用is null或is not null的語句優(yōu)化器是不允許使用索引的。避免出現(xiàn)索引列自動(dòng)轉(zhuǎn)換當(dāng)比較不同數(shù)據(jù)類型的數(shù)據(jù)時(shí), ORACLE自動(dòng)對列進(jìn)行簡單的類型轉(zhuǎn)換.假設(shè)EMP_TYPE是一個(gè)字符類型的索引列.SELECT USER_NO,USER_NAME,ADDRESSFROM USER_FILESWHERE USER_NO = 109204421這個(gè)語句被ORACLE轉(zhuǎn)換為:SELECT USER_NO,USER_NAME,ADDRESSFROM USER_FILESWHERE TO_NUMBER(USER_NO) = 109204421 因?yàn)閮?nèi)部發(fā)生的類
26、型轉(zhuǎn)換, 這個(gè)索引將不會(huì)被用到! 在查詢時(shí)盡量少用格式轉(zhuǎn)換如用 WHERE a.order_no = b.order_no 不用 WHERE TO_NUMBER (substr(a.order_no, instr(b.order_no, .) - 1) = TO_NUMBER (substr(a.order_no, instr(b.order_no, .) - 1)3.減少訪問次數(shù)減少訪問數(shù)據(jù)庫的次數(shù)當(dāng)執(zhí)行每條SQL語句時(shí), ORACLE在內(nèi)部執(zhí)行了許多工作: 解析SQL語句, 估算索引的利用率, 綁定變量 , 讀數(shù)據(jù)塊等等. 由此可見, 減少訪問數(shù)據(jù)庫的次數(shù) , 就能實(shí)際上減少ORACLE的
27、工作量.類比,工程實(shí)施使用DECODE來減少處理時(shí)間例如: SELECT COUNT(*),SUM(SAL) FROMEMP WHERE DEPT_NO = 0020 AND ENAME LIKESMITH%; SELECT COUNT(*),SUM(SAL) FROMEMP WHERE DEPT_NO = 0030 AND ENAME LIKESMITH%;你可以用DECODE函數(shù)高效地得到相同結(jié)果SELECT COUNT(DECODE(DEPT_NO,0020,X,NULL) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,X,NULL) D0030_COUN
28、T, SUM(DECODE(DEPT_NO,0020,SAL,NULL) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,NULL) D0030_SALFROM EMP WHERE ENAME LIKE SMITH%;減少對表的查詢在含有子查詢的SQL語句中,要特別注意減少對表的查詢.例如: 低效 SELECT TAB_NAME FROM TABLES WHERE TAB_NAME = ( SELECT TAB_NAME FROM TAB_COLUMNS WHERE VERSION = 604) ANDDB_VER= ( SELECT DB_VER FROM TA
29、B_COLUMNS WHERE VERSION = 604) 高效 SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VER) FROM TAB_COLUMNS WHERE VERSION = 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ù)據(jù)比較少或該表的過濾條件
30、比較確定,能大大縮小查詢范圍,則將最具有選擇性部分放在WHERE子句中的最后:select * from emp e,dept d where d.deptno 10 and e.deptno =30 ; 如果dept表返回的記錄數(shù)較多的話,上面的查詢語句會(huì)比下面的查詢語句響應(yīng)快得多。select * from emp e,dept d where e.deptno =30 and d.deptno 10 ;WHERE子句 函數(shù)、表達(dá)式使用最好不要在WHERE子句中使用函或表達(dá)式,如果要使用的話,最好統(tǒng)一使用相同的表達(dá)式或函數(shù),這樣便于以后使用合理的索引。Order by語句 ORDER BY
31、語句決定了Oracle如何將返回的查詢結(jié)果排序。Order by語句對要排序的列沒有什么特別的限制,也可以將函數(shù)加入列中(象聯(lián)接或者附加等)。任何在Order by語句的非索引項(xiàng)或者有計(jì)算表達(dá)式都將降低查詢速度。仔細(xì)檢查order by語句以找出非索引項(xiàng)或者表達(dá)式,它們會(huì)降低性能。解決這個(gè)問題的辦法就是重寫order by語句以使用索引,也可以為所使用的列建立另外一個(gè)索引,同時(shí)應(yīng)絕對避免在order by子句中使用表達(dá)式。聯(lián)接列 對于有聯(lián)接的列,即使最后的聯(lián)接值為一個(gè)靜態(tài)值,優(yōu)化器是不會(huì)使用索引的。 select * from employss where first_name|last_na
32、me =Beill Cliton; 系統(tǒng)優(yōu)化器對基于last_name創(chuàng)建的索引沒有使用。 當(dāng)采用下面這種SQL語句的編寫,Oracle系統(tǒng)就可以采用基于last_name創(chuàng)建的索引。 select * from employee where first_name =Beill and last_name =Cliton; 帶通配符(%)的like語句 通配符(%)在搜尋詞首出現(xiàn),Oracle系統(tǒng)不使用last_name的索引。select * from employee where last_name like %cliton%; 在很多情況下可能無法避免這種情況,但是一定要心中有底,通配符
33、如此使用會(huì)降低查詢速度。然而當(dāng)通配符出現(xiàn)在字符串其他位置時(shí),優(yōu)化器就能利用索引。在下面的查詢中索引得到了使用: select * from employee where last_name like c%; 用Where子句替換HAVING子句避免使用HAVING子句, HAVING 只會(huì)在檢索出所有記錄之后才對結(jié)果集進(jìn)行過濾. 這個(gè)處理需要排序,總計(jì)等操作. 如果能通過WHERE子句限制記錄的數(shù)目,那就能減少這方面的開銷.例如: 低效: SELECT REGION,AVG(LOG_SIZE) FROM LOCATION GROUP BY REGION HAVING REGION REGION
34、 != SYDNEY AND REGION != PERTH 高效 SELECT REGION,AVG(LOG_SIZE) FROM LOCATION WHERE REGION REGION != SYDNEY AND REGION != PERTH GROUP BY REGION 順序 WHERE GROUP HAVING用NOT EXISTS 替代 NOT IN在子查詢中,NOT IN子句將執(zhí)行一個(gè)內(nèi)部的排序和合并. 無論在哪種情況下,NOT IN都是最低效的 (因?yàn)樗鼘ψ硬樵冎械谋韴?zhí)行了一個(gè)全表遍歷). 使用NOT EXISTS 子句可以有效地利用索引。盡可能使用NOT EXISTS來代
35、替NOT IN,盡管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查詢效率更高。例如:語句1 SELECT dname, deptno FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp); 語句2 SELECT dname, deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp WHERE dept.deptno = emp.deptno); 2要比1的執(zhí)行性能好很多。因?yàn)?中對emp進(jìn)行了full table scan,這是很浪費(fèi)時(shí)間的操
36、作。而且1中沒有用到emp的index, 因?yàn)闆]有where子句。而2中的語句對emp進(jìn)行的是縮小范圍的查詢。用索引提高效率索引是表的一個(gè)概念部分,用來提高檢索數(shù)據(jù)的效率,ORACLE使用了一個(gè)復(fù)雜的自平衡B-tree結(jié)構(gòu). 通常,通過索引查詢數(shù)據(jù)比全表掃描要快. 當(dāng)ORACLE找出執(zhí)行查詢和Update語句的最佳路徑時(shí), ORACLE優(yōu)化器將使用索引. 同樣在聯(lián)結(jié)多個(gè)表時(shí)使用索引也可以提高效率. 另一個(gè)使用索引的好處是,它提供了主鍵(primary key)的唯一性驗(yàn)證。通常, 在大型表中使用索引特別有效. 當(dāng)然,你也會(huì)發(fā)現(xiàn), 在掃描小表時(shí),使用索引同樣能提高效率. 雖然使用索引能得到查詢效
37、率的提高,但是我們也必須注意到它的代價(jià). 索引需要空間來存儲(chǔ),也需要定期維護(hù), 每當(dāng)有記錄在表中增減或索引列被修改時(shí), 索引本身也會(huì)被修改. 這意味著每條記錄的INSERT , DELETE , UPDATE將為此多付出4 , 5 次的磁盤I/O . 因?yàn)樗饕枰~外的存儲(chǔ)空間和處理,那些不必要的索引反而會(huì)使查詢反應(yīng)時(shí)間變慢.。定期的重構(gòu)索引是有必要的。避免在索引列上使用計(jì)算WHERE子句中,如果索引列是函數(shù)的一部分優(yōu)化器將不使用索引而使用全表掃描 低效: SELECT FROM DEPT WHERE SAL * 12 25000; 高效: SELECT FROM DEPT WHERE SAL
38、 25000/12;用= 替代 如果DEPTNO上有一個(gè)索引。 高效: SELECT * FROM EMP WHERE DEPTNO =4 低效: SELECT * FROM EMP WHERE DEPTNO 3通過使用=、=等,避免使用NOT命令例子:select * from employee where salary 3000; 對這個(gè)查詢,可以改寫為不使用NOT:select * from employee where salary3000; 雖然這兩種查詢的結(jié)果一樣,但是第二種查詢方案會(huì)比第一種查詢方案更快些。第二種查詢允許Oracle對salary列使用索引,而第一種查詢則不能使用
39、索引。如果有其它辦法,不要使用子查詢。外部聯(lián)接+的用法 外部聯(lián)接+按其在=的左邊或右邊分左聯(lián)接和右聯(lián)接。若不帶+運(yùn)算符的表中的一個(gè)行不直接匹配于帶+預(yù)算符的表中的任何行,則前者的行與后者中的一個(gè)空行相匹配并被返回。利用外部聯(lián)接+,可以替代效率十分低下的 not in 運(yùn)算,大大提高運(yùn)行速度。例如,下面這條命令執(zhí)行起來很慢:select a.empno from emp a where a.empno not in(select empno from emp1 where job=SALE);利用外部聯(lián)接,改寫命令如下: select a.empno from emp a ,emp1 b whe
40、re a.empno=b.empno(+) and b.empno is null and b.job=SALE;這樣運(yùn)行速度明顯提高.盡量多使用COMMIT 事務(wù)是消耗資源的,大事務(wù)還容易引起死鎖 COMMIT所釋放的資源: 回滾段上用于恢復(fù)數(shù)據(jù)的信息. 被程序語句獲得的鎖 redo log buffer 中的空間 ORACLE為管理上述3種資源中的內(nèi)部花費(fèi)用TRUNCATE替代DELETE當(dāng)刪除表中的記錄時(shí),在通常情況下, 回滾段(rollback segments ) 用來存放可以被恢復(fù)的信息. 如果你沒有COMMIT事務(wù),ORACLE會(huì)將數(shù)據(jù)恢復(fù)到刪除之前的狀態(tài)(準(zhǔn)確地說是恢復(fù)到執(zhí)行刪
41、除命令之前的狀況)而當(dāng)運(yùn)用TRUNCATE時(shí), 回滾段不再存放任何可被恢復(fù)的信息.當(dāng)命令運(yùn)行后,數(shù)據(jù)不能被恢復(fù).因此很少的資源被調(diào)用,執(zhí)行時(shí)間也會(huì)很短.計(jì)算記錄條數(shù)和一般的觀點(diǎn)相反, count(*) 比count(1)稍快 , 當(dāng)然如果可以通過索引檢索,對索引列的計(jì)數(shù)仍舊是最快的. 例如 COUNT(EMPNO)字符型字段的引號比如有的表PHONE_NO字段是CHAR型,而且創(chuàng)建有索引,但在WHERE條件中忘記了加引號,就不會(huì)用到索引。WHERE PHONE_NOHERE PHONE_NO化EXPORT和IMPORT使用較大的BUFFER(
42、比如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 語句的執(zhí)行步驟語法分析 ,分析語句的語法是否符合規(guī)范,衡量語句中各表達(dá)式的意義。 語義分析 ,檢查語句中涉及的所有數(shù)據(jù)庫對象是否存在,且用戶有相應(yīng)的權(quán)限。 視圖轉(zhuǎn)換,將涉及視圖的查詢語句轉(zhuǎn)換為相應(yīng)的對基表查詢語句。 表達(dá)式轉(zhuǎn)換, 將復(fù)雜的 SQL 表達(dá)式轉(zhuǎn)換為較簡單的等效連接表達(dá)式。 選擇優(yōu)化器,不同的優(yōu)化器一般產(chǎn)生不同的“執(zhí)行計(jì)劃” 選擇連接方式, ORA
43、CLE 有三種連接方式,對多表連接 ORACLE 可選擇適當(dāng)?shù)倪B接方式。 選擇連接順序, 對多表連接 ORACLE 選擇哪一對表先連接,選擇這兩表中哪個(gè)表做為源數(shù)據(jù)表。 選擇數(shù)據(jù)的搜索路徑, 根據(jù)以上條件選擇合適的數(shù)據(jù)搜索路徑,如是選用全表搜索還是利用索引或是其他的方式。 運(yùn)行“執(zhí)行計(jì)劃”優(yōu)化器與執(zhí)行計(jì)劃Oracle在執(zhí)行一個(gè)SQL之前,首先要分析一下語句的執(zhí)行計(jì)劃,然后再按執(zhí)行計(jì)劃去執(zhí)行。分析語句的執(zhí)行計(jì)劃的工作是由優(yōu)化器(Optimizer)來完成的 Oracle的優(yōu)化器共有兩種的優(yōu)化方式,即基于規(guī)則的優(yōu)化方式(Rule-Based Optimization,簡稱為RBO)和基于代價(jià)的優(yōu)化
44、方式(Cost-Based Optimization,簡稱為CBO)。 A、RBO方式:優(yōu)化器在分析SQL語句時(shí),所遵循的是Oracle內(nèi)部預(yù)定 的一些規(guī)則。比如我們常見的,當(dāng)一個(gè)where子句中的一列有索引時(shí)去走索引。B、CBO方式:是看語句的代價(jià)(Cost)了,這里的代價(jià)主要指Cpu和內(nèi)存。優(yōu)化器在判斷是否用這種方式時(shí),主要參照的是表及索引的統(tǒng)計(jì)信息,很多的時(shí)侯過期統(tǒng)計(jì)信息會(huì)令優(yōu)化器做出一個(gè)錯(cuò)誤的執(zhí)行計(jì)劃在Oracle8及以后的版本,Oracle推薦用CBO的方式。 在Oracle10g中,取消了RBO的支持。優(yōu)化器與執(zhí)行計(jì)劃Rule:即走基于規(guī)則的方式Choose:默認(rèn)的情況下Oracl
45、e用的便是這種方式。當(dāng)一個(gè)表或或索引有統(tǒng)計(jì)信息,則走CBO的方式,如果表或索引沒統(tǒng)計(jì)信息,表又不是特別的小,而且相應(yīng)的列有索引時(shí),那么就走索引,走RBO的方式First Rows:它與Choose方式是類似的,所不同的是當(dāng)一個(gè)表有統(tǒng)計(jì)信息時(shí),它將是以最快的方式返回查詢的最先的幾行,從總體上減少了響應(yīng)時(shí)間All Rows:all_rows是oracle優(yōu)化器默認(rèn)的模式,它將選擇一種在最短時(shí)間內(nèi)返回所有數(shù)據(jù)的執(zhí)行計(jì)劃,它將基于整體成本的考慮. first_rows_n:first_rows_n是根據(jù)成本而不是基于硬編碼的規(guī)則來選擇執(zhí)行計(jì)劃.n可以是1,10,100,1000或者直接用first_r
46、ows(n) hint指定任意正數(shù).這里的n是我們想獲取結(jié)果集的前n條記錄,這種需求在很多分頁語句的需求中會(huì)碰到. 用EXPLAIN PLAN 分析SQL語句EXPLAIN PLAN 是一個(gè)很好的分析SQL語句的工具,它甚至可以在不執(zhí)行SQL的情況下分析語句. 通過分析,我們就可以知道ORACLE是怎么樣連接表,使用什么方式掃描表(索引掃描或全表掃描)以及使用到的索引名稱.你需要按照從里到外,從上到下的次序解讀分析的結(jié)果. EXPLAIN PLAN分析的結(jié)果是用縮進(jìn)的格式排列的, 最內(nèi)部的操作將被最先解讀, 如果兩個(gè)操作處于同一層中,帶有最小操作號的將被首先執(zhí)行.NESTED LOOP是少數(shù)不
47、按照上述規(guī)則處理的操作, 正確的執(zhí)行路徑是檢查對NESTED LOOP提供數(shù)據(jù)的操作,其中操作號最小的將被最先處理.Autotrace 解讀Current mode:對于修改的數(shù)據(jù)從數(shù)據(jù)段中讀Read-consistent mode: 讀一致性模式Physical block:物理塊(如8192字節(jié))Recursive calls:嵌套調(diào)用次數(shù)使用TKPROF 工具SQL trace 工具收集正在執(zhí)行的SQL的性能狀態(tài)數(shù)據(jù)并記錄到一個(gè)跟蹤文件中. 這個(gè)跟蹤文件提供了許多有用的信息,例如解析次數(shù).執(zhí)行次數(shù),CPU使用時(shí)間等.這些數(shù)據(jù)將可以用來優(yōu)化你的系統(tǒng).設(shè)置SQL TRACE在會(huì)話級別: 有效
48、ALTER SESSION SET SQL_TRACE TRUE設(shè)置SQL TRACE 在整個(gè)數(shù)據(jù)庫有效, 你必須將SQL_TRACE參數(shù)在init.ora中設(shè)為TRUE, USER_DUMP_DEST參數(shù)說明了生成跟蹤文件的目錄再使用TKPROF對TRACE文件進(jìn)行分析分析結(jié)果更加準(zhǔn)確、清楚在SQLPLUS 配置AUTOTRACEAUTOTRACE 參數(shù)解 釋SET AUTOTRACE OFF不能獲得AUTOTRACE報(bào)告. 這是默認(rèn)的.SET AUTOTRACE ON EXPLAIN僅僅顯示優(yōu)化器執(zhí)行計(jì)劃的AUTOTRACE報(bào)告SET AUTOTRACE ON STATISTICS僅僅顯示
49、SQL語句執(zhí)行的統(tǒng)計(jì)結(jié)果的AUTOTRACE報(bào)告SET AUTOTRACE ON包括上面兩項(xiàng)內(nèi)容的AUTOTRACE報(bào)告SET AUTOTRACE TRACEONLY與SET AUTOTRACE ON類似,所有的統(tǒng)計(jì)和數(shù)據(jù)都在,但不可以打印在SQLPLUS 配置AUTOTRACE1、 首先創(chuàng)建PLUSTRACE角色并且賦給public:Sql $ORACLE_HOME/sqlplus/admin/plustrce.sql2、 賦權(quán)限給用戶Sql grant plustrace to public(預(yù)賦權(quán)的用戶名);3、以SYSTEM用戶創(chuàng)建PLAN_TABLE表 Sql $ORACLE_HOM
50、E/rdbms/admin/utlxplan.sqlSql create public synonym plan_table for plan_table;Sql grant all on plan_table to public;在每個(gè)用戶下設(shè)置AUTOTRACE可顯示其執(zhí)行計(jì)劃。優(yōu)化器與執(zhí)行計(jì)劃SQL select ename,dname from emp, dept where emp.deptno=dept.deptno and dept.dname in (ACCOUNTING,RESEARCH,SALES,OPERATIONS);Execution Plan- 0 SELECT S
51、TATEMENT Optimizer=CHOOSE 1 0 NESTED LOOPS 2 1 TABLE ACCESS (FULL) OF EMP 3 1 TABLE ACCESS (BY INDEX ROWID) OF DEPT 4 3 INDEX (UNIQUE SCAN) OF PK_DEPT (UNIQUE) 最起碼要解決全表掃描問題改變where條件的次序一般沒有用目錄 優(yōu)化基礎(chǔ)知識 性能調(diào)整綜述 有效的應(yīng)用設(shè)計(jì) SQL語句的處理過程 Oracle的優(yōu)化器 Oracle的執(zhí)行計(jì)劃 注意事項(xiàng)性能調(diào)整綜述誰來調(diào)整系統(tǒng)? 什么時(shí)候調(diào)整? 建立有效調(diào)整的目標(biāo) 在設(shè)計(jì)和開發(fā)時(shí)的調(diào)整 誰來調(diào)整系
52、統(tǒng)應(yīng)用設(shè)計(jì)人員必須傳達(dá)應(yīng)用系統(tǒng)的設(shè)計(jì),使得每個(gè)人都清楚應(yīng)用中的數(shù)據(jù)流動(dòng). 應(yīng)用開發(fā)人員必須傳達(dá)他們選擇的實(shí)現(xiàn)策略,使得語句調(diào)整的過程中能快速、容易地識別有問題的應(yīng)用模塊和可疑的SQL語句. 數(shù)據(jù)庫管理人員必須仔細(xì)地監(jiān)控系統(tǒng)活動(dòng)并提供它們的資料,使得異常的系統(tǒng)性能可被快速得識別和糾正. 硬件/軟件管理人員必須傳達(dá)系統(tǒng)的硬件、軟件配置并提供它們的資料,使得相關(guān)人員能有效地設(shè)計(jì)和管理系統(tǒng)。 誰來調(diào)整系統(tǒng)與系統(tǒng)涉及的每個(gè)人都在調(diào)整過程中起某些作用,當(dāng)上面提及的那些人員傳達(dá)了系統(tǒng)的特性并提供了它們的資料,調(diào)整就能相對的容易和更快一些。 事實(shí)上的結(jié)果是:數(shù)據(jù)庫管理員對調(diào)整負(fù)有全部或主要的責(zé)任。但是,數(shù)據(jù)庫
53、管理員很少有合適的系統(tǒng)方面的資料,而且,在很多情況下,數(shù)據(jù)庫管理員往往是在實(shí)施階段才介入數(shù)據(jù)庫,這就給調(diào)整工作帶來許多負(fù)面的影響,因?yàn)樵谠O(shè)計(jì)階段的缺陷是不能通過DBA的調(diào)整而得以解決,而設(shè)計(jì)階段的缺陷往往對數(shù)據(jù)庫性能造成極大的影響。 在真正成熟的開發(fā)環(huán)境下,開發(fā)人員作為純代碼編寫人員時(shí),對性能的影響最小,此時(shí)大部分的工作應(yīng)由應(yīng)用設(shè)計(jì)人員完成,而且數(shù)據(jù)庫管理員往往在前期的需求管理階段就介入,為設(shè)計(jì)人員提供必要的技術(shù)支持。 調(diào)整并不是數(shù)據(jù)庫管理員的專利,相反大部分應(yīng)該是設(shè)計(jì)人員和開發(fā)人員的工作,這就需要設(shè)計(jì)人員和開發(fā)人員具體必要的數(shù)據(jù)庫知識,這樣才能組成一個(gè)高效的團(tuán)隊(duì),然而事實(shí)上往往并非如此。 誰
54、來調(diào)整系統(tǒng)與系統(tǒng)涉及的每個(gè)人都在調(diào)整過程中起某些作用,當(dāng)上面提及的那些人員傳達(dá)了系統(tǒng)的特性并提供了它們的資料,調(diào)整就能相對的容易和更快一些。 事實(shí)上的結(jié)果是:數(shù)據(jù)庫管理員對調(diào)整負(fù)有全部或主要的責(zé)任。但是,數(shù)據(jù)庫管理員很少有合適的系統(tǒng)方面的資料,而且,在很多情況下,數(shù)據(jù)庫管理員往往是在實(shí)施階段才介入數(shù)據(jù)庫,這就給調(diào)整工作帶來許多負(fù)面的影響,因?yàn)樵谠O(shè)計(jì)階段的缺陷是不能通過DBA的調(diào)整而得以解決,而設(shè)計(jì)階段的缺陷往往對數(shù)據(jù)庫性能造成極大的影響。 在真正成熟的開發(fā)環(huán)境下,開發(fā)人員作為純代碼編寫人員時(shí),對性能的影響最小,此時(shí)大部分的工作應(yīng)由應(yīng)用設(shè)計(jì)人員完成,而且數(shù)據(jù)庫管理員往往在前期的需求管理階段就介入
55、,為設(shè)計(jì)人員提供必要的技術(shù)支持。 調(diào)整并不是數(shù)據(jù)庫管理員的專利,相反大部分應(yīng)該是設(shè)計(jì)人員和開發(fā)人員的工作,這就需要設(shè)計(jì)人員和開發(fā)人員具體必要的數(shù)據(jù)庫知識,這樣才能組成一個(gè)高效的團(tuán)隊(duì),然而事實(shí)上往往并非如此。 什么時(shí)候調(diào)整系統(tǒng)多數(shù)人認(rèn)為當(dāng)用戶感覺性能差時(shí)才進(jìn)行調(diào)整,這對調(diào)整過程中使用某些最有效的調(diào)整策略來說往往是太遲了。此時(shí),如果你不愿意重新設(shè)計(jì)應(yīng)用的話,你只能通過重新分配內(nèi)存(調(diào)整SGA)和調(diào)整I/O的辦法或多或少地提高性能。Oracle提供了許多特性,這些特性只有應(yīng)用到正確地設(shè)計(jì)的系統(tǒng)中時(shí)才能夠很大地提高性能。 應(yīng)用設(shè)計(jì)人員需要在設(shè)計(jì)階段設(shè)置應(yīng)用的性能期望值。然后在設(shè)計(jì)和開發(fā)期間,應(yīng)用設(shè)計(jì)人
56、員應(yīng)考慮哪些Oracle 特性可以對系統(tǒng)有好處,并使用這些特性。 通過良好的系統(tǒng)設(shè)計(jì),你就可以在應(yīng)用的生命周期中消除性能調(diào)整的代價(jià)和挫折。下圖說明在應(yīng)用的生命周期中調(diào)整的相對代價(jià)和收益,最有效的調(diào)整 時(shí)間是在設(shè)計(jì)階段。在設(shè)計(jì)期間的調(diào)整能以最低的代價(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ì)或維護(hù)系統(tǒng),應(yīng)該建立專門的性能目標(biāo),它使你知道何時(shí)要作調(diào)整。調(diào)整你的系統(tǒng)的最有效方法如下: 當(dāng)設(shè)計(jì)系統(tǒng)時(shí)考慮性能 調(diào)整操作系統(tǒng)的硬件和軟件 識別性能瓶頸 確定問題的原因 采取糾正的動(dòng)作 當(dāng)你設(shè)計(jì)系統(tǒng)時(shí),制定專門的
57、目標(biāo);例如,響應(yīng)時(shí)間小于秒。當(dāng)應(yīng)用不能滿足此目標(biāo)時(shí),識別造成變慢的瓶頸(例如,I/O競爭),確定原因,采取糾正動(dòng)作。在開發(fā)期間,你應(yīng)測試應(yīng)用研究,確定在采取應(yīng)用之前是否滿足設(shè)計(jì)的性能目標(biāo)。 調(diào)整的目標(biāo)調(diào)整通常是一系列開銷。一旦確定了瓶頸,可能要犧牲一些其它方面的指標(biāo)來達(dá)到所要的結(jié)果。例如,如果I/O有問題,你可能需要更多內(nèi)存或磁盤。如果不可能買,你可能要限制系統(tǒng)的并發(fā)性,來獲取所需的性能。如果你已經(jīng)明確地定義了性能的目標(biāo),那用什么來交換高性能的決策就變的很容易的,因?yàn)橐呀?jīng)確定了哪些方面是最重要的,如果我的目標(biāo)為高性能,可能犧牲一些空間資源。 隨著應(yīng)用的越來越龐大,硬件性能的提高,全面的調(diào)整應(yīng)用
58、逐漸變成代價(jià)高昂的行為,在這樣情況下,要取得最大的投入/效率之比,較好的辦法是調(diào)整應(yīng)用的關(guān)鍵部分,使其達(dá)到比較高的性能,這樣從總體上來說,整個(gè)系統(tǒng)的性能也是比較高的。這也就是有名的20/80原則,調(diào)整應(yīng)用的20%(關(guān)鍵部分),能解決80%的問題。 SQL 調(diào)整的目標(biāo)去掉不必要的大型表的全表掃描。緩存小型表的全表掃描。校驗(yàn)優(yōu)化索引的使用。檢驗(yàn)優(yōu)化的連接技術(shù)。以上目標(biāo)任務(wù)將占據(jù)SQL調(diào)整90%以上的工作。在設(shè)計(jì)和開發(fā)時(shí)調(diào)整良好設(shè)計(jì)的系統(tǒng)可防止在應(yīng)用生命周期中產(chǎn)生性能問題。系統(tǒng)設(shè)計(jì)人員和應(yīng)用開發(fā)人員必須了解Oracle的查詢處理機(jī)制以便寫出高效的SQL語句。“有效的應(yīng)用設(shè)計(jì)”討論了你的系統(tǒng)中各種可用
59、的配置,以及每種配置更適合哪種類型的應(yīng)用。“優(yōu)化器”討論了Oracle的查詢優(yōu)化器,以及如何寫語句以獲取最快的結(jié)果。 在設(shè)計(jì)和開發(fā)時(shí)調(diào)整當(dāng)設(shè)計(jì)你的系統(tǒng)時(shí),使用下列優(yōu)化性能的準(zhǔn)則: - 消除客戶機(jī)服務(wù)器應(yīng)用中不必要的網(wǎng)絡(luò)傳輸。使用存儲(chǔ)過程。 - 使用適合你系統(tǒng)的Oracle服務(wù)器選件(例如,并行查詢或分布式數(shù)據(jù)庫)。 - 除非你的應(yīng)用有特殊的需要,否則使用缺省的Oracle鎖。 - 利用數(shù)據(jù)庫記住應(yīng)用模塊,以便能以每個(gè)模塊為基礎(chǔ)來追蹤性能。 - 選擇你的數(shù)據(jù)塊的最佳大小。 - 原則上來說大一些的性能較好。 - 分布你的數(shù)據(jù),使得一個(gè)節(jié)點(diǎn)使用的數(shù)據(jù)本地存貯在該節(jié)點(diǎn)中。 目錄 優(yōu)化基礎(chǔ)知識 性能調(diào)整
60、綜述 有效的應(yīng)用設(shè)計(jì) SQL語句的處理過程 Oracle的優(yōu)化器 Oracle的執(zhí)行計(jì)劃 注意事項(xiàng)有效的應(yīng)用設(shè)計(jì)將最常用的應(yīng)用分為2種類型:聯(lián)機(jī)事務(wù)處理類型(OLTP),決策支持系統(tǒng)(DSS)。 聯(lián)機(jī)事務(wù)處理(OLTP) 該類型的應(yīng)用是高吞吐量,插入、更新、刪除操作比較多的系統(tǒng),這些系統(tǒng)以不斷增長的大容量數(shù)據(jù)為特征,它們提供給成百用戶同時(shí)存取,典型的OLTP系統(tǒng)是訂票系統(tǒng),銀行的業(yè)務(wù)系統(tǒng),訂單系統(tǒng)。OTLP的主要目標(biāo)是可用性、速度、并發(fā)性和可恢復(fù)性。 當(dāng)設(shè)計(jì)這類系統(tǒng)時(shí),必須確保大量的并發(fā)用戶不能干擾系統(tǒng)的性能。還需要避免使用過量的索引與cluster 表,因?yàn)檫@些結(jié)構(gòu)會(huì)使插入和更新操作變慢。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 前臺的辭職報(bào)告模板合集七篇
- 迎新年晚會(huì)意義策劃
- 2023一年級數(shù)學(xué)上冊 八 認(rèn)識鐘表(小明的一天)教學(xué)實(shí)錄 北師大版
- 2024-2025學(xué)年新教材高中化學(xué) 第五章 化工生產(chǎn)中的重要非金屬元素 1.3 硫酸根離子檢驗(yàn)、硫和含硫化合物的相互轉(zhuǎn)化教學(xué)實(shí)錄 新人教版必修2
- 2024秋八年級道德與法治上冊 第一單元 成長的空間 第一課 相親相愛一家人(他們這樣做的原因)教學(xué)思路 人民版
- 2024年某城市地鐵線路建設(shè)及運(yùn)營管理長期租賃合同
- 實(shí)際正常和標(biāo)準(zhǔn)成本法ActualNormalandStandardCosting
- 廣州市來穗人員服務(wù)管理局來穗人員積分制服務(wù)管理信息系統(tǒng)
- 2022天宮課堂第三課觀后感10篇范文
- 2023二年級數(shù)學(xué)下冊 7 萬以內(nèi)數(shù)的認(rèn)識第8課時(shí) 近似數(shù)教學(xué)實(shí)錄 新人教版
- 中級計(jì)量經(jīng)濟(jì)學(xué)知到智慧樹章節(jié)測試課后答案2024年秋浙江工業(yè)大學(xué)
- 2024年保密工作履職報(bào)告
- DL-T5704-2014火力發(fā)電廠熱力設(shè)備及管道保溫防腐施工質(zhì)量驗(yàn)收規(guī)程
- MSOP(測量標(biāo)準(zhǔn)作業(yè)規(guī)范)測量SOP
- (完整版)財(cái)務(wù)管理學(xué)課后習(xí)題答案-人大版
- 食品安全管理體系培訓(xùn)系列教材(共44頁).ppt
- 世界各地的新年習(xí)俗(課堂PPT)
- 生物礦化與仿生材料的研究現(xiàn)狀及展望
- 人教版“課標(biāo)”教材《統(tǒng)計(jì)與概率》教學(xué)內(nèi)容、具體目標(biāo)和要求
- JJF 1827-2020水泥細(xì)度負(fù)壓篩析儀校準(zhǔn)規(guī)范
- 物業(yè)項(xiàng)目月度績效考核表格
評論
0/150
提交評論