OraclePLSQL規(guī)范、性能ppt課件_第1頁
OraclePLSQL規(guī)范、性能ppt課件_第2頁
OraclePLSQL規(guī)范、性能ppt課件_第3頁
OraclePLSQL規(guī)范、性能ppt課件_第4頁
OraclePLSQL規(guī)范、性能ppt課件_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、日程PLSQL性能規(guī)范性能規(guī)范PLSQL 程序規(guī)范程序規(guī)范PLSQL程序規(guī)范概述PLSQL程序規(guī)范的目的:程序規(guī)范的目的:1. 增強(qiáng)程序可讀性。增強(qiáng)程序可讀性。2. 降低程序降低程序BUG概率。概率。3. 程序一致性。程序一致性。4. 增強(qiáng)程序可維護(hù)性。增強(qiáng)程序可維護(hù)性。5. 提升程序性能。提升程序性能。PLSQL程序規(guī)范:命名規(guī)范程序包命名:必須以模塊名開頭例如:客戶化程序用CUX_開頭),用_PKG結(jié)尾 例如:CUX_PAYROLL_PUBLIC_PKG (含義:客戶化的薪資部分公用包)函數(shù)命名:一般用GET_開頭,用來描述通過函數(shù)可以得到一個返回值 例如:GET_EMPLOYEE_SAL

2、ARY(含義:獲取員工薪酬值)3. 過程命名:一般以體現(xiàn)具體用途的英語單詞或者縮寫來命名,沒有其他特殊要求 例如:UPDATE_EMPLOYEE_DEPT_INFO含義:更新員工部門信息)別名:一般別名盡量使用表名的含義縮寫或者用表被_符號分隔的第一字母的拼合作為別名 例如:PS_EMPLOYEE_PAYMENT_HISTORY PEPH PS_EMPLOYEE_PAYMENT_HISTORY PAY_HIS4. 參數(shù)命名:函數(shù)的參數(shù)命名以P_開頭,例如:P_EMPLOYEE_ID NUMBER 過程的參數(shù)命名中,輸入?yún)?shù)以P_開頭,例如:P_EMPLOYEE_ID IN NUMBER 輸出參

3、數(shù)以X_開頭,例如:X_RESULT OUT VARCHAR2 輸入/輸出參數(shù)以P_開頭,例如:P_EMPLOYEE_STATUS 好的命名規(guī)范,可以明顯的增強(qiáng)程序的可讀性和可維護(hù)性。好的命名規(guī)范,可以明顯的增強(qiáng)程序的可讀性和可維護(hù)性。PLSQL程序,無論是程序名稱還是變量名稱,總體遵循簡單明了的基本原則,程序,無論是程序名稱還是變量名稱,總體遵循簡單明了的基本原則,使得程序名或者變量名稱具有相關(guān)的含義。使得程序名或者變量名稱具有相關(guān)的含義。PLSQL程序規(guī)范:命名規(guī)范變量類型變量類型命名規(guī)范命名規(guī)范示例示例全局變量G_開頭G_SBU_ID普通變量V_開頭V_EMPLOYEE_NAME例外變量

4、E_開頭E_UPDATE_VALUE記錄變量REC_開頭REC_PAYROLL_DATA游標(biāo)變量CUR_開頭CUR_EMPLOYEE_PAYMENT數(shù)組變量V_開頭,_ARRAY結(jié)尾V_EMPLOYEE_ARRAY5. 5. 變量命名變量命名: : 不同類型的變量,遵循不同的命名規(guī)則不同類型的變量,遵循不同的命名規(guī)則PLSQL程序規(guī)范:大小寫規(guī)范使用統(tǒng)一標(biāo)準(zhǔn)的大小寫規(guī)范,可以明顯的增強(qiáng)程序的可讀性、以及程序的美觀使用統(tǒng)一標(biāo)準(zhǔn)的大小寫規(guī)范,可以明顯的增強(qiáng)程序的可讀性、以及程序的美觀水平。水平。注:注:1. 使用使用PL/SQL DEVELOPER工具,可以設(shè)置自動大小寫功能工具,可以設(shè)置自動大小

