Oracle数据表分区的策略

正在看的oracle教程是:oracle数据表分区的策略。
本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义, 本文的工作在oracle8.
1.6下实现。

  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的处理。

  2、基于列值选择分区键

  使用sql*plus下用命令analyze收集末分区表的统计信息,按照oracle推荐的取样20%进行分析,并将统计结果保存在数据字典中。

analyze table ordadm.orders estimate statistics

sample 20 percent;

  对dba_tab_columns数据字典视图进行查询

[nextpage]

产生表1-2

select table_name,column_name,num_distinct
from dba_tab_columns
where owner like ‘ordadm’;
  表1-2

列 不同的值 patient_id 28720 visit_id 2 order_no 395 order_sub_no 10 order_class 9 order_code 825 order_text 1551 ordering_dept 15 start_date_time 1194176 stop_date_time 636798    

  从表1-2中,我们可以看到欲分区表的各个候选分区键的

[1] [2] 下一页

正在看的oracle教程是:oracle数据表分区的策略。分布频谱,order_code(医嘱代码)键值没有出现一种均匀分布,用它作分区键,明显不合适;

  order_class(医嘱类别代码)、ordering_dept(开医嘱科室代码),键值出现均匀分布,如用它的各个键值作基于范围的分区,每个分区具有的记录数比较均匀,但这种方法对于每天增加上万条记录的表来看,显然不是最优的。如果选用start_date_time(医嘱开始时间)建立范围分区,每月的数据建立一个分区,在每个分区内基于ordering_dept建立散列子分区,每月的数据形成一个组合分区,会使每个分区的记录数分布均匀、查询速度提高、易于备份和删除。因为大多数的统计和查询是在一个月的范围内,而且从实际的查询效果看,跨月和跨年数据的统计和查询速度,也比未分区的时候大大缩短,效果非常明显。

    二 分区表的定义

create table orders (
 patient_id varchar2(10) not null, order_no number(4), order_sub_no number(2),
 …………..
 order_class char(1),
 order_text varchar2(80),
 order_code varchar2(10),
 ………….
 start_date_time date
 stop_date_time date
 ……………..
 ordering_dept varchar2(8)
 storage (initial 100m next 1m)
 partition by range(start_date_time)
 subpartition by hash(order_code)
 subpartitions 3 store in (ordersub1, ordersub 2, ordersub 3)
 (partition orders200212 values less than (to_date(‘2003-01-01 00:00: 00’,’yyyy-mm-dd hh24:mi:ss’))
 tablespace tsp_orders,
 partition orders200301
 values less than (to_date(‘2003-02-01 00:00: 00’,’yyyy-mm-dd hh24:mi:ss’))
 tablespace tsp_orders,,
 partition orders 200302
 values less than (to_date(‘2003-03-01 00:00: 00’,’yyyy-mm-dd hh24:mi:ss’))
 tablespace tsp_orders,,
 …………………
 partition orders200402
 values less than (to_date(‘2004-03-01 00:00: 00’,’yyyy-mm-dd hh24:mi:ss’))
 tablespace tsp_orders
 (subpartition ordersub1 tablespace tsp_orders, subpartition ordersub 2 tablespace tsp_orders,
subpartition ordersub3 tablespace tsp_orders));
  在建立的orders表中,按每月一个分区,从2002年12月开始,2004年02月止,共15个分区, 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_id,order_no,order_sub_no) using index pctfree 5 tablespace tsp_orders;
  表1-3是用select count(*) from orders partition (分区名)语句,查询出的名分区的记录数。

  表1-3

分区名 记录数 orders200301 87311 orders2200302 87553 orders2200303 107533 …………   orders200401 124812
  三 分区表的维护操作

  增添分区:

alter table orders add partition orders200403
aalues less (to_date(‘2004-04-01 00:00:00’,’yyyy-mm-dd hh24: 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 8 及以后版本推出了分区选项。分区将表分离在若干不同的表空间上,用分而治之的方法来支撑无限膨胀的大表,给大表在物理一级的可管理性。将大表分割成较小的分区可以改善表的维护、备份、恢复、事务及查询性能。针对当前社保及电信行业的大量日常业务数据, 可以推荐使用oracle8 的该选项。

  分区的优点:

  1 、增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍然可以使用;

  2 、减少关闭时间:如果系统故障只影响表的一部分分区,那么只有这部分分区需要修复,故能比整个大表修复花的时间更少;

  3 、维护轻松:如果需要重建表,独立管理每个分区比管理单个大表要轻松得多;

  4 、均衡i / o : 可以把表的不同分区分配到不同的磁盘来平衡i / o 改善性能;

  5 、改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快;

  6 、分区对用户透明,最终用户感觉不到分区的存在。

上一页    

上一页  [1] [2] 

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