資料庫的設計在系統設計當中是乙個非常重要的環節,目前很多開發商忽略了它的重要性,把資料庫設計基本等同於建立業務所需要的所有物件,這樣系統就存在很多隱患。對於資料庫的設計,除了一些必要的物件建立之外,還有更多需要考慮在系統執行的整個生命週期中,按照實際的情況及以後可能發生的變化做一些前瞻性的設計,以滿足系統生命週期裡的各方面需求,避免發生大的修改或公升級。
1.oltp資料庫
記憶體的設計通常是通過調整oracle和記憶體相關的初始化引數來實現的,比較重要的幾個是記憶體相關的引數,包括sga的大小(date buffer,shared pool)、pga大小(排序區,hash區等)等,這些引數在乙個oltp系統裡顯得至關重要,oltp系統是乙個資料塊變化非常頻繁、sql語句提交非常頻繁的系統。對於資料塊來說,應盡可能讓資料塊儲存在記憶體當中,對於sql來說,盡可能使用變數繫結技術來達到sql的重用,減少物理i/o和重複的sql解析,能極大的改善資料庫的效能。
關於一些初始化引數的設定的問題,沒有乙個確定的標準,這和每個資料庫上執行的業務直接相關,能夠確定這些引數值的唯一方法就是測試,先給這些引數設定乙個經驗值,然後通過搭建測試環境對資料庫進行測試,通過一些效能報告作為依據,不斷地調整這些引數值,以達到最佳效能。
除了記憶體、沒有繫結變數的sql會對oltp資料庫造成極大的效能影響之外,還有一些因素也會導致資料庫的效能下降,比如熱塊(hot block)的問題,當乙個塊被多個使用者同時讀取的時候,oracle 為了維護資料的一致性,需要使用一種稱為latch的東西來序列化使用者的操作。當乙個使用者獲得這個latch後,其他的使用者就只能被迫等待。獲取這個資料塊的使用者越多,等待就越明顯,就造成了這種熱塊問題。這種熱塊可能是資料塊,也可能是回滾段塊。對於資料塊來講,通常是資料塊上的資料分布不均勻導致,如果是索引的資料塊,可以考慮建立反向索引來達到重新分布資料的目的,對於回滾段資料塊,可以適當多增加幾個回滾段來避免這種爭用。
2.olap資料庫
olap資料庫在記憶體上可優化的餘地很小,使用者對olap系統效能的期望遠遠沒有對oltp效能的期望那麼高。記憶體的優化,對olap影響很小,因為對於海量的資料,全部在記憶體中操作是很難的,也是沒有必要的,由於這些資料塊很少重用,快取起來也沒有意義,倒是物理i/o相當大,這種系統的瓶頸往往是在磁碟i/o上面。
對於olap系統,sql的優化非常重要,例如:如果一張表中只有幾千條資料,無論執行全表掃瞄或是使用索引,差別都很小,幾乎感覺不出來,但是當資料量是幾億甚至幾十億的時候,全表掃瞄、索引可能導致極大的效能差異,因此此時的sql優化顯得十分重要。
分割槽技術在olap資料庫中很重要,這種重要主要體現在資料管理上,比如資料載入,可以通過分割槽交換的方式實現(具體過程可見另一篇文章),備份可以通過備份分割槽表空間實現,刪除資料可以通過分割槽進行刪除,分割槽一般情況下效能都是優於非分割槽的,但是不能一概而論,下面討論幾種使用分割槽的情況:
1)當查詢的範圍正好落在某個分割槽的時候
這時候分割槽的效率自然是高於沒有分割槽的,因為sql在有分割槽的表上只掃過乙個分割槽的資料,而對於沒有分割槽的需要進行全表掃瞄。
2)當查詢的範圍跨越幾個分割槽時
這時候的分割槽可能並不絕對是最優的,此時的分割槽效率不一定比非分割槽的效率高,甚至可能效率低於非分割槽的效率。例如:一張分割槽表和一張非分割槽表,兩表的結構和資料完全一樣,不同點在於乙個分割槽乙個未分割槽,兩表都在同一列建立索引,使用同一條sql語句(如select /* +index ffs (t t ind)*/ count(*)from table)讓cbo使用fast index full scan的方式掃瞄索引,此時在分割槽表的執行效率明顯低於非分割槽表的效率,這是因為分割槽索引在做ffs(fast index full scan)的時候只能夠在本地索引上進行,如果涉及其他的分割槽,還需要按照訪問索引的方式去訪問其他索引(如先找到其他分割槽索引的根資料塊,再找到最左邊的葉塊,然後執行ffs操作),這樣,查詢跨過的分割槽越多,這種額外的代價就越大,而在這種情況下,非分割槽表使用全域性索引只需要定位到乙個葉塊,然後執行一次ffs就能夠掃過所有的索引葉塊,這樣效能就會好於分割槽索引。
在olap環境中,分割槽主要的功能是方便管理,它並不能絕對保證查詢效能的提高,有時候分割槽會帶來效能上的提高,有時候甚至會降低。
資料庫設計理論
資料庫規範化理論正是用來改造關係模式,通過分解關係模式來消除其中不合適的資料依賴,以解決插入異常 刪除異常 更新異常和資料冗餘問題。在討論關聯式資料庫設計之前我們需要了解一些基本的術語和概念 由五部分組成,即它是乙個五元組 r u,d,dom,f r 關係名 u 組成該關係的屬性名集合 d 屬性組u...
資料庫設計理論
資料庫設計理論 一 資料庫設計的幾個原則 乙個好的資料庫產品不等於就是乙個好的應用系統,如果不能設計乙個合理的資料庫模型,不僅會增加客戶端與伺服器端的程式設計和維護難度,而且會影響系統實際執行的效能。因此,要想開發出一款理想的資料庫產品應遵循以下設計準則 1 命名規範化 不同的資料庫產品對物件的命名...
關聯式資料庫設計理論
關聯式資料庫的模式設計 本章的理論性較強,學習時有無從下手的感覺,在學習時應多加思考,從概念出發去理解理論,前後的理論有較強的聯絡,因此要逐個理解,但對於理論的證明等內容則不必深究,本章重點是函式依賴,無損聯接 保持依賴和正規化的概念。一 關係模式的設計問題 識記 關聯式資料庫 是以關係模型為基礎的...