oracle效能調整(2)

jss001發表於2009-02-16

2 調整 Client/Server 模式下的網路 I/O
  Client/Server
環境中的應用處理是分佈在客戶應用程式和資料庫服務程式之間的。在 Client/Server環境中Client與Server之間的網路I/O是整個系統效能提高的瓶頸,一個客戶應用程式引起的網路I/O越少,應用及整個系統的效能越好。減少網路I/O的最重要的一條原則:將應用邏輯集中在資料庫伺服器中。2.1 當為應用建表時,應當為一些有特殊要求的資料加上適當的完整性約束,這樣就能實現由資料庫本身而不是應用程式來約束資料符合一定的條件。資料庫伺服器端的完整約束的執行操作是在比 使用Oracle資料庫的完整約束性
  
SQL語句級別更低的系統機制上最佳化,它與客戶端無關,只在伺服器中執行,不需在Client 端和Server端之間傳遞SQL語句,有效地減輕網路I/O負擔。2.2 完 整約束性只能實現一些較簡單的資料約束條件,對一些較複雜的事物處理規則就無能為力,這時最好不要在應用程式中實施複雜的程式控制,而是應當採用資料庫觸 發器來實施複雜的事物規則。資料庫觸發器能實現由資料庫本身,而不是應用程式,來約束資料符合複雜的事物處理規則,並且容易建立,便於管理,避免大量的網 絡I/O。
  例如:將當前表A中成為歷史的記錄從A表中轉儲到歷史表B中,表示為Lsbs。
在應用程式中實現:       用資料庫觸發器實現:
使用資料庫觸發器
  
Beign              Create trigger delete1 Update A set lsbs='T';       After update of lsbs on A Insert into B           For each row Select * from A where lsbs='T';    Insert into B Delete A where lsbs='T';      select * from A where :new.lsbs='T';
End;
              
Delete A where :new.lsbs='T';                End delete1;

  在應用程式中實現時,所有的SQL 命令請求傳送的資料都要透過網路在Client端和Server端進行交換,而不像資料庫觸發器一樣,SQL本身在Server端,不需要透過網路傳輸數 據。當進行操作的資料量相當大時,並且多個使用者同時操作時,透過在應用程式中實現複雜的控制,必將增大網路I/O的負荷,使整個系統的效能降低,而用資料 庫觸發器能完全避免這種情況發生。2.3 Oracle 的儲存過程和儲存函式是命名的能完成一定功能並且儲存在Server端的PL/SQL的集合。包是一種把有關的過程和函式組織封裝成一個資料庫程式單元的 方法。它們相對於應用程式的過程、函式而言,把SQL命令儲存在Server端。使用儲存過程和儲存函式,應用程式不必再包含多個網路操作的SQL語句去 執行資料庫伺服器操作,而是簡單呼叫儲存過程和儲存函式,在網路上傳輸的只是呼叫過程的名字和輸出結果,這樣就可減少大量的網路I/O。
  例如:基表A、B的定義:name char(20);detail char(10);A表100萬記錄,應用程式將從基表A中檢索detail列符合給出條件的記錄,並將之插入基表B。
  
使用儲存過程、儲存函式和包
  
Declare  Cursor cursor1 is select*from A;poin cursor1%type
     
con1 number(2);res1 char(4)='abcd';  Begin Insert into B values(poin.name,poin.detail);end if;   For poin in cursor1 loop   End loop;End loop;   For con1 in 1..7 loop    Commit;   If substr(poin.detail ,con1,4)=res1 then End;
  如果在Developer/2000 From中按鈕觸發器直接用PL/SQL實現和把它改寫為一個Oracle儲存過程,然後在From中呼叫此過程實現比較,後者效能顯著提高。
  在考慮使用上述3種方法時:首先考慮使用完整約束性。對於資料庫觸發器和儲存過程,如果需要所有訪問資料庫的程式自動實施一定規則或檢查,那麼使用資料庫觸發器;如果只需對少數的程式實施一定的規則或檢查,則可建立一個過程,讓有關程式呼叫這個過程。

3 應用程式的調整
3.1
  SQL語句的執行速度,可以受很多因素的影響而變化。但主要的影響因素是:驅動表、執行操作的先後順序和索引的運用。可以由很多不同的方法間接地改變這些因素,以達到最優的執行速度。這裡主要探討當對多個表進行連線查詢時應遵循的最佳化原則:
  (1)
SQL語句的最佳化 用於連線的子句的列應被索引、在Where子句中應儘量利用索引,而不是避開索引。
  (2)
連線操作應從返回較少行上驅動。
  (3)
如果所連線的表A和B,A表長度遠遠大於B表,建議從較大的A表上驅動。
  (4)
如果Where子句中含有選擇性條件,Where No=20,將最具有選擇性部分放在表示式最後。
  (5) 如果只有一個表有索引,另一表無索引,無索引的表通常作為驅動表。如A表的No列以被索引,而B表的No 列沒被索引,則應當B表作為驅動表,A表作為被驅動表。
  (6)
若用於連線的列和Where子句中其他選擇條件列均有索引,則按各個索引對查詢的有效性和選擇性分別定出級別,結合表中具體資料構成情況,從中選出最佳化路徑,一般需要考慮:子句中哪些列可以使用索引、哪些索引具有唯一性及被查詢錶行數目等。3.2 利用檢視可以將基表中的列或行進行裁減、隱藏一部分資料,並且能夠將涉及到

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017441/,如需轉載,請註明出處,否則將追究法律責任。

相關文章