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

大型數據庫設計原則

2013-11-13 16:10:08  來源: Oracle 

  一個好的數據庫產品不等於就有一個好的應用系統如果不能設計一個合理的數據庫模型不僅會增加客戶端和服務器段程序的編程和維護的難度而且將會影響系統實際運行的性能一般來講在一個MIS系統分析設計測試和試運行階段因為數據量較小設計人員和測試人員往往只注意到功能的實現而很難注意到性能的薄弱之處等到系統投入實際運行一段時間後才發現系統的性能在降低這時再來考慮提高系統性能則要花費更多的人力物力而整個系統也不可避免的形成了一個打補丁工程筆者依據多年來設計和使用數據庫的經驗提出以下一些設計准則供同仁們參考

  命名的規范

  不同的數據庫產品對對象的命名有不同的要求因此數據庫中的各種對象的命名後台程序的代碼編寫應采用大小寫敏感的形式各種對象命名長度不要超過個字符這樣便於應用系統適應不同的數據庫

  游標(Cursor)的慎用

  游標提供了對特定集合中逐行掃描的手段一般使用游標逐行遍歷數據根據取出的數據不同條件進行不同的操作尤其對多表和大表定義的游標(大的數據集合)循環很容易使程序進入一個漫長的等特甚至死機筆者在某市《住房公積金管理系統》進行日終帳戶滾積數計息處理時對一個萬個帳戶的游標處理導致程序進入了一個無限期的等特(後經測算需個小時才能完成)(硬件環境Alpha/ Mram Sco Unix Sybase )後根據不同的條件改成用不同的UPDATE語句得以在二十分鐘之內完成示例如下

  Declare Mycursor cursor for select  count_no from COUNT

  Open Mycursor

  Fetch Mycursor into @vcount_no

  While (@@sqlstatus=)

  Begin

  If  @vcount_no=  條件

  操作

  If  @vcount_no=  條件

  操作

  

  Fetch Mycursor into @vcount_no

  End

  

  

  改為

  Update COUNT set  操作 for 條件

  Update COUNT set  操作 for 條件

  

  

  在有些場合有時也非得使用游標此時也可考慮將符合條件的數據行轉入臨時表中再對臨時表定義游標進行操作可時性能得到明顯提高筆者在某地市〈電信收費系統〉數據庫後台程序設計中對一個表(萬行中符合條件的多行數據)進行游標操作(硬件環境PC服務器PII Mram NT Ms Sqlserver ) 示例如下

  Create #tmp   /* 定義臨時表 */

  (字段

  字段

  

  )

  Insert into #tmp select * from TOTAL where

  條件  /* TOTAL中萬行 符合條件只有幾十行 */

  Declare Mycursor cursor for select * from #tmp

  /*對臨時表定義游標*/

  

  索引(Index)的使用原則

  創建索引一般有以下兩個目的維護被索引列的唯一性和提供快速訪問表中數據的策略大型數據庫有兩種索引即簇索引和非簇索引一個沒有簇索引的表是按堆結構存儲數據所有的數據均添加在表的尾部而建立了簇索引的表其數據在物理上會按照簇索引鍵的順序存儲一個表只允許有一個簇索引因此根據B樹結構可以理解添加任何一種索引均能提高按索引列查詢的速度但會降低插入更新刪除操作的性能尤其是當填充因子(Fill Factor)較大時所以對索引較多的表進行頻繁的插入更新刪除操作建表和索引時因設置較小的填充因子以便在各數據頁中留下較多的自由空間減少頁分割及重新組織的工作

  數據的一致性和完整性

  為了保證數據庫的一致性和完整性設計人員往往會設計過多的表間關聯(Relation)盡可能的降低數據的冗余表間關聯是一種強制性措施建立後對父表(Parent Table)和子表(Child Table)的插入更新刪除操作均要占用系統的開銷另外最好不要用Identify 屬性字段作為主鍵與子表關聯如果數據冗余低數據的完整性容易得到保證但增加了表間連接查詢的操作為了提高系統的響應時間合理的數據冗余也是必要的使用規則(Rule)和約束(Check)來防止系統操作人員誤輸入造成數據的錯誤是設計人員的另一種常用手段但是不必要的規則和約束也會占用系統的不必要開銷需要注意的是約束對數據的有效性驗證要比規則快所有這些設計人員在設計階段應根據系統操作的類型頻度加以均衡考慮

  事務的陷阱

  事務是在一次性完成的一組操作雖然這些操作是單個的操作SQL Server能夠保證這組操作要麼全部都完成要麼一點都不做正是大型數據庫的這一特性使得數據的完整性得到了極大的保證

   眾所周知SQL Server為每個獨立的SQL語句都提供了隱含的事務控制使得每個DML的數據操作得以完整提交或回滾但是SQL Server還提供了顯式事務控制語句

  BEGIN TRANSACTION 開始一個事務

  COMMIT TRANSACTION 提交一個事務

  ROLLBACK TRANSACTION 回滾一個事務

  事務可以嵌套可以通過全局變量@@trancount檢索到連接的事務處理嵌套層次需要加以特別注意並且極容易使編程人員犯錯誤的是每個顯示或隱含的事物開始都使得該變量加每個事務的提交使該變量減每個事務的回滾都會使得該變量置而只有當該變量為時的事務提交(最後一個提交語句時)這時才把物理數據寫入磁盤

  數據庫性能調整

  在計算機硬件配置和網絡設計確定的情況下影響到應用系統性能的因素不外乎為數據庫性能和客戶端程序設計而大多數數據庫設計員采用兩步法進行數據庫設計首先進行邏輯設計而後進行物理設計數據庫邏輯設計去除了所有冗余數據提高了數據吞吐速度保證了數據的完整性清楚地表達數據元素之間的關系而對於多表之間的關聯查詢(尤其是大數據表)時其性能將會降低同時也提高了客 戶端程序的編程難度因此物理設計需折衷考慮根據業務規則確定對關聯表的數據量大小數據項的訪問頻度對此類數據表頻繁的關聯查詢應適當提高數據冗余設計

  數據類型的選擇

  數據類型的合理選擇對於數據庫的性能和操作具有很大的影響有關這方面的書籍也有不少的闡述這裡主要介紹幾點經驗

  Identify字段不要作為表的主鍵與其它表關聯這將會影響到該表的數據遷移

  Text 和Image字段屬指針型數據主要用來存放二進制大型對象(BLOB)這類數據的操作相比其它數據類型較慢因此要避開使用

  日期型字段的優點是有眾多的日期函數支持因此在日期的大小比較加減操作上非常簡單但是在按照日期作為條件的查詢操作也要用函數相比其它數據類型速度上就慢許多因為用函數作為查詢的條件時服務器無法用先進的性能策略來優化查詢而只能進行表掃描遍歷每行

  例如要從DATA_TAB中(其中有一個名為DATE的日期字段)查詢年的所有記錄

  Select * from DATA_TAB where datepart(yyDATE)=


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