分享
 
 
 

Oracle 数据表分区的策略

王朝oracle·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义, 本文的工作在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数据字典视图进行查询

产生表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中,我们可以看到欲分区表的各个候选分区键的分布频谱,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 、分区对用户透明,最终用户感觉不到分区的存在。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有