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