眾所周知Oracle數據庫表都是存儲在表空間當中從理論上來說表可以放置在任何一個表空間當中但是在實際工作中處於性能安全方面的考慮數據庫工程師往往不會這麼隨意他們在建立數據庫之前會先對表空間進行規劃要為Oracle數據庫選擇一個合適歸宿由於這個沒有技術方面的限制故也沒有統一的規則各尋智者見智仁者見仁這更是考驗數據庫工程師水平的一個問題
由於這沒有統一的標准公說公有理婆說婆有理為此筆者下面提的幾個建議或許也並不一定是真理這些只是筆者工作經驗的總結各位讀者可以有選擇的參考
規則一不要把用戶的表放置在System表空間
當數據庫安裝完畢後數據庫據系統會默認創建三個表空間分別為SystemSysausTemp的標空間前面兩個位系統表空間後面一個為臨時表空間這兩個表空間往往系統有特殊的用途故通常情況下在系統表空間中應該只存放包含數據字典和Oracle系統對象等等相關的表如果數據庫管理員在系統表空間中建立表(包括其他方案對象如視圖等等)的話將會影響數據庫的性能為此無論是Oracle官方還是筆者都強烈建議數據庫管理員不要在系統表空間中建立其他的數據表等數據庫對象也就是說除了系統安裝時默認建立的對象之外Oracle數據庫工程師不要往這些系統表空間中放入任何數據庫方案對象默認情況下數據庫在權限方面沒有進行這方面的控制故主要靠用戶自覺為了防止將表建立在系統表空間中筆者有如下幾個建議
一是參與數據庫開發的用戶如果有多個的話最好給每個用戶都設置一個默認的表空間(當然這個表空間不能夠是系統表空間)因為用戶在建立數據庫表的時候默認情況下是保存在其設置的默認表空間上故只要為用戶設置默認表空間則用戶往往不會因為疏忽等原因而把數據庫表誤放入系統表空間了
二是可以進行相關的權限控制如在數據庫開發時期可以限制其他數據庫用戶往這系統表空間中存放數據庫對象的權利有時會為了防止意外可以設置一個用戶有這個往系統表空間中放東西的權利如此其他用戶需要往System等系統表間中建立數據庫表或者其他數據庫對象時則只能夠有一個用戶來完成這可以最大限度的限制系統表空間的干淨防止用戶表放入到系統表空間從而提高數據庫的運行效率
三是在數據庫交付使用之前數據庫工程師最好再進行一次檢查看看系統表空間中是否有非系統表的數據表在交付之前數據庫工程師還可以做調整如果交付後用戶已經往系統中存儲了數據才發現這個錯誤的話那麼調整起來工作量將會很大
總之一個基本的原則就是系統表空間中不能夠存放用戶表等數據庫對象否則的話會降低數據庫的性能同時也不要將系統對象移動到其他的非系統表空間上這個畫蛇添足的做法也會降低數據庫的性能
規則二為用戶數據表適當的分家
Oracle數據庫系統可以創建多個非系統表空間但是並不是把用戶表分散在多個表空間中就能夠取得比較好的效果如果把表隨意的分散到不同的表空間中則當執行某些數據庫管理和維護操作時就需要花費更多的時間並且無法集中管理屬於某個應用的數據
那麼有人就會說把所有的表都存放在一個表空間中就好了呀這是一個笨辦法往往也不是最好的選擇因為把表有選擇的分散保存在多個表空間中只要合理就能夠提高數據庫的性能如當把用戶表分門別類的放置到不同的表空間中就可以將某個表空間設置為只讀狀態從而可以將數據庫的一部分設置為只讀狀態如可以通過表空間的大小來靈活的為用戶設置存儲限額如可以把不同的表空間存放在不同的硬盤上從而降低硬盤的輸入輸出競爭提高數據庫的性能
可見用戶數據表到底要不要分家分不同的表空間存放這是一個難以抉擇的問題筆者認為應該對數據表進行合理的分家以提高數據庫的性能以及靈活性當然分家也不能夠分的太小否則的話反而會增加數據庫系統的負擔具體來說在給數據表進行分家時可以參考以下幾個建議
一是根據應用的不同來創建不同的表空間有時會數據庫管理員可能會在同一個數據庫中部署不同的應用此時把不同的應用部署在不同的表空間中是一個不錯的選擇如此的話就可以保證各個不同應用之間數據的獨立性防止相互之間產生干擾
二是如果某些數據表出於一些特殊的需要要設置為只讀則可以把這些特殊的數據表存放在一個特定的表空間中然後數據庫工程師只要把這個特定的表空間設置為只讀則存放在這個表空間中的表都將設置為只讀不允許用戶進行刪除更新插入等操作這個權限設置將覆蓋在表權限上的設置故相對來說更加的安全
三是數據庫據工程師在開發數據庫的時候要考慮用戶是否有磁盤限額控制的要求有些企業的數據庫應用可能做的比較大各個分公司的數據都存放在同一個數據庫中為此有必要對用戶的磁盤限額進行設置否則的話某個分公司或者部門如果占用了比較多的磁盤空間將會對其他用戶產生不利影響故如果要對用戶實現磁盤限額的話那麼最好能夠把不同用戶的表放置在不同的表空間然後針對表空間來實現磁盤限額因為在Oracle數據庫中沒有針對用戶來進行磁盤限額的功能故只好通過這個曲線救國的方案來實現
四是從數據庫的用途來考慮是否要要把用戶的表進行分家放置在不同的表空間如數據庫的訪問者比較多並發行訪問比較頻繁的話那麼如果把用戶表放置在一個表空間中會對硬盤的輸入輸出產生比較大的壓力也就是說硬盤的輸入輸出跟不上CPU內存的頻率從而硬盤的訪問速度將成為影響數據庫性能的瓶頸要提高數據庫服務器硬盤的存儲效率有三種方式一是采用性能比較好的硬盤(如轉速高或者串口硬盤)不過這個由於受到硬件條件的限制改善的效果並不是很明顯二是可以考慮把不用用戶的表放置在不同的表空間然後把不同的表空間放置在不同的硬盤上以提高數據存取的效率三是可以通過磁盤陣列技術來改善數據庫數據的存取效率因為采取了磁盤陣列技術之後系統會把大的數據庫分成一個個小的數據塊在保存的時候會同時存入到幾塊硬盤中;在讀取的時候也可以同時從硬盤中讀出來從而提高硬盤的輸入輸出效率所以筆者建議對於並發性訪問比較高的數據庫可以考慮對用戶的表按部門或者其他規則進行分家放置在不同的表空間以及硬盤中如果這個分家規則不知道怎麼定義或者並發性訪問沒有明顯規律的話那麼可以通過磁盤陣列來改善因為並發性訪問導致的數據庫據性能下降問題
總之對於用戶數據表是否要分家這個問題筆者的意見是要謹慎設計數據庫系統時數據庫工程師要預先規劃存放應用系統表的表空間即使要對數據表進行分家的話也不能夠隨意將用戶表分散到不同的表空間中去要根據表的性質種類用戶需求等角度去考慮同時兼顧數據庫的安全性數據庫性能等等以上四個建議是筆者對用戶表進行分家時主要參考的規則大家可以拿來進行參考
最後需要強調的是如果光從數據庫性能方面出發只要數據庫服務器實現了磁盤陣列技術那麼如果再對數據庫表進行分家效果就不怎麼明顯了也就是說磁盤陣列與數據庫用戶數據表分表空間存放兩個手段往往只需要采用一個即可換句話說就是+ <的意思
From:http://tw.wingwit.com/Article/program/Oracle/201311/17981.html