在PL/SQL中使用陣列處理是一個很好的做法(如,使用bulk collect和forall)。批次處理能夠大大減少PL/SQL語句執行引擎的環境切換次數,從而提高其效能。
另一個優秀示例是把儲存過程中的所有程式碼放入鎖定的軟體包中,這樣可以生成模組單元。
把儲存過程放入軟體包裡可以實現相關程式和功能的分組。當單個包被使用,整個軟體包都會載入記憶體中(記憶體會啟動整個軟體包?),把磁碟存取時間減到最少。透過這個方法我們同樣可以把整個應用程式包載進記憶體中,防止發生重新載入和程式碼解析,從而減少嚴重影響效能的程式碼遞迴。
PL/SQL(和SQL)的另一個優秀示例是使用適當的變數型別(當你需要NUMBER時不要使用VARCHAR2,反之亦然)。使用不適當的變數(用character跟number進行比較)會導致無用索引。保證變數型別正確的一種方法就是使用%TYPE 和%ROWTYPE。
還有就是永遠使用DBMS_PROFILER或使用像Quest Software的Quest Code Tester工具來驗證迴圈邏輯。DBMS_PROFILER是Oracle提供的一個軟體包,能夠使你的程式碼生成對每行執行時間及所需時間的追蹤。
你可以驗證迴圈執行次數應為最少。
你同樣應該驗證適當的IF-THEN-ELSE結構。我的意思是你應該把最常用的選項放在前面(比如exit test)。這個方法同樣使用於CASE結構。
PL/SQL(以及Java、C、C++和其他所有Oracle相關的3GLs)中,另一個更為重要的優秀示例是首先調優SQL。
即使是世界上設計最精密的程式,如果其中含有的SQL很差的話,執行起來效能也會不好。Quest的SQL Optimizer、Performance Analyzer、TOAD和SQL Navigator都能夠最佳化SQL。
在測試PL/SQL-SQL程式碼的時候,應利用匿名PL/SQL塊來保證處理環境的相似性。
如果你在一個標準的SQL環境裡用文字代替繫結變數來進行測試,你所得到的執行計劃會不同於當你使用匿名PL/SQL塊和繫結變數時得到的執行計劃,因此你的調整很可能不能獲得很好的結果。使用Quest Code Tester能夠保證你能獲得你想要的結果。
還有一個良好的程式設計做法是很好地利用臨時表和PL/SQL索引表。不正確地使用”normal”表進行臨時儲存會降低效能,因此應使用臨時表。而當記憶體空間足夠執行PL/SQL表時使用臨時表也會大大降低效能。你也可以利用檢視來建立中間結果的快取表。
還有一個很簡單易行的優秀示例是在IN OUT和OUT變數上利用NOCOPY。在一個使用IN OUT或OUT的PL/SQL程式中,如果NOCOPY關鍵字沒有包含在其頁首的變數宣告中,所有的變數都會透過copyout程式傳值(傳值而非傳引用)。
而使用NONCOPY,所有透過引用傳值,這樣做會大大提高執行效能。
最後,還要求所有SQL開發者生成解釋執行計劃,然後再經由同行評審。在較大的開發計劃裡,資料庫管理員不可能檢查所有的程式碼看是否獲得最佳的效能,因此開發者首先對SQL程式碼效能進行調優是很必要的。
只要開發者把SQL的索引功能調優,調整為正確的邏輯和技術,資料庫管理員便能夠對難以處理的問題程式碼進行更高階的調優。
在PL/SQL中使用陣列處理是一個很好的做法(如,使用bulk collect和forall)。批次處理能夠大大減少PL/SQL語句執行引擎的環境切換次數,從而提高其效能。
另一個優秀示例是把儲存過程中的所有程式碼放入鎖定的軟體包中,這樣可以生成模組單元。
把儲存過程放入軟體包裡可以實現相關程式和功能的分組。當單個包被使用,整個軟體包都會載入記憶體中(記憶體會啟動整個軟體包?),把磁碟存取時間減到最少。透過這個方法我們同樣可以把整個應用程式包載進記憶體中,防止發生重新載入和程式碼解析,從而減少嚴重影響效能的程式碼遞迴。
PL/SQL(和SQL)的另一個優秀示例是使用適當的變數型別(當你需要NUMBER時不要使用VARCHAR2,反之亦然)。使用不適當的變數(用character跟number進行比較)會導致無用索引。保證變數型別正確的一種方法就是使用%TYPE 和%ROWTYPE。
還有就是永遠使用DBMS_PROFILER或使用像Quest Software的Quest Code Tester工具來驗證迴圈邏輯。DBMS_PROFILER是Oracle提供的一個軟體包,能夠使你的程式碼生成對每行執行時間及所需時間的追蹤。
你可以驗證迴圈執行次數應為最少。
你同樣應該驗證適當的IF-THEN-ELSE結構。我的意思是你應該把最常用的選項放在前面(比如exit test)。這個方法同樣使用於CASE結構。
PL/SQL(以及Java、C、C++和其他所有Oracle相關的3GLs)中,另一個更為重要的優秀示例是首先調優SQL。
即使是世界上設計最精密的程式,如果其中含有的SQL很差的話,執行起來效能也會不好。Quest的SQL Optimizer、Performance Analyzer、TOAD和SQL Navigator都能夠最佳化SQL。
在測試PL/SQL-SQL程式碼的時候,應利用匿名PL/SQL塊來保證處理環境的相似性。
如果你在一個標準的SQL環境裡用文字代替繫結變數來進行測試,你所得到的執行計劃會不同於當你使用匿名PL/SQL塊和繫結變數時得到的執行計劃,因此你的調整很可能不能獲得很好的結果。使用Quest Code Tester能夠保證你能獲得你想要的結果。
還有一個良好的程式設計做法是很好地利用臨時表和PL/SQL索引表。不正確地使用”normal”表進行臨時儲存會降低效能,因此應使用臨時表。而當記憶體空間足夠執行PL/SQL表時使用臨時表也會大大降低效能。你也可以利用檢視來建立中間結果的快取表。
還有一個很簡單易行的優秀示例是在IN OUT和OUT變數上利用NOCOPY。在一個使用IN OUT或OUT的PL/SQL程式中,如果NOCOPY關鍵字沒有包含在其頁首的變數宣告中,所有的變數都會透過copyout程式傳值(傳值而非傳引用)。
而使用NONCOPY,所有透過引用傳值,這樣做會大大提高執行效能。
最後,還要求所有SQL開發者生成解釋執行計劃,然後再經由同行評審。在較大的開發計劃裡,資料庫管理員不可能檢查所有的程式碼看是否獲得最佳的效能,因此開發者首先對SQL程式碼效能進行調優是很必要的。
只要開發者把SQL的索引功能調優,調整為正確的邏輯和技術,資料庫管理員便能夠對難以處理的問題程式碼進行更高階的調優。