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)

相关推荐

  • Mysql数据表分区技术PARTITION浅析

    在这一章节里, 我们来了解下 Mysql 中的分区技术 (RANGE, LIST, HASH)   Mysql 的分区技术与水平分表有点类似, 但是它是在逻辑层进行的水平分表, 对于应用而言它还是一张表, 换句话说: 分区不是实际真正的对一张表进行拆分,分区之后表还是一个表,它是把存储文件进行拆分. 在 Mysql 5.1(后) 有了几种分区类型:   RANGE分区: 基于属于一个给定连续区间的列值, 把多行分配给分区 LIST分区: 类似于按 RANGE 分区, 区别在于 LIST 分区是基

  • 创建mysql表分区的方法

    表分区是最近才知道的哦 ,以前自己做都是分表来实现上亿级别的数据了,下面我来给大家介绍一下mysql表分区创建与使用吧,希望对各位同学会有所帮助.表分区的测试使用,主要内容来自于其他博客文章以及mysql5.1的参考手册mysql测试版本:mysql5.5.28mysql物理存储文件(有mysql配置的datadir决定存储路径)格式简介数据库engine为MYISAM frm表结构文件,myd表数据文件,myi表索引文件.INNODB engine对应的表物理存储文件innodb的数据库的物理

  • mysql中如何判断是否支持分区

    mysql可以通过下面语句判断是否支持分区: SHOW VARIABLES LIKE '%partition%'; 如果输出: have_partitioning   YES 表示支持分区. 或者通过: SHOW PLUGINS; 显示所有插件,如果有partition ACTIVE STORAGE ENGINE GPL 插件则表明支持分区 ps:什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例.mysql数据库中的数据是以文件的形势存

  • mysql的分区技术详细介绍

    一.概述 当 MySQL的总记录数超过了100万后,会出现性能的大幅度下降吗?答案是肯定的,但是,性能下降>的比率不一而同,要看系统的架构.应用程序.还有>包括索引.服务器硬件等多种因素而定.当有网友问我这个问题的时候,我最常见的回答>就是:分表,可以根据id区间或者时间先后顺序等多种规则来分表.分表很容易,然而由此所带来的应用程序甚至是架构方面的改动工作却不>容小觑,还包括将来的扩展性等. 在以前,一种解决方案就是使用 MERGE 类型,这是一个非常方便的做饭.架构和程序基本上不

  • MySQL的表分区详解

    一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区.当然也可根据其他的条件分区. 二.为什么要对表进行分区为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率.分区的一些优点包括:      1).与单个磁盘或文件系统分区相比,可以存储更多的数据.      2).对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的

  • ORACLE 分区表的设计

    分区表的概念 分区致力于解决支持极大表和索引的关键问题.它采用他们分解成较小和易于管理的称为分区的片(piece)的方法.一旦分区被定义,SQL语句就可以访问的操作某一个分区而不是整个表,因而提高管理的效率.分区对于数据仓库应用程序非常有效,因为他们常常存储和分析巨量的历史数据. 分区表的分类 Range partitioning(范围分区) Hash partitioning(哈希分区) List partitioning(列表分区) Composite range-hash partitio

  • Oracle10个分区和Mysql分区区别详解

    Oracle10g分区常用的是:range(范围分区).list(列表分区).hash(哈希分区).range-hash(范围-哈希分区).range-list(列表-复合分区). Range分区:Range分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分区的划分条件,将记录存放到列值所在的range分区中. 如按照时间划分,2010年1月的数据放到a分区,2月的数据放到b分区,在创建的时候,需要指定基于的列,以及分区的范围值. 在按时间分区时,如果某些记录暂无法预测范围,可以创建m

  • MySql数据分区操作之新增分区操作

    如果想在已经建好的表上进行分区,如果使用alter添加分区的话,mysql会提示错误: 复制代码 代码如下: ERROR 1505 <HY000> Partition management on a not partitioned table is not possible 正确的方法是新建一个具有分区的表,结构一致,然后用insert into 分区表 select * from 原始表; 测试创建分区表文件 复制代码 代码如下: CREATE TABLE tr (id INT, name

  • oracle存储过程创建表分区实例

    用存储过程创建数据表:创建时注意必须添加authid current_user,如果创建的表已存在,存储过程继续执行,但如不不加此关键语句,存储过程将出现异常,这个语句相当于赋权限.例1创建语句如下: 复制代码 代码如下: create or replaceprocedure sp_create_mnl(i_id varchar2) authid current_user  as   /********************************* 名称:sp_create_mnl 功能描述

  • Oracle 数据表分区的策略

    正在看的ORACLE教程是:Oracle 数据表分区的策略.本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义, 本文的工作在Oracle8.1.6下实现. Oracle虽然是一个大型的DBMS,但如果不对记录比较多的表进行处理,仍然发挥不了Oracle管理大型数据的强大功能,因此对某些表进行分区,具有如下优点: 分区表中每个分区可以在逻辑上认为是一个独立的对象: 可以在一个表中的一个或多个分区上进行如删除.

  • mysql使用教程之分区表的使用方法(删除分区表)

    MySQL使用分区表的好处: 1,可以把一些归类的数据放在一个分区中,可以减少服务器检查数据的数量加快查询.2,方便维护,通过删除分区来删除老的数据.3,分区数据可以被分布到不同的物理位置,可以做分布式有效利用多个硬盘驱动器. MySQL可以建立四种分区类型的分区: RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择.  www.jb51.net HASH分区:基于用户

  • oracle分区表之hash分区表的使用及扩展

    Hash分区是通过对分区键运用Hash算法从而决定数据的分区归属.使用Hash分区有什么优点呢? 常用的分区表所具有的优点:如提高数据可用行,减少管理负担,改善语句性能等优点,hash分区同样拥有.此外,由于Hash分区表是按分区键的hash计算结果来决定其分区的,而特定的分区键其hash值是固定的,也就是说Hash分区表的数据是按分区键值来聚集的,同样的分区键肯定在同一分区.比如,在证券行业,我们经常查询某一只股票的K线,假设表的结构如下: 复制代码 代码如下: create table eq

  • oracle表空间表分区详解及oracle表分区查询使用方法

    此文从以下几个方面来整理关于分区表的概念及操作:1.表空间及分区表的概念2.表分区的具体作用3.表分区的优缺点4.表分区的几种类型及操作方法5.对表分区的维护性操作.(1.) 表空间及分区表的概念表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间. 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间

随机推荐