Oracle雖然是一個大型的DBMS,但如果不對記錄比較多的表進行處理,仍然發揮不了Oracle管理大型數據的強大功能,因此對某些表進行分區,具有如下優點:
分區表中每個分區可以在邏輯上認為是一個獨立的對象;
可以在一個表中的一個或多個分區上進行如刪除、移動、析分等維護操作,而不會影響其它分區,具有分區獨立性;
如果選擇合適的分區策略,會大大的加快數據的查詢速度。
一 找出需分區的表
本節描述通過統計分析出醫院His系統需分區的表,對需分區的表找出包括在你的分區鍵中的列(表的屬性),即選擇分區鍵。
1、基于訪問頻度找出需分區的表
Oracle8i允許訪問數據庫中的審核信息,借助于收集的審核信息,設計者能夠確定哪些表的數據是真正最頻繁訪問的,即找出那些表,需要進行分區。
打開審核:在作為SYS或SYSSTEM登錄到數據庫后,動行如下腳本,打開對象的審核功能。
set echo off feed off ver off pages 0 spool audon.sql select ’audit select on ’||owner||’.’||object_name||’ by access;’ from dba_objects where object_type in (’VIEW’,’TABLE’) and owner in (’ORDADM’); spool off set echo on feed on ver on |
這些代碼的運行將產生“audon.sql”的輸出文件,它包含下面清單中所示格式的語句
audit select on ORDADM.DOCTOR_ORDERS by access; audit select on ORDADM.GROUP_ORDER_ITEMS by access; audit select on ORDADM.GROUP_ORDER_MASTER by access; audit select on ORDADM.ORDERS by access; audit select on ORDADM.ORDERS_COSTS by access; audit select on ORDADM.ORDERS_SHEET_IMAGE by access; audit select on ORDADM.VITAL_SIGNS_REC by access; |
使用命令@audon.sql激活上述代碼以打開審核功能收集收集審核信息,建立一個表以保存概要信息:
create table aud_summary ( obj_name varchar2(30), owner varchar2(30), hits number); |
將審核信息從dba_audit_object表中取出并裝入概要表中:
insert into aud_summary select obj_name,owner,count(*) from dba_audit_object group by obj_name,owner; |
關閉審核:
set echo off feed off ver off pages 0 spool audoff.sql select ’noaudit select on ’||owner||’.’||object_name|| ’ by access;’ from dba_objects where object_type in (’VIEW’,’TABLE’) and owner in (’ORDADM’); spool off set echo on feed on ver on |
這些代碼的運行將產生“audoff.sql”的輸出文件。
使用命令@ audoff.sql激活上述代碼以關閉上述對象的審核功能。
清除審核信息:
delete sys.aud$ |
分析審核信息
col obj_name form a30 col owner form a20 col hits form 99,990 selec obj_name,owner,hits from aud_summary; OBJ_NAME OWNER COUNT(*) ----------- ------------- ---------- DOCTOR_ORDERS ORDADM 30309 DRUG_STOCK PHARMACY 11094 GROUP_ORDER_ITEMS ORDADM 1030 GROUP_ORDER_MASTER ORDADM 1196 ORDERS ORDADM 40421 ORDERS_COSTS ORDADM 10109 |
以上是HIS系統臨床醫囑部分24小時內對表的訪問情況,從上面的查詢得表1-1。
表1-1
表 | 行數 | 命中率 |
doctor_orders | 2052709 | 30309 |
drug_stock | 2511 | 11094 |
group_order_item | 3800 | 1030 |
group_order_master | 186 | 1196 |
orders | 1633010 | 40421 |
orders_costs | 2403214 | 10109 |
group_order_master( 醫囑套攴主記錄) 、group_order_item(醫囑套攴明細), 表的行數比較少,不適合分區;drug_stock(藥品庫存)雖然存取頻率比較高,但表的行數比較少,因此也不適合分區。我們選擇表的行數比較多、存取頻率比較高的表作分區處理,如 doctor_orders、orders、orders_costs,考慮到doctor_orders是醫生工作站上醫生開的醫囑,orders是由doctor_orders生成、護士工作站上執行的醫囑,兩個表結構類似,而醫囑與藥品、衛生材料、計費聯系比較密切的是Orders,因此重點介紹對表orders的處理。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/