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

Oracle平台應用數據庫系統的設計與開發

2013-11-13 15:46:03  來源: Oracle 

  Oracle是目前應用最廣泛的數據庫系統一個完整的數據庫系統包括系統硬件操作系統網絡層DBMS(數據庫管理系統)應用程序與數據各部分之間是互相依賴的對每個部分都必須進行合理的配置設計和優化才能實現高性能的數據庫系統本文討論筆者使用Oracle開發局域網中小型數據庫應用中系統硬件的選擇與使用應用數據庫系統設計與開發方面的一些心得和建議應用數據庫系統包含應用數據庫和應用兩方面的內容應用數據庫就是生產數據庫與系統數據庫相對
  
  系統硬件的選擇與使用
  
  與數據庫系統密切相關的硬件主要有CPU內存集群存儲設備等這裡不對集群進行討論
  
  CPU
  
  CPU的數目和速度直接影響數據庫操作的速度Oracle數據庫提供並行查詢選項允許SQL操作以協同方式在多個CPU上執行可以很大程度的發揮多CPU的性能為系統添加CPU前首先要對應用程序的SQL代碼做優化提高應用程序的效率質量低劣的應用可能會引起CPU資源的無謂的消耗其次要了解操作系統對CPU數目的限制及系統的可擴展性在系統CPU資源已定的情況下要對各類應用進行分析在保證關鍵應用正常運行的前提下盡可能將大量占用CPU資源的應用放在系統相對空閒的時候進行良好的工作調度可以有效減少對CPU的競爭使用加快系統的響應時間
  
  內存
  
  數據庫系統中應保證有足夠大的內存在UNIX系統中如果系統的物理內存小於GB可將交換區的大小設為內存的否則可設為內存的交換區要放在磁盤速度最快的硬盤上Oracle 的SGA區大小直接關系到數據庫操作的性能一般來說SGA區的大小可設為系統可用內存的%到%SGA區過多占用系統內存反而會降低性能在應用系統運行中應定期監測系統的內存使用情況對關鍵應用進行分析根據應用適時調整SGA區各部分的大小Oraclei可在不重新啟動數據庫的情況下修改SGA區的參數實時改變SGA區的大小
  
  存儲設備
  
  在網絡時代信息資源的積累和廣泛應用對數據存儲技術的發展提出了更大的挑戰數據存儲模式從傳統的總線連接模式進入了網絡存儲模式但存儲設備依然是硬盤磁帶(帶庫)磁盤陣列在中小型數據庫應用中傳統存儲模式仍占主導地位
  
  磁盤I/O是數據庫操作的瓶頸之一磁盤的合理選擇和使用在數據庫系統中顯得尤為重要在最初做數據庫系統規劃時應充分考慮到系統的容量和預期的增長盡可能為以後的擴展留足空間在硬盤和磁盤陣列的選擇與使用中應注意以下幾點
  
  ·選擇支持熱插拔功能的硬盤這樣在出現硬盤Oracle 平台應用數據庫系統的設計與開發失敗時可以在系統正常運行的情況下更換硬盤
  
  ·不要選擇太大的硬盤切記對Oracle 應用程序~GB大小的硬盤是比較合適的最好購買大量的中小型硬盤這樣在配置RAID時可提供更大的靈活性
  
  ·如果選用了磁盤陣列對於Oracle數據庫應用如果經費能夠支持RAID +是最佳的配置方法在RAID 讀操作性能得到了一定的改善但寫性能損失很大如果某個硬盤失敗硬盤重建的工作量非常大RAID 適用於DSS(決策支持系統)應用對OLTP(聯機事物處理)應用不太合適
  
  ·在實現RAID時要正確地選擇分條的大小決定分條大小的三個主要因素是應用程序的特性(DSSOLTP批處理)操作系統與數據庫的數據塊大小磁盤陣列中的硬盤數目數據庫的數據塊大小應是操作系統數據塊大小的整數倍同樣分條大小也必須是操作系統數據塊大小的整數倍如果使用裸設備分條大小應是操作系統物理數據塊的大小分條可按照水平方向進行也可按照垂直方向進行水平分條跨越每個硬盤控制器進行垂直分條跨越整個硬盤集合進行分條集合中的成員數應不大於硬盤控制器數OLTP應用程序數據訪問的數據量不大一般可選擇KB 或KB 的分條大小而DSS應用程序訪問的數據量大可考慮使用KBKB或KB的分條大小
  
  應用數據庫的設計與開發
  
  Oracle數據庫軟件安裝和配置完成後就進入了應用數據庫的設計階段應用數據庫設計包括邏輯設計與物理設計合理的邏輯設計會大大提高數據庫的性能增強數據庫的可維護性在設計中根據應用抽象出實體關系模型將實體關系圖映射為標准化(數據完整與應用無關存儲優化)的關系模型(數據庫對象)當前有一些輔助工具(Oracle Designer等)來實現實體關系圖到SQL代碼的映射數據庫的物理設計就是數據庫對象的存儲設計即如何為數據庫對象分配存儲空間
  
  在進行數據庫對象的設計前數據庫的管理和開發人員對應用和應用的數據及其應用關系要有一個詳盡的理解根據應用進行數據庫對象的規劃和設計大概包含以下幾個方面
  
  ·確定需建立的數據庫用戶明確用戶的系統權限和表空間限額為用戶設計資源限制profile
  
  ·確定應用數據應分多少個表進行設計各表分別屬於的用戶各用戶對各個表的操作權限
  
  ·明確各表的結構確定表的主鍵及約束
  
  ·明確哪些表是應用運行的關鍵表哪些是事務表
  
  ·分析哪些表是主表哪些表是從表確定表和表之間的外鍵約束選擇合適的表作為表連接的驅動表
  
  ·根據應用確定在哪些表上對哪些列建立合適的索引
  
  ·根據表和索引的設計確定要創建的表空間和回滾段為表空間和回滾段選擇合適的磁盤盡可能創建本地管理的表空間減少數據庫空間管理方面的工作
  
  ·明確需要編寫的觸發器及過程
  
  ·為數據庫對象選擇備份和恢復策略
  
  在數據庫設計階段有時未必能完全確定合適的數據庫對象的特征應用設計和開發中還可能發現不合適的地方需要回過頭來進行調整和修改但設計階段的工作越細致出現問題的可能性就越小工作的效率就越高
  
  創建數據庫對象時要根據數據庫對象的特點結合存儲設備的大小數量及速度等對數據庫對象分類進行存儲最大限度地消除或減少資源競爭在數據庫對象創建時主要應遵循以下原則
  
  ·應用數據應放在單獨的表空間不要將應用數據放在系統表空間為防止無意的使用系統表空間將應用用戶的系統表空間限額設為
  
  ·索引和表應放在位於不同硬盤上的不同的表空間這樣會提高數據庫操作的速度
  
  ·需要同時被訪問的表要分開存放利於並發訪問的實施
  
  ·如果磁盤數量有限可把不常聯合訪問的表放在相同的磁盤上
  
  ·預分配的原則創建數據庫對象(表空間回滾段索引等)時根據對象的情況設置合適的storage參數非常重要創建對象設計時對對象的容量和預期的增長有一個估計這樣才能確定存儲參數的大小一般來說應預先給表和索引等數據庫對象分配足夠的空間數據庫段不要太多地做動態擴展因為會影響數據庫性能一個段(segment)由一個區(extent)構成是最理想的initial 參數可以稍大一點如果可能可設為最大容量的大小initial必須是db_block_size的整數倍next參數的設置比較靈活根據應用進行相應的設置但也必須是db_block_size的整數倍為了減少數據庫碎片的產生pctincrease參數應該盡量設為更新操作比較少的段pctfree要設置得小一點更新操作很多的段要設置得大一些inittrans和freelists的值要相等大小與並發事務數相關
  
  ·分而治之的原則大的數據庫表和索引可考慮進行分區存放不同的分區可位於不同的磁盤上更好地均衡I/OOracle可以只對表的某些分區進行查詢這樣會提高查詢的速度可對分區進行數據的刪除裝載還可以移動分區對表的管理和控制具有更大的靈活性可以有更多的策略選擇更好地執行備份和恢復操作注意對某些分區進行操作後在Oraclei下必須重建全局索引
  
  ·大小和增長趨勢類似的表最好放在相同的表空間可以有效控制硬盤碎片的產生提高空閒塊的可重用性
  
  ·相同備份和恢復策略的表最好放在同一個表空間這樣有助於備份和恢復工作的完成
  
  ·對響應時間要求苛刻的應用所訪問的對象放在速度快的磁盤上
  
  數據庫應用系統的設計與開發
  
  應用設計
  
  不論使用何種工具或語言來開發應用程序都需要進行應用的全面設計應用設計包括
  
  首先分析應用要完成的功能確定應用類型是OLTP(聯機事務處理)系統DSS(決策支持)系統還是批處理系統
  
  其次了解應用在何時由誰使用應用訪問的數據應用程序用到的組件應用被要求的響應時間等在設計前必須對這些問題盡量進行解答這對應用設計特別是大規模的應用設計非常重要
  
  第三根據上面的資料確定應用的體系結構是采用client/server兩層架構的方式還是采用browser/server多層架構的方式實現一個開放的分布式應用系統如何對應用服務器進行選擇與配置
  
  第四將應用按功能劃分為一個或多個應用程序明確應用程序的具體功能類型組成使用時間及高峰時間事務的流量用戶組成訪問的數據庫對象等確定應用程序間的關聯和互操作特性對各個應用程序的執行時間合理地進行安排
  
  第五對應用程序進行模塊化設計選擇實現應用的數據庫組件和開發語言及工具
  
  應用開發
  
  在應用開發階段根據應用的不同實現的方法和步驟會有很大的差異這裡只討論以下在應用開發中需要重點注意的幾個問題
  
  ) 在開發會話關鍵型應用程序時盡可能使用Pro*C/C++或OCI在編寫後備實例和數據庫失敗恢復等需要進行數據庫重新連接的代碼時用Pro*C/C++ 或OCI比用PL/SQL要容易實現在Oracle/i中OCI可以實現透明應用程序失敗恢復(TAF)編寫數據庫操作繁重的應用程序使用OCIOCI程序對數據庫的訪問是通過調用OCI庫函數實現的能夠直接到達系統內核比Pro*C/C++速度更快
  
  ) 在開發會話關鍵型應用程序時盡量實現失敗檢查和恢復能力如指定後備數據庫或實例終止出錯客戶進程等
  
  ) 編寫代碼時要考慮應用程序的可維護性盡量將應用程序獨立於數據庫的變化可使用視圖相對變量類型定義(%TYPE)記錄型變量定義(%ROWTYPE)采用表驅動的應用程序設計模式
  
  ) 進行充分的單元測試和模塊測試為應用集成打下堅實的基礎
  
  ) 對關鍵表操作的應用程序實現要特別當心必要的話在應用中對關鍵表先做備份應用成功執行後再刪除備份表
  
  ) 編碼結束後應對代碼進行優化前面提到過代碼優化在數據庫應用中非常重要很高比例的性能問題與編碼拙劣的應用程序有關
  
  ) 定期對應用操作的數據庫對象增長的情況進行監控避免因空間不足引起的應用程序的失敗
  
  ) 對應用的數據定時進行整理有些應用中存放在數據庫表中的數據只要求保存一段時間就需要定時對數據進行刪除如果手工進行刪除操作工作量很大可以用Oracle提供的作業來完成 unix系統下可用cron進程來實現筆者在工作中經常使用cron來做數據的定時刪除根據應用要求編制Pro*C/C++程序編寫Shell腳本調用應用程序將Shell腳本提交給cron進程
  
  注意在Shell腳本中必須設置相應的Oracle環境變量如ORACLE_BASEORACLE_HOMENLS_LANGLD_LIBRARY_PATHPATH等用戶環境文件中的定義是無效的
  
  )對於大量刪除操作的應用程序如果表是分區存放的可對數據分區執行截斷(truncate)操作截斷操作執行速度快並且不會產生碎片但截斷後可能需要進行重建索引的工作對大量的數據做刪除(delete)操作會引起數據庫回滾段的急劇增長建議根據刪除數據量為這類應用創建特殊的專用回滾段為專用回滾段指定合適的storage參數平常專用回滾段可以是離線的(offline)在事物開始前使專用回滾段在線(online)指定事物使用專用回滾段事物結束後再使專用回滾段離線筆者使用的部分代碼 (Pro*C/C++) 如下所示
  
  EXEC SQL WHENEVER SQLERROR goto Error;
  EXEC SQL CONNECT :uid;
  
  EXEC SQL ALTER ROLLBACK SEGMENT RBS_SPEC ONLINE;
  EXEC SQL SET TRANSACTION USE ROLLBACK SEGMENT RBS_SPEC;
  
  EXEC SQL DELETE FROM WHERE
  EXEC SQL ALTER ROLLBACK SEGMENT RBS_SPEC OFFLINE;
  
  
  結束語
  
  Oracle數據庫是一個功能強大的數據庫系統適用於各種各樣的應用系統系統規模可大可小應用設計或簡單或復雜因此在使用過程中要根據各自不同的應用進行設置與調整以上是筆者在使用Oracle進行應用開發過程中一點心得和體會寫出來與大家共勉謝謝
From:http://tw.wingwit.com/Article/program/Oracle/201311/17271.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.