5、寫功能 2. 原則上原則上SQL代碼中保持一致的風(fēng)格就可以,不強(qiáng)求一定大寫,或者一定代碼中保持一致的風(fēng)格就可以,不強(qiáng)求一定大寫,或者一定小寫,盡量不要出現(xiàn)非數(shù)據(jù)庫保留字之外的代碼不統(tǒng)一的情況。小寫,盡量不要出現(xiàn)非數(shù)據(jù)庫保留字之外的代碼不統(tǒng)一的情況。 分類分類大小寫大小寫說明說明程序包名稱大寫過程名稱大寫函數(shù)名稱大寫參數(shù)名稱大寫變量名稱大寫數(shù)據(jù)庫保留字大寫例如: FROM,WHERE表名,條件,以及其他小寫PLSQL程序規(guī)范:代碼對齊規(guī)范使用良好的對齊規(guī)范,可以明顯的增強(qiáng)程序的可讀性、以及程序的美觀使用良好的對齊規(guī)范,可以明顯的增強(qiáng)程序的可讀性、以及程序的美觀水平,同時可以減少程序出錯的概率,增

6、強(qiáng)可維護(hù)性。水平,同時可以減少程序出錯的概率,增強(qiáng)可維護(hù)性。總體來說,對齊要基于程序?qū)哟吻闆r,使用首尾對齊原則,如下例所示:總體來說,對齊要基于程序?qū)哟吻闆r,使用首尾對齊原則,如下例所示:FUNCTION GET_EMPLOYEE_SALARY(P_EMPLOYEE_ID NUMBER, P_MONTH NUMBER) RETURN NUMVER IS V_SALARY NUMBER; CURSOR CUR_EMPLOYEE_PAYROLL_ELEMENT IS SELECT payroll_element_code, base_salary FROM ps_payroll_elements

7、ppe WHERE ppe.EMPLOYEE_id = p_EMPLOYEE_id AND ppe.payment_month = p_month;BEGIN V_SALARY:=0; FOR C1 IN CUR_EMPLOYEE_PAYMENT_ELEMENT LOOP IF C1.base_salary is not null then V_SALARY:=V_SALARY+C1.base_salary; END IF; END LOOP;END; RETURN V_SALARY_AMOUNT;END GET_EMPLOYEE_SALARY;PLSQL程序規(guī)范:注釋信息規(guī)范程序代碼注釋規(guī)范

8、: 2.1 單行代碼禁用,可以用PLSQL屏蔽符:- 2.2 多行,大范圍代碼禁用,必須使用PLSQL大范圍屏蔽符: /*需要屏蔽的內(nèi)容*/程序關(guān)鍵點注釋,程序的一些關(guān)鍵點的注釋可以很清晰的分出程序的結(jié)構(gòu),增強(qiáng)程序的邏輯性和可讀性。 例如: IF V_RESULT = S THEN -如果運行成功,那么. . ELSIF V_RESULT = E THEN -如果運行失敗,那么. . ELSIF V_RESULT = W THEN -如果運行警告,那么. . END IF;注釋信息可以很好的描述程序的功能,為后續(xù)的維護(hù)帶來非常有價值的基礎(chǔ)注釋信息可以很好的描述程序的功能,為后續(xù)的維護(hù)帶來非常有

