熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle8 PL/SQL編程風格與系統性能的提高

2013-11-13 15:48:06  來源: Oracle 

  Oracle是C/S(Client/Server)結構的大型數據庫主要語言是GLSQL語言具有功能強大而簡單易學的優點C/S結構的工作過程是當客戶端(C端)輸入並發送一條SQL語句後便通過網絡送到服務器端(S端)在那裡被分析執行然後再將結果通過網絡返回到客戶端此時客戶端可以再發下一條SQL語句可見客戶端是一條語句一條語句的發送服務器端是一條一條的分析執行結果再一次次的返回但是這樣單個的SQL語句引起了頻繁的網絡通信大大降低了系統性能PL/SQL是擴展SQL後的語言PL/SQL塊作為一個單位發送使用了較少的網絡通信而且在運行中能根據條件決定執行或重復執行什麼語句既保留了SQL的強大性又彌補了不足
  
   提高程序的運行速度
  
   使用存儲過程
    存儲過程是Oracle數據庫的一種對象是一種帶名的PL/SQL過程程序塊它在創建後被數據庫服務器進行語法和句法分析以編譯了的形式存儲在數據庫中可以被有權用戶在任何需要的地方調用當客戶端應用程序調用時只需發送一條調用命令數據庫服務器就會執行該過程與一般的PL/SQL塊主要的不同是無需在網上傳送大量的源程序代碼只傳送一條調用命令這就大大降低了網絡通信的負擔而且只在剛創建時分析編譯一次每次調用直接執行編譯了的代碼因此運行速度較快
    在實際開發時對於具有共同特性的功能模塊最好使用存儲過程調用時通過使用不同的實際參數值來實現某一具體的處理如果能充分利用存儲過程來完成應用系統的操作與處理則可大大提高系統的運行性能
   編寫可重用共享池中已有語句的SQL語句
    共享內存緩沖區和後台進程合稱為一個Oracle實例當啟動一個Oracle實例時會有許多的Oracle後台進程被啟動每個進程都負責運行數據庫的不同方面的處理各進程通過共享內存彼此之間進行通信該塊內存就是系統全局區SGASGA被分隔為不同的區域其中一個稱作共享池(Shared Pool)的區域中包含了發送給數據庫的SQL語句的正文和PL/SQL塊以及它們經過分析後的表示形式與執行方案其中執行方案是數據庫實際處理該語句的方法例如需要訪問哪些表和索引是否需要執行排序操作等等
    因為要執行一條SQL 語句數據庫就必須確定其執行方案當數據庫從客戶應用程序接收到一條SQL語句時它首先檢查是否該語句在共享池中若在那麼不重新對其分析而是重復使用已經在共享池中的形式及執行方案若不在則對該語句進行分析得到新的分析形式與執行方案並進行存儲覆蓋共享池中以前的內容
    由此可以看出編寫可重用共享池中語句的SQL語句就顯得十分必要因為避免不必要的重新分析會很大程度上減小服務器所承擔的工作量要想重復使用共享池中的語句就應該編寫與其格式一致的語句包括字母的大小寫標點符號換行的位置等都要一致下面推薦一種有效實用的方法
   SQL語句各部分的格式
    一條語句可以一行也可以分多行書寫但最好換行書寫每一子句一行且每行的第一個關鍵字與第一行的關鍵字的尾部對齊這樣做以確保每次使用同一條語句時分行的位置一致而不要讓語句在第列偶然溢出到下一行例如下面的格式中字母TMEDP是對齊的一子句占了一行
    SELECT colcol
    FROM table—name
    WHERE col > col
    AND col > col
    GROUP BY col;
    當剛執行過上述語句後若又接收到下面的語句
    SELECT colcol
    FROM table—name
    WHERE col > col
    AND col > col
    GROUP BY col;
    則通過檢查認為與共享池中的語句一致可重復使用共享池中的執行方案不必重新分析
    而下面的的語句被認為是不同的因為分行的位置不同需要重新進行分析
    SELECT colcol FROM table—name
    WHERE col > col
    AND col > col
    GROUP BY col ;
   字母大小寫采用一致約定
    關鍵字保留字大寫用戶聲明的標識符小寫請看下面的兩條語句
    SELECT xm
    FROM student
    與
    select xm
    FROM student
    比較的結果是這兩句不匹配或者說不等價因為第一句中的SELECT是大寫的而第二句的是小寫的
   其它如運算符兩側各留一個空格等
    總之設計自己的編寫約定並遵守這些約定使要處理的語句與共享池中的相一致有助於運行性能的提高
  
   提高可維護性
  
   編寫觸發器
    對表中數據進行修改刪除或插入是非常常見的操作當表被修改時應該自動給其他需要執行操作的程序發信號觸發器可以完成這一功能在Oracle觸發器是一段程序但是這段程序是當發生INSERTUPDATE或DELETE操作時被自動執行的與過程的調用(是通過調用語句調用執行)不同因此當某事件的發生引起連環更新或其他的相應操作時通過自動執行觸發器代碼實現而不用人工干預大大減輕了維護工作同時也很好的保證了數據的一致性
    觸發器的優點是自動激發不管什麼引起數據修改(來自程序的或是來自用戶的)它們都工作所以常常用於不同數據表中的相關數據的串接修改采用這種方法實現數據表間接的數據關聯可由數據庫集中維護控制規則變化時只需修改相應的觸發器即可這樣系統易於維護提高了工作效率
   使用%TYPE%ROWTYPE方式聲明變量
    程序設計中常常要通過變量來實現程序間的數據傳遞即將表中數據賦值給變量或是把變量值插入到表中而要完成這些操作的前提就是表中數據與變量類型要一致然而在實際中表中數據或類型或寬度有時要變化一旦變化就必須去修改程序中的變量聲明部分否則程序將不能正常運行為了減少這部分程序的修改編程時使用%TYPE%ROWTYPE方式聲明變量使變量聲明的類型與表中的保持同步隨表的變化而變化這樣的程序在一定程度上具有更強的通用性
  
   提高程序自檢能力
  
    一個好的應用系統不僅要有好的用戶界面齊全的功能處理模塊而且要有很強的錯誤處理能力因此要求編程人員要預測可能的各種情況(聲明異常情態並引發)並盡可能從錯誤中恢復過來(編寫相應異常情態處理器代碼)這就是Oracle中的異常部分的程序設計內容然而這部分的設計絕非易事在異常部分的最後設置OTHERS異常情態處理器是個很好的編程習慣因為它為運行時刻捕捉到的其它錯誤指明了處理去向從而保證了程序的正常運行格式如下
    BEGIN
    …
    EXCEPTION
     WHEN excep—name THEN
     …
     WHEN excep—name THEN
     …
     WHEN OTHERS THEN
     …
    END;
    但是對程序中出現的錯誤要做到正確的處理(即正確選擇異常處理器並執行它)還必須弄清楚異常情態的傳播問題
    異常情態的傳播指的是當在程序塊的聲明執行異常部分分別出現異常情態時或在本塊中沒有相應的異常處理器時會將這個異常情態傳播到哪裡會去激發那個塊中的處理器傳播規則是這樣的
    當一個異常情態是在塊的執行部分引發的(最常見的)PL/SQL使用下面的規則確定激活哪個異常處理器)若當前塊對該異常情態設置了處理器則執行它並成功完成該塊的執行然後控制轉給包含塊)若當前塊沒有該處理器則通過在包含塊中引發它來傳播異常情態然後對包含塊執行步驟另外無論是在聲明部分引發了一個異常情態還是在異常處理部分引發則該異常情態將立即傳播給包含塊在包含塊引用上述規則進行異常情態的處理即使在當前塊設置了OTHERS處理器也不會被執行
  
   易於閱讀
  
    對於子程序觸發器包等帶名的程序塊使用結束標識例如
    CREATE OR REPLACE PROCEDURE addstud IS
    …
    BEGIN
    …
    END addstud;   /* 此處的過程名add是可選的寫上較好與塊開始的CREATE相對應 */
    采用統一的標識符命名規則對於諸如變量名子程序名觸發器名等數據庫對象命名時應盡量能表示其功能用途或含義
    對於過程性語句與程序塊采用縮進書寫風格會使得程序結構清晰層次分明易閱讀
    采用統一的字母大小寫盡管PL/SQL程序中不區分大小寫但是采用統一的字母大小寫(如前文敘述的大小寫約定)將在很大程度上提高程序的可閱讀性
    加注釋
    一條語句分多行書寫不讓其自動分行
    這方面的內容大家都已很熟悉不再詳述了
    總之良好的程序設計風格可以在多個方面提高系統的性能提高開發效率很值得我們在工作中給以重視

From:http://tw.wingwit.com/Article/program/Oracle/201311/17317.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.