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的处理。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/