9、價值的基礎(chǔ)信息,原則要求程序包各個部分都必須有相應(yīng)的注釋信息信息,原則要求程序包各個部分都必須有相應(yīng)的注釋信息PLSQL程序規(guī)范:數(shù)據(jù)庫對象創(chuàng)建規(guī)范程序開發(fā)中,不可避免的會遇到創(chuàng)建客戶化的數(shù)據(jù)庫對象,為更好的管理數(shù)據(jù)程序開發(fā)中,不可避免的會遇到創(chuàng)建客戶化的數(shù)據(jù)庫對象,為更好的管理數(shù)據(jù)庫對象,需要遵循數(shù)據(jù)庫對象創(chuàng)建規(guī)范:庫對象,需要遵循數(shù)據(jù)庫對象創(chuàng)建規(guī)范:數(shù)據(jù)庫對象包括:Table,Index,View,Package,Procedure,Function,Trigger,Job2. 盡可能少的創(chuàng)建數(shù)據(jù)庫對象。除非程序必須使用或可以提升程序性能的情況,一般都不要去創(chuàng)建數(shù)據(jù)庫對象。數(shù)據(jù)庫對象數(shù)據(jù)庫

10、對象如果需要占用存儲空間的Table,Index,物化視圖),都必須創(chuàng)建到規(guī)定的表空間中。不能隨意存放。所有數(shù)據(jù)庫對象的創(chuàng)建/變卦,都需要有明確的文件記錄。所有應(yīng)用系統(tǒng)自創(chuàng)建的標(biāo)準(zhǔn)的數(shù)據(jù)庫對象,都盡可能的不去做變動,以免影響性能或者導(dǎo)致未知問題。6. 數(shù)據(jù)庫對象的命名要規(guī)范。PLSQL程序規(guī)范:程序管理規(guī)范客戶化開發(fā)的客戶化開發(fā)的PLSQLPLSQL程序,需要規(guī)范的管理,以更好的維護(hù)數(shù)據(jù)庫以及程序程序,需要規(guī)范的管理,以更好的維護(hù)數(shù)據(jù)庫以及程序1 . 客戶化程序需要有文件記錄 客戶化procedure,function必須放在程序包中,不要單獨存在數(shù)據(jù)庫中 客戶化的公用的procedure,f

11、unction盡量放在公用程序包中,不要建太多 的程序包。 不能隨意創(chuàng)建客戶化的PLSQL程序,能少創(chuàng)建就盡量少創(chuàng)建。5. 定期檢查客戶化程序包的狀態(tài),保持程序包都是正常的可用狀態(tài)。日程PLSQL性能規(guī)范性能規(guī)范PLSQL 程序規(guī)范程序規(guī)范PLSQL性能規(guī)范 -性能影響分析Oracle數(shù)據(jù)庫的性能與數(shù)據(jù)庫的性能與PLSQL代碼的性能有非常直接的關(guān)系。在大量的客戶代碼的性能有非常直接的關(guān)系。在大量的客戶化程序中,不可避免的會存在客戶化代碼的性能問題?;绦蛑?,不可避免的會存在客戶化代碼的性能問題。PLSQL代碼的性能影代碼的性能影響表現(xiàn)在如下幾個方面:響表現(xiàn)在如下幾個方面:程序本身運行效率低下,

12、由于本身的程序性能問題,導(dǎo)致運行時間長。程序運行導(dǎo)致的數(shù)據(jù)庫讀寫I/O巨大,直接導(dǎo)致數(shù)據(jù)庫的性能下降。程序長時間運行,占有大片內(nèi)存不釋放,導(dǎo)致其他程序運行性能下降。程序長時間運行,占有特點表或者特點數(shù)據(jù)的控制權(quán),導(dǎo)致其他程序無法有效獲得數(shù)據(jù)控制權(quán),而使得其他程序長時間處于等待狀態(tài)。程序本身性能差,長時間運行導(dǎo)致回滾段過舊錯誤。6. 程序大量排序操作,且長時間運行不釋放資源,導(dǎo)致臨時表空間無法正常釋放空間給其他程序進(jìn)行排序,進(jìn)而導(dǎo)致臨時表空間大量增長。PLSQL性能規(guī)范 -性能規(guī)范概述PLSQL代碼性能的好壞,與下列因素有著直接關(guān)系代碼性能的好壞,與下列因素有著直接關(guān)系SQL程序開發(fā)的理念 程序

