正在看的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中,我们可以看到欲分区表的各个候选分区键的
二 分区表的定义
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 、分区对用户透明,最终用户感觉不到分区的存在。
</p><p align='center'><b><a href='/shujuku/ORACLE/shujuku_2081.html'>上一页</a><a href='/shujuku/ORACLE/shujuku_2081.html'>[1]</a>[2]</b></p>