志当存高远,功到自然成!

少年强则中国强,少年进步则中国进步!

BlogJava 首页 新随笔 联系 聚合 管理
  53 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks
最近想對一個表進行分區,在sybase版轉了半天,沒找著詳細介紹表分區有關的帖子. 終於找著一篇比較詳細的,故貼之:

Sybase ASE表分區的使用

表分區是目前各主流數據庫都提供的常用技術,各大數據庫基於不同的體系結構提供了各具特色的實現,如果能合理使用這種技術,將為系統性能的提升帶來意想不到的效果,本文以Sybase ASE數據庫為例來說明這種技術的使用方法。


在Sybase ASE中,未分區的不帶聚簇索引的表有一個雙向的數據庫頁鏈鏈接。在插入數據行時,將查找並鎖定頁鏈的最後一頁,如果最後一頁空間用盡,Sybase ASE將分配新的一頁,如果對表進行大量頻繁的數據插入,將引起對最後一頁鎖資源的競爭,如果一個事務(Transaction)正在使用最後一頁的排它鎖,那麼其他向同一張表插入數據的事務必須等待,直到該事務結束釋放資源,解除排它鎖。


Sybase ASE從11.5開始提供新的特性表分區。表分區將產生附加的頁鏈,每個頁鏈有自己的最後一頁,這樣插入操作可以獲得多個最後一頁,實現並發操作,從而提高數據庫插入性能。若包含表的段分佈在多個物理設備上,表分區通過降低服務器從高速緩存向磁盤進行數據刷新的I/O衝突而提高數據插入性能。對頻繁地追加數據到表中或進行大塊數據的拷入、拷出操作,採用表分區技術,將能極大地提升系統性能。


劃分表分區的操作步驟如下:


1. 在同一數據庫設備上劃分表分區時,先創建表,再用alter table 的 partition 語句劃分表分區。


create table opt_plnexrcd ( per_date datetime, per_sndstn char(4), ... )


alter table opt_plnexrcd partition 5


2. 在多個數據庫設備上劃分表分區時,先建一個數據庫段在多個數據庫上,然後再將表建在該段上,最後對表分區。


sp_addsegment seg1, oil, oil_data1


sp_extendsement seg1, oil, oil_data2


...


sp_extendsement seg1, oil, oil_data5


create table opt_plnexrcd ( per_date datetime, per_sndstn char(4), ... ) on seg1


或建完表後執行sp_placeobject:


sp_placeobject seg1, opt_plnexrcd


最後對表分區:


alter table opt_plnexrcd partition 5


如果表分為5個分區,表所在的段又分跨5個數據庫設備,那麼每個分區將分別映射到該段所在的5個數據庫設備上。一般劃分表分區的原則是:表分區數等於或大於表所在段分跨的數據庫設備數。但要注意有些表不能分區,它們是系統表、正在使用的表、臨時表和有聚簇索引的表。


Sybase ASE使用保存在分區控制頁上的統計數據,來評測基於分區的並行掃瞄方式,以挑選最優執行計劃。如果表中數據在多個分區上是分佈均衡的,表分區統計數據是精確的,那麼掃瞄效率就比較高,並行處理就有很好的性能,所以表分區的維護對於並行查詢處理十分重要。Sybase ASE的異常停止和某些情況下的事務回退都可能造成分區統計數據不精確,Sybase ASE提供了兩個系統函數data_pgs和ptn_data_pgs,用它們可分別計算數據頁面數量。如果兩者不相同,說明分區統計不精確,需要維護,Sybase ASE 提供如下命令來更新分區和頁面統計數據:


1.更新每個分區的頁面統計數據:


update partition statistics


2.更新表上索引的分佈頁面,同時更新各個表分區的控制頁面的統計數據:


update all statistics table_name


3.顯示表分區的當前信息:


sp_helpartition


如果對分區的表進行了大量的插入、更新和刪除後,數據有可能分佈不均勻,使用BCP加載大量數據後,也可能會出現數據分佈不均勻,此外一些其他原因也可能導致數據分佈不均勻。平衡分區數據有兩種方法:一是對有數據的表建聚簇索引,二是使用並行塊拷貝,指定數據加載到某個分區的方法,Sybase ASE 新的BCP允許用戶指定分區,把數據加載到指定的分區中。

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问