13、開發(fā)過程中,始終要保持一個良好的程序員態(tài)度,堅持用做到最好,最完美的態(tài)度來完成程序的開發(fā)。在每一段SQL定性之前,都要對性能進(jìn)行分析,優(yōu)化。讓程序達(dá)到一個最佳性能狀態(tài)。2. SQL程序的結(jié)構(gòu)設(shè)計 在程序開發(fā)之前,一定要先做好程序結(jié)構(gòu)的設(shè)計,不要盲目的進(jìn)行開發(fā),從而導(dǎo)致代碼臃腫不合理的情況發(fā)生。 在經(jīng)過程序結(jié)構(gòu)設(shè)計之后,程序開發(fā)就會有很清晰明確的設(shè)計藍(lán)圖,在最佳的路徑里完成的代碼一般都能有比較好的性能基礎(chǔ)。3. SQL代碼語句的規(guī)范 程序開發(fā)過程中,養(yǎng)成一個良好的性能關(guān)注習(xí)慣,每一個SQL語句都多考慮性能情況。經(jīng)過長期的習(xí)慣養(yǎng)成之后,寫出的SQL代碼自然而然的就是一個性能比較好的結(jié)果。 PLSQ

14、L性能規(guī)范 -開發(fā)理念程序組成部分以及所占比例:程序組成部分以及所占比例:組成部分組成部分所占比所占比例例解釋解釋正確結(jié)果40%結(jié)果正確是前提良好的性能(當(dāng)前以及可預(yù)計的未來時間段)30%性能控制程序的生命期良好的程序規(guī)范20%程序的維護(hù)性,可讀性良好的程序結(jié)構(gòu)10%程序可升級性PLSQL性能規(guī)范 -程序結(jié)構(gòu)良好的程序結(jié)構(gòu),可以是程序有一個好的性能基礎(chǔ),另外也能讓后續(xù)的變更良好的程序結(jié)構(gòu),可以是程序有一個好的性能基礎(chǔ),另外也能讓后續(xù)的變更更加靈活。基本的結(jié)構(gòu)概念如下:更加靈活?;镜慕Y(jié)構(gòu)概念如下:小步快跑原則。 盡量不要使用一個單一的超級大超級復(fù)雜的SQL代碼去實現(xiàn)復(fù)雜的功能。結(jié)構(gòu)簡單清晰。

15、盡量是程序的結(jié)構(gòu)看起來易懂,明晰,簡單。不要設(shè)計只有自己能看懂的程序。 變量定義不要過多,不要太多重復(fù),盡量使用可以重用的變量(綁定變量可以提高性能)。程序結(jié)構(gòu)嚴(yán)謹(jǐn),過程有輸入?yún)?shù)就需要有輸出參數(shù)返回狀態(tài),有正確完善的異常處理機(jī)制。增加程序的重用性,對于使用次數(shù)多的Procedure, Function,盡量做到能夠共享,且有好的運行性能。對于大批量數(shù)據(jù)處理的程序,良好的COMMIT/ROLLBACK機(jī)制。對于取出的大批量數(shù)據(jù),盡量保存在內(nèi)存中,不要多次重復(fù)讀取大批量數(shù)據(jù)。適當(dāng)使用臨時表作為數(shù)據(jù)中轉(zhuǎn)池。PLSQL性能規(guī)范 -代碼語句規(guī)范良好的代碼語句規(guī)范,可以盡可能的減少對數(shù)據(jù)表的全表掃描,盡

16、可能好的良好的代碼語句規(guī)范,可以盡可能的減少對數(shù)據(jù)表的全表掃描,盡可能好的使用索引,從而使用最優(yōu)的執(zhí)行計劃。使用索引,從而使用最優(yōu)的執(zhí)行計劃。執(zhí)行計劃的好壞直接影響執(zhí)行計劃的好壞直接影響SQL的執(zhí)行性能。的執(zhí)行性能。 在不同的數(shù)據(jù)庫優(yōu)化器情況下,SQL優(yōu)化的方法有很多不同的地方。在Oracle數(shù)據(jù)庫10g之前的版本中7-9i) 主要使用RBO優(yōu)化器基于規(guī)則的優(yōu)化器)。在Oracle數(shù)據(jù)庫10g之后的版本,Oracle數(shù)據(jù)庫基本放棄RBO優(yōu)化器,而全面使用CBO優(yōu)化器基于成本的優(yōu)化器)。 CBO優(yōu)化器的推廣及使用,使得程序員的代碼水平對程序性能的影響降到最低水平,數(shù)據(jù)庫本身基于成本的優(yōu)化器機(jī)制,

