什麼是數據庫分區?
數據庫分區是一種對表的橫向分割Sql server 企業版和之後的Sql server版本才提供這種技術這種對表的橫向分割不同於中的表分割它對訪問用戶是透明的用戶並不會感覺的表被橫向分割了(中的表橫向分割是建n個表例如按時間建表每月一個表表名不同最後需要做一個大視圖)
為什麼要分區?
顯而易見分區是為了提高數據庫的讀寫性能提高數據庫的效率
分區是否總是可以提高效率?
分區是一把雙刃劍並不總能提高效率這和具體情況有關系
之所以有分區技術分區技術用的好的話可以提高性能是因為一方面分區把一大塊數據分成了n小塊這樣查詢的時候很快定位到某一小塊上在小塊中尋址要快很多另一方面CPU比磁盤IO快很多倍而硬件上又有多個磁盤或者是RAID(廉價磁盤冗余陣列)可以讓數據庫驅動CPU同時去讀寫不同的磁盤這樣才有可能可以提高效率
分區在有些時候並不能提高讀寫效率比如說我們經常看到的按照日期字段去分區MSDN例子這個實例中是按照記錄的生成時間來分區的把一年的數據分割成個分區每月一個這樣的分區導致分區並不能實現CPU同步寫並提高寫入性能因為在同一個時段CPU總是要寫入到最新的那一個分區對應的磁盤中另一個問題是這樣分區是否可以提高讀取性能呢?答案是不一定要看根據什麼字段來查詢如果是根據時間來查詢根據時間生成報表那麼這種分區肯定會提高查詢的效率但是如果是按照某個客戶查詢客戶最近年內的賬單數據這樣數據分布到不同的分區上這樣的話效率就不一定能提高了這要看數據在同一個分區上連續分布的讀性能高還是CPU從幾個磁盤上同步讀取然後在合並數據的性能更高一些這和讀取數據的記錄數也有關系
如何分區?用什麼字段做分區依據?
具體如何分區和涉及的業務有關系要看業務上最經常的寫入和讀取操作是什麼然後再考慮分區的策略
既然與具體業務相關我們就假定一個業務環境假如我們要做一個論壇對論壇的帖子和回復表進行分區
論壇中最常見的寫操作是)發帖 )回復帖子 最常見的讀操作是
) 根據帖子id顯示帖子詳情和分頁的帖子回復
) 根據帖子版面帖子列表頁根據版面id分頁讀取帖子列表數據
怎麼分區更合適呢?現在還沒有准確答案我有兩種可能的方案寫下來大家討論看看
方案 根據帖子ID區域段分區(w一個分區ww一個分區…)這樣理論上可以提高帖子詳細頁的讀取速度而對於寫操作性能沒有益處對於根據版面id讀取帖子列表頁有可能有益
方案 根據版面id進行分區這樣對於寫性能應該有提高不同的分區對應不同的版面當有兩個版面同時有發帖回帖操作時有可能可以並發寫對於根據版面id獲得帖子列表頁數據也可以提高性能而對於帖子詳細信息頁沒有性能影響
多大的數據量才需要分區?
這個問題我只能說一個內部標准如果一張表的記錄超過在超過w並以每月百萬的數據量增長那就需要分區
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22473.html