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

Oracle 數據表分區的策略

2013-11-13 16:21:13  來源: Oracle 

  本文描述通過統計分析出醫院信息系統需分區的表對需分區的表選擇分區鍵即找出包括在你的分區鍵中的列(表的屬性)對大型數據的管理比較有意義 本文的工作在Oracle下實現
  
  Oracle雖然是一個大型的DBMS但如果不對記錄比較多的表進行處理仍然發揮不了Oracle管理大型數據的強大功能因此對某些表進行分區具有如下優點
  
  分區表中每個分區可以在邏輯上認為是一個獨立的對象
  
  可以在一個表中的一個或多個分區上進行如刪除移動析分等維護操作而不會影響其它分區具有分區獨立性
  
  如果選擇合適的分區策略會大大的加快數據的查詢速度
  
  一 找出需分區的表
  
  本節描述通過統計分析出醫院His系統需分區的表對需分區的表找出包括在你的分區鍵中的列(表的屬性)即選擇分區鍵
  
  基於訪問頻度找出需分區的表
  
  Oraclei允許訪問數據庫中的審核信息借助於收集的審核信息設計者能夠確定哪些表的數據是真正最頻繁訪問的即找出那些表需要進行分區
  
  打開審核在作為SYS或SYSSTEM登錄到數據庫後動行如下腳本打開對象的審核功能
  
  set echo off feed off ver off pages
  spool audonsql
  select audit select on ||owner||||object_name|| by
  access;
  from dba_objects
  where object_type in (VIEWTABLE) and owner in
  (ORDADM);
  spool off
  set echo on feed on ver on
  
  這些代碼的運行將產生audonsql的輸出文件它包含下面清單中所示格式的語句
  
  audit select on ORDADMDOCTOR_ORDERS by access;
  audit select on ORDADMGROUP_ORDER_ITEMS by access;
  audit select on ORDADMGROUP_ORDER_MASTER by access;
  audit select on ORDADMORDERS by access;
  audit select on ORDADMORDERS_COSTS by access;
  audit select on ORDADMORDERS_SHEET_IMAGE by access;
  audit select on ORDADMVITAL_SIGNS_REC by access;
  
  使用命令@audonsql激活上述代碼以打開審核功能收集收集審核信息建立一個表以保存概要信息
  
  create table aud_summary (
  obj_name varchar()
  owner varchar()
  hits number);
  
  將審核信息從dba_audit_object表中取出並裝入概要表中
  
  insert into aud_summary
  select obj_nameownercount(*)
  from dba_audit_object
  group by obj_nameowner;
  
  關閉審核
  
  set echo off feed off ver off pages
  spool audoffsql
  select noaudit select on ||owner||||object_name||
  by access;
  from dba_objects
  where object_type in (VIEWTABLE) and owner in
  (ORDADM);
  spool off
  set echo on feed on ver on
  
  這些代碼的運行將產生audoffsql的輸出文件
  
  使用命令@ audoffsql激活上述代碼以關閉上述對象的審核功能
  
  清除審核信息
  
  delete sysaud$
  
  分析審核信息
  
  col obj_name form a
  col owner form a
  col hits form
  selec obj_nameownerhits from aud_summary;
  OBJ_NAME OWNER COUNT(*)
  
  DOCTOR_ORDERS ORDADM
  DRUG_STOCK PHarmACY
  GROUP_ORDER_ITEMS ORDADM
  GROUP_ORDER_MASTER ORDADM
  ORDERS ORDADM
  ORDERS_COSTS ORDADM
  
  以上是HIS系統臨床醫囑部分小時內對表的訪問情況從上面的查詢得表
  
  表
  
 

  group_order_master( 醫囑套攴主記錄) group_order_item(醫囑套攴明細) 表的行數比較少不適合分區drug_stock(藥品庫存)雖然存取頻率比較高但表的行數比較少因此也不適合分區我們選擇表的行數比較多存取頻率比較高的表作分區處理如 doctor_ordersordersorders_costs考慮到doctor_orders是醫生工作站上醫生開的醫囑orders是由doctor_orders生成護士工作站上執行的醫囑兩個表結構類似而醫囑與藥品衛生材料計費聯系比較密切的是Orders因此重點介紹對表orders的處理
  
  基於列值選擇分區鍵
  
  使用Sql*plus下用命令Analyze收集末分區表的統計信息按照Oracle推薦的取樣%進行分析並將統計結果保存在數據字典中
  
  Analyze table ORDADMORDERS estimate statistics
  sample percent;
  
  對DBA_TAB_COLUMNS數據字典視圖進行查詢
  
  產生表
  
  select table_namecolumn_namenum_distinct
  from DBA_TAB_COLUMNS
  where owner like ORDADM;
  
  表
  
 

  從表我們可以看到欲分區表的各個候選分區鍵的分布頻譜ORDER_CODE(醫囑代碼)鍵值沒有出現一種均勻分布用它作分區鍵明顯不合適
  
  ORDER_CLASS(醫囑類別代碼)ORDERING_DEPT(開醫囑科室代碼)鍵值出現均勻分布如用它的各個鍵值作基於范圍的分區每個分區具有的記錄數比較均勻但這種方法對於每天增加上萬條記錄的表來看顯然不是最優的如果選用START_DATE_TIME(醫囑開始時間)建立范圍分區每月的數據建立一個分區在每個分區內基於ORDERING_DEPT建立散列子分區每月的數據形成一個組合分區會使每個分區的記錄數分布均勻查詢速度提高易於備份和刪除因為大多數的統計和查詢是在一個月的范圍內而且從實際的查詢效果看跨月和跨年數據的統計和查詢速度也比未分區的時候大大縮短效果非常明顯
  
  二 分區表的定義
  
  Create Table orders (
  PATIENT_ID varchar() not null ORDER_NO number() ORDER_SUB_NO number()
  
  ORDER_CLASS char()
  ORDER_TEXT varchar()
  ORDER_CODE varchar()
  
  START_DATE_TIME date
  STOP_DATE_TIME date
  
  ORDERING_DEPT varchar()
  storage (initial M next M)
  PARTITION BY RANGE(START_DATE_TIME)
  SUBPARTITION BY HASH(ORDER_CODE)
  SUBPARTITIONS STORE IN (ordersub ordersub ordersub )
  (PARTITION orders VALUES LESS THAN (to_date( :: yyyymmdd hh:mi:ss))
  tablespace Tsp_Orders
  PARTITION orders
  VALUES LESS THAN (to_date( :: yyyymmdd hh:mi:ss))
  tablespace Tsp_Orders
  PARTITION orders
  VALUES LESS THAN (to_date( :: yyyymmdd hh:mi:ss))
  tablespace Tsp_Orders
  
  PARTITION orders
  VALUES LESS THAN (to_date( :: yyyymmdd hh:mi:ss))
  tablespace Tsp_Orders
  (SUBPARTITION ordersub TABLESPACE Tsp_Orders SUBPARTITION ordersub TABLESPACE Tsp_Orders
  SUBPARTITION ordersub TABLESPACE Tsp_Orders));
  
  在建立的Orders表中按每月一個分區月開始月止個分區 PARTITION BY RANGE(START_DATE_TIME) 子句表示用表的START_DATE_TIME屬性建立范圍分區具體的每個分區名時間范圍在PARTITION子句定義SUBPARTITION BY HASH(ORDER_CODE)子句表示用表的ORDER_CODE 屬性在每個分區下建立散列子分區具體的每個子分區名所在表空間在UBPARTITION子句定義
  
  用下面ALTER TABLE數據定義語句為Orders建立約束和索引
  
  ALTER TABLE Orders ADD CONSTRAINT Pk_Orders KEY (Patient_id
  Visit_idOrder_noOrder_sub_no) USING INDEX PCTFREE TABLESPACE Tsp_Orders;
  
  表是用select count(*) from orders partition (分區名)語句查詢出的名分區的記錄數
  
  表
  

  
  三 分區表的維護操作
  
  增添分區
  
  Alter Table orders Add partition orders
  Aalues less (to_date( ::yyyymmdd hh: mi:ss))
  Tablespace Tsp_Orders;
  
  刪除分區
  
  Alter Table table_name Drop Partition partition_name;
  
  裁斷分區:
  
  Alter Table table_name Truncate Partition partition_name Storage;
  
  Oracle數據表分區小知識
  
  為了簡化數據庫大表的管理O r a c l e 及以後版本推出了分區選項分區將表分離在若干不同的表空間上用分而
From:http://tw.wingwit.com/Article/program/Oracle/201311/18191.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.