17、會自動判斷訪問的數(shù)據(jù)表的訪問成本,從而得出Oracle數(shù)據(jù)庫本身認(rèn)為最優(yōu)的執(zhí)行計劃。 目前10g之后版本的數(shù)據(jù)庫已經(jīng)成為主流數(shù)據(jù)庫平臺,9i以及之前版本的數(shù)據(jù)庫用戶已經(jīng)很少或者已經(jīng)升級到了10g和之后版本。因此后續(xù)我們所講的SQL性能優(yōu)化方面的技巧都是基于CBO優(yōu)化器。而基于RBO的優(yōu)化器的優(yōu)化技巧不做講述。 RBO : Rule-Based Optimizer CBO : Cost-Based OptimizerPLSQL性能規(guī)范 -代碼語句規(guī)范 子查詢在在SQL中經(jīng)常會有機(jī)會使用子查詢的方式來得到某一個值,例如匯總值。而中經(jīng)常會有機(jī)會使用子查詢的方式來得到某一個值,例如匯總值。而在在HCM

18、系統(tǒng)中,會非常多的用到系統(tǒng)中,會非常多的用到max(*_date)這樣的方式來獲取一個有效的這樣的方式來獲取一個有效的日期。日期。盡可能的不使用子查詢的機(jī)制。如果必須使用子查詢,也盡可能不要在子查詢中嵌套更多層次的子查詢。如果可以替代,盡量使用Function的計算來得到想要的返回值(通過變量的使用而 使得SQL的重用性增強(qiáng),不需要再次解析從而提升性能)。PLSQL性能規(guī)范 -代碼語句規(guī)范 建立索引規(guī)范索引出現(xiàn)的目的就是要提升性能,而索引出現(xiàn)的目的就是要提升性能,而SQL性能提升的最快最有效的途徑就是性能提升的最快最有效的途徑就是經(jīng)可能的使用索引。下面給出了數(shù)據(jù)庫表適合建立經(jīng)可能的使用索引。下

19、面給出了數(shù)據(jù)庫表適合建立Index的字段的規(guī)范:的字段的規(guī)范:Index應(yīng)該建立在可以細(xì)分?jǐn)?shù)據(jù)的字段Index應(yīng)該多建立在 Number(ID), Date,以及具有較少字符長度的char類型字段上(例如類型)Index盡量避免建立在存在大量漢字的字段上Index盡量避免建立在存在許多空值的字段上Index創(chuàng)建需要綜合考慮,不要輕易在標(biāo)準(zhǔn)的表或者不了解的表上面建立自己的indexIndex的創(chuàng)建要有一個統(tǒng)一的管理機(jī)制,嚴(yán)格避免Index多而雜的為不同程序一次性使用PLSQL性能規(guī)范 -代碼語句規(guī)范 使用索引規(guī)范對于已經(jīng)存在對于已經(jīng)存在Index的表,如果程序語句寫法不對,會使得可以使用的的表,

20、如果程序語句寫法不對,會使得可以使用的Index無法使用,具體如下:無法使用,具體如下:在Where條件中不要對Index字段進(jìn)行類型轉(zhuǎn)換處理,例如:to_char(employee_number)=12345,這樣的寫法會讓Index無效。如果一定需要做轉(zhuǎn)換,應(yīng)該轉(zhuǎn)換為:employee_number = to_number(12345) 類似的轉(zhuǎn)換還有:to_number, to_date, trunc在Where條件中,不要對Index字段進(jìn)行數(shù)據(jù)附加操作,例如: where action_date +1 = to_date(2021-01-01,yyyy-mm-dd) 而應(yīng)該修改為:w

21、here action_date = to_date(2021-01-01,yyyy-mm-dd)-1在where條件中,不要對Index字段進(jìn)行!=操作不等于操作),因為Index只記錄了有什么,而沒有記錄沒有什么,例如: where salary_amount !=0 應(yīng)該修改為: where salary_amount0在where條件中,不要對兩個index字段做拼合操作,例如: where employee_id|employee_no = 123|C001 應(yīng)該修改為:where employee_id = 123 and employee_no = C001PLSQL性能規(guī)范 -

22、代碼語句規(guī)范 使用索引規(guī)范如果出現(xiàn)如果出現(xiàn)SQL會使用到多個會使用到多個INDEX,而被選擇的,而被選擇的INDEX不是最優(yōu)選擇的時候,不是最優(yōu)選擇的時候,可以使用強(qiáng)制禁用不需要的可以使用強(qiáng)制禁用不需要的INDEX的辦法來迫使系統(tǒng)選擇你希望的的辦法來迫使系統(tǒng)選擇你希望的INDEX例如:例如: Select * from ps_employee pe where pe.action_date sysdate -365 and pe.dept_id = 111; 如果發(fā)現(xiàn)使用action_date這個index的性能沒有dept_id這個index好,那么可以修改成 select * from p

23、s_employee pe where pe.action_date +1 sysdate 366 and pe.dept_id = 111 通過強(qiáng)制屏蔽action_date這個index被使用,就可以迫使系統(tǒng)選擇dept_id作為index來運作。PLSQL性能規(guī)范 -代碼語句規(guī)范 in/not in exists/not exists使用規(guī)范在在SQL中,會用的中,會用的IN/NOT IN的操作,用來判斷相關(guān)數(shù)據(jù)是否存在于其他的操作,用來判斷相關(guān)數(shù)據(jù)是否存在于其他表中,需要遵循規(guī)則如下:表中,需要遵循規(guī)則如下:除了where employee_name in(abc,cde)這樣的指明的

24、常量或者傳入?yún)?shù)的變量以為,都不能使用in的操作,而應(yīng)該使用exists來代替in。例如: where employee_id in (seleet employee_id from ps_payment_history pph where pph.employee_id = emp.employee_id and pph.payment_month = 200912); 應(yīng)該修改為: where exists(selct pph.employee_id from ps_payment_history pph where pph.employee_id = emp.employee_id an

25、d pph.payment_month = 200912);2. 同樣的原理,使用not exists代替not in的操作PLSQL性能規(guī)范 -代碼語句規(guī)范 Group by使用規(guī)范在在SQL中,會用的中,會用的GROUP BY的操作,用來取得匯總的數(shù)據(jù),的操作,用來取得匯總的數(shù)據(jù),GROUP BY操作會產(chǎn)生數(shù)據(jù)庫的排序操作,而排序的數(shù)據(jù)量的大小也直接影響了運行的操作會產(chǎn)生數(shù)據(jù)庫的排序操作,而排序的數(shù)據(jù)量的大小也直接影響了運行的性能。性能。GROUP BY需要遵循如下規(guī)范:需要遵循如下規(guī)范:盡量少的使用GROUP BY操作如果有函數(shù)可以替代的話)。盡量少的使用GROUP BY的字段。在GRO

26、UP BY之前的where條件中,盡可能的先縮小數(shù)據(jù)范圍。盡可能的使用索引字段作為GROUP BY 字段。PLSQL性能規(guī)范 -代碼語句規(guī)范 distinct使用規(guī)范在在SQL中,會用的中,會用的distinct的操作,用來取得不重復(fù)的數(shù)據(jù),的操作,用來取得不重復(fù)的數(shù)據(jù),distinct操作會產(chǎn)生數(shù)據(jù)庫的排序操作,排序操作會影響操作會產(chǎn)生數(shù)據(jù)庫的排序操作,排序操作會影響SQL性能。性能。Distinct操作操作的使用規(guī)范如下:的使用規(guī)范如下:盡可能少的使用distinct操作。盡量通過程序的條件本身來排除相同數(shù)據(jù)的出現(xiàn)。在SQL中可以使用exists來代替where/and條件,從而排除重復(fù)數(shù)

27、據(jù)的出現(xiàn)。PLSQL性能規(guī)范 -代碼語句規(guī)范 減少都表的訪問次數(shù)在在SQL中,對表的訪問次數(shù)越多,帶來的性能成本越高,產(chǎn)生的磁盤中,對表的訪問次數(shù)越多,帶來的性能成本越高,產(chǎn)生的磁盤IO越大越大如下例:如下例:低效: UPDATE EMP SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES), SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES) WHERE EMP_DEPT = 0020;高效: UPDATE EMP SET (EMP_CAT, SAL_RANGE) = (S

28、ELECT MAX(CATEGORY) , MAX(SAL_RANGE) FROM EMP_CATEGORIES) WHERE EMP_DEPT = 0020;PLSQL性能規(guī)范 -代碼語句規(guī)范 *使用規(guī)范在在SQL中,有些程序員喜歡用中,有些程序員喜歡用select * ,count(*)這樣的操作,實際上這樣的這樣的操作,實際上這樣的操作要浪費很多性能,帶來不必要的磁盤操作要浪費很多性能,帶來不必要的磁盤I/O,相關(guān)規(guī)則如下:,相關(guān)規(guī)則如下:堅決杜絕使用select/count * from table 的操作。用select/count index字段 from table 的操作PLS

29、QL性能規(guī)范 -代碼語句規(guī)范 ROWID在數(shù)據(jù)庫中,每一個表的每一行記錄都有一個整個數(shù)據(jù)庫都唯一的在數(shù)據(jù)庫中,每一個表的每一行記錄都有一個整個數(shù)據(jù)庫都唯一的ROWID值,值,而且這個而且這個ROWID值正常是不會發(fā)生變化除非表重建后導(dǎo)入原有數(shù)據(jù)),而值正常是不會發(fā)生變化除非表重建后導(dǎo)入原有數(shù)據(jù)),而Index也都是會對應(yīng)到這個也都是會對應(yīng)到這個ROWID,因此在可以的情況下,盡量使用,因此在可以的情況下,盡量使用ROWID來直接定位到記錄進(jìn)行操作,例如:來直接定位到記錄進(jìn)行操作,例如:Cursor cur_employee is select rowid from ps_employee em

30、p where emp.status = INVALID;Begin for c1 in cur_employee loop update ps_employee pe set pe.active_flag = N where pe.rowid = c1.rowid; end loop; commit;End;PLSQL性能規(guī)范 -代碼語句規(guī)范 Having的使用規(guī)范在在SQL中,會需要使用中,會需要使用having來做是否判斷,但應(yīng)該避免使用來做是否判斷,但應(yīng)該避免使用HAVING子句子句, HAVING 只會在檢索出所有記錄之后才對結(jié)果集進(jìn)行過濾只會在檢索出所有記錄之后才對結(jié)果集進(jìn)行過濾. 這個處理需要排序這個處理需要排序,總計等操作總計等操作. 如果能通過如果能通過WHERE子句限制記錄的數(shù)目子句限制記錄的數(shù)目,那就能減少這方面的開那就能減少這方面的開銷相關(guān)規(guī)則如下:銷相關(guān)規(guī)則如下:Having的語句只應(yīng)用在需要判斷count匯總的值是否滿足條件。不能用來代替where條件作為判斷,例如:低效: SELECT REGION,AVG(LOG_SIZE) FROM LOCATION GROUP BY REGION HAVING REGION REGION != SYDNEY AND REGION != PERTH高效 SELECT REGION,AVG(LOG_SIZE) F

溫馨提示

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

評論

0/150

提交評論