`
frank1998819
  • 浏览: 758412 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

Oracle11新特性——分区表功能增强 (转)

 
阅读更多

oracle11g分区表功能有所加强,新增了虚拟列分区、系统分区、INTERVAL分区,参考分区等功能。组合分区中新增了4种组合分区RANGE-RANGE、LIST-RANGE、LIST-HASH和LIST-LIST。下面一一介绍:
一:RANGE-RANGE
建表示例:
CREATE TABLE TEST_RANGE_RANGE (vl1 date,vl2 number(12))
PARTITION BY RANGE (vl1)
SUBPARTITION BY RANGE (vl2)
(
   PARTITION P1 VALUES LESS THAN (TO_DATE('2011-9-1', 'YYYY-MM-DD'))
   (
      SUBPARTITION P1_1 VALUES LESS THAN (100000),
      SUBPARTITION P1_2 VALUES LESS THAN (200000),
      SUBPARTITION P1_3 VALUES LESS THAN (MAXVALUE)
   ),
   PARTITION P2 VALUES LESS THAN (TO_DATE('2011-10-1', 'YYYY-MM-DD'))
   (
    SUBPARTITION P2_1 VALUES LESS THAN (100000),
    SUBPARTITION P2_2 VALUES LESS THAN (200000),
    SUBPARTITION P2_3 VALUES LESS THAN (MAXVALUE)
   ),
   PARTITION P3 VALUES LESS THAN (MAXVALUE)
   (
    SUBPARTITION P3_1 VALUES LESS THAN (100000),
    SUBPARTITION P3_2 VALUES LESS THAN (200000),
    SUBPARTITION P3_3 VALUES LESS THAN (MAXVALUE)
   )
);

二:LIST-RANGE
建表示例:
CREATE TABLE TEST_LIST_RANGE (vl1 varchar2(20),vl2 number(12))
PARTITION BY LIST (vl1)
SUBPARTITION BY RANGE (vl2)
(
   PARTITION P1 VALUES ('MIN', 'HOUR','SECOND')
   (
      SUBPARTITION P1_1 VALUES LESS THAN (100000),
      SUBPARTITION P1_2 VALUES LESS THAN (200000),
      SUBPARTITION P1_3 VALUES LESS THAN (MAXVALUE)
   ),
   PARTITION P2 VALUES ('DAY', 'MONTH','YEAR')
   (
    SUBPARTITION P2_1 VALUES LESS THAN (100000),
    SUBPARTITION P2_2 VALUES LESS THAN (200000),
    SUBPARTITION P2_3 VALUES LESS THAN (MAXVALUE)
   ),
   PARTITION P3 VALUES (DEFAULT)
   (
    SUBPARTITION P3_1 VALUES LESS THAN (100000),
    SUBPARTITION P3_2 VALUES LESS THAN (200000),
    SUBPARTITION P3_3 VALUES LESS THAN (MAXVALUE)
   )
);


三:LIST-HASH
建表示例:
CREATE TABLE TEST_LIST_HASH (vl1 varchar2(20),vl2 number(12))
PARTITION BY LIST (vl1)
SUBPARTITION BY HASH (vl2)
SUBPARTITION TEMPLATE
  (
   SUBPARTITION SP1,
   SUBPARTITION SP2,
   SUBPARTITION SP3,
   SUBPARTITION SP4
  )
  (
   PARTITION P1 VALUES ('MIN', 'HOUR','SECOND'),
   PARTITION P2 VALUES ('DAY', 'MONTH','YEAR'),
   PARTITION P3 VALUES (DEFAULT)
  )
;

四:LIST-LIST
建表示例:
CREATE TABLE TEST_LIST_LIST (vl1 varchar2(20),vl2 number(12))
PARTITION BY LIST (vl1)
SUBPARTITION BY LIST (vl2)
(
   PARTITION P1 VALUES ('MIN', 'HOUR','SECOND')
   (
      SUBPARTITION P1_1 VALUES  (1,2,3,4,5),
      SUBPARTITION P1_2 VALUES  (6,7,8,9),
      SUBPARTITION P1_3 VALUES  (DEFAULT)
   ),
   PARTITION P2 VALUES ('DAY', 'MONTH','YEAR')
   (
    SUBPARTITION P2_1 VALUES  (1,2,3,4,5),
    SUBPARTITION P2_2 VALUES  (6,7,8,9),
    SUBPARTITION P2_3 VALUES (DEFAULT)
   ),
   PARTITION P3 VALUES (DEFAULT)
   (
    SUBPARTITION P3_1 VALUES (1,2,3,4,5),
    SUBPARTITION P3_2 VALUES (6,7,8,9),
    SUBPARTITION P3_3 VALUES (DEFAULT)
   )
);

五:虚拟列分区
Oracle11g新增了虚拟列功能,虚拟列的值从其他的列推导而来,Oracle只保存源数据,这个列不占存储空间。虚拟列其中一个引申功能就是虚拟列分区功能。11g增加对虚拟列的支持,这使得分区功能更加灵活。
一个之前遇到过的普遍的例子,表中有一个日期列,希望根据日期列进行分区,每个月份一个分区,总共12个分区,不管是哪一年的,只要是那个月,就放在那个月的分区中。具体例子如下:
CREATE TABLE T_PARTITION_MONTH
  (
   ID NUMBER,
   NAME VARCHAR2(30),
   CREATE_DATE DATE,
   PARTITION_MONTH AS (TO_NUMBER(TO_CHAR(CREATE_DATE, 'MM')))
  )
  PARTITION BY LIST (PARTITION_MONTH)
  (
   PARTITION P1 VALUES (1),
   PARTITION P2 VALUES (2),
   PARTITION P3 VALUES (3),
   PARTITION P4 VALUES (4),
   PARTITION P5 VALUES (5),
   PARTITION P6 VALUES (6),
   PARTITION P7 VALUES (7),
   PARTITION P8 VALUES (8),
   PARTITION P9 VALUES (9),
   PARTITION P10 VALUES (10),
   PARTITION P11 VALUES (11),
   PARTITION P12 VALUES (12)
  );


六:系统分区
11g以前的分区表,需要指定一个或多个分区字段,并根据这个分区字段的值,按照一定的算法(RANGE、HASH和 LIST)来决定一条记录属于那个分区。从11g开始,Oracle允许用户不指定分区列,完全根据程序来控制数据存储在那个分区中。这就是11g提供的 系统分区功能。在以前,确定了分区列和分区方式,那么一条数据属于哪个分区也就被确定下来。而对于系统分区而言,分区是分区,数据是数据,二者没有对应的 关系。数据可以被放在任意一个分区中,这不是由数据本身决定的,而是应用程序在插入时确定的。
建表示例:
CREATE TABLE T_SYSTEM
    (ID NUMBER, NAME VARCHAR2(30))
    PARTITION BY SYSTEM
    (PARTITION P1, PARTITION P2, PARTITION P3, PARTITION P4);
这里需要注意的是在插入时必须指定分区
SQL> INSERT INTO T_SYSTEM VALUES (1, 'ABC');
 
INSERT INTO T_SYSTEM VALUES (1, 'ABC')
 
ORA-14701: 对于按“系统”方法进行分区的表, 必须对 DML 使用分区扩展名或绑定变量

SQL>  INSERT INTO T_SYSTEM PARTITION (P1) VALUES (1, 'ABC');
 
1 row inserted
 
SQL>  INSERT INTO T_SYSTEM PARTITION (P2) VALUES (1, 'ABC');
 
1 row inserted

从上面可以看到,对于SYSTEM分区方式,完全相同的数据也可以插入到两个不同的分区中。数据和分区没有任何关系。对于系统分区表可以使用绝大部 分分区维护功能,除了ALTER TABLE SPLIT PARTITION功能。因为没有分区列,Oracle无法将分区中的数据分配到两个新的分区中。同样的道理,采用了系统分区的分区表是不能通过 CREATE TABLE AS SELECT方式创建的。而且,由于没有分区列,因此无法创建唯一的LOCAL索引。系统分区方式继承了分区带来的可用性和易维护性的好处,但是分区消除 对于系统分区是无效的。由于不清楚数据存放在那个分区,因此对于系统分区中数据的查找需要在所有分区中进行。系统分区要求INSERT语句必须包括分区描 述语句,SELECT、UPDATE和DELETE语句则不需要。如果考虑到分区消除对系统分区无效,那么如果了解数据存储在哪个分区中,最好在DML的 时候指定分区,这样可以提供查询的性能,避免全表扫描的产生。

七:INTERVAL分区
这个其实是范围分区的增强功能,通过这个功能可以实现在需要的时候自动的实现新的分区的添加,从而省去了你不断的ADD或者SPLIT新的分区。
建表示例:
CREATE TABLE TEST_INTERVAL(VL1 DATE,VL2 NUMBER(12))
  PARTITION BY RANGE (VL1)
  INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
  (PARTITION P1 VALUES LESS THAN (TO_DATE('2011-9-1', 'YYYY-MM-DD')));
这个时候查看表结构只有这一个分区,但是我们往里面插入一个9月和10月的数据
insert into TEST_INTERVAL values (sysdate,1);
commit;
insert into TEST_INTERVAL values (sysdate-20,1);
commit;
再查看表的结构
-- Create table
create table TEST_INTERVAL
(
  VL1 DATE,
  VL2 NUMBER(12)
)
partition by range (VL1)
(
  partition P1 values less than (TO_DATE(' 2011-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBSDATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P22 values less than (TO_DATE(' 2011-10-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBSDATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    ),
  partition SYS_P21 values less than (TO_DATE(' 2011-11-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace TBSDATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
      initial 64K
      next 1M
      minextents 1
      maxextents unlimited
    )
);

由此可见,系统自动实现了add和split分区的功能。
下面一个数字范围的:
CREATE TABLE TEST_INTERVAL_NUM(VL1 DATE,VL2 NUMBER(12))
  PARTITION BY RANGE (VL2)
  INTERVAL (100000)
  (PARTITION P1 VALUES LESS THAN (100000));

但是这个还是有局限的,要求所有的表空间都是一致的才行,不能给单独的分区指定单独的表空间。这个玩意的用处不好说大不大。 


八:参考分区
参考分区功能,对于主子表关系,如果对主表进行了分区,那么可以在子表上根据外键约束来建立对应主表的分区。这样主表和 子表采用相同的等同分区方式,不但连接的时候可以利用PARTITION-WISE JOIN,而且对于主子表的分区操作也会十分方便。而且,这种方式并不需要在子表中存在主表的分区列。
(以上的话是抄来的,就我个人而言,我觉得这个有点复杂了,还是能不用就不用的好)
示例(也是直接抄得了):
建主表
CREATE TABLE T_PRIMARY
  (
   OWNER,
   TABLE_NAME,
   TABLESPACE_NAME,
   STATUS,
   CONSTRAINT PK_T_PRIMARY PRIMARY KEY (OWNER, TABLE_NAME)
  )
  PARTITION BY LIST (TABLESPACE_NAME)
  (
   PARTITION P1 VALUES ('SYSTEM'),
   PARTITION P2 VALUES ('YUZH'),
   PARTITION P3 VALUES ('SYSAUX'),
   PARTITION P4 VALUES (DEFAULT)
  )
 AS SELECT OWNER, TABLE_NAME, TABLESPACE_NAME, STATUS FROM DBA_TABLES;
建外键关联表:
CREATE TABLE T_FOREIGN
  (
   OWNER VARCHAR2(30) NOT NULL,
   TABLE_NAME VARCHAR2(30) NOT NULL,
   PARTITION_NAME VARCHAR2(30),
   SUBPARTITION_NAME VARCHAR2(30),
   NUM_ROWS NUMBER,
   BLOCKS NUMBER,
   CONSTRAINT FK_T_FOREIGN FOREIGN KEY (OWNER, TABLE_NAME)
   REFERENCES T_PRIMARY (OWNER, TABLE_NAME)
   )
  PARTITION BY REFERENCE (FK_T_FOREIGN);

查看分区状况:
SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME IN ('T_PRIMARY', 'T_FOREIGN')  ORDER BY 1, 2;
 
TABLE_NAME                     PARTITION_NAME                 HIGH_VALUE
------------------------------ ------------------------------ -------------------
T_FOREIGN                      P1                            
T_FOREIGN                      P2                            
T_FOREIGN                      P3                            
T_FOREIGN                      P4                            
T_PRIMARY                      P1                             'SYSTEM'
T_PRIMARY                      P2                             'YUZH'
T_PRIMARY                      P3                             'SYSAUX'
T_PRIMARY                      P4                             DEFAULT
 
8 rows selected

分享到:
评论

相关推荐

    oracle10g的分区功能

    Oracle 10g 提供了一系列 SQL 命令用于管理和维护分区表: - **添加新分区**:随着数据的增长,可以轻松地向表中添加新的分区。 - **删除分区**:当不再需要某些旧数据时,可以安全地删除对应的分区。 - **分拆分区...

    Oracle_11g_面向DBA的新功能学习指南 less09

    ### Oracle 11g 面向DBA的新功能学习指南——分区技术详解 #### 一、Oracle 分区概述 Oracle 11g 引入了一系列面向数据库管理员(DBA)的新功能,旨在优化大型数据库的管理和性能。其中,分区功能尤为突出。分区是一...

    Oracle11g:面向_DBA_和开发人员的重要新特性

    - **新特性**:Oracle 11g引入了参考分区(reference partitioning)、区间分区(interval partitioning)和虚拟列分区(virtual column partitioning),以及增强了子分区(subpartitioning)功能。 - **好处**:这些新特性...

    Oracle 实用教材———web版

    10. 高级特性:如物化视图、分区表、物质化子查询等。 通过这个教材,初学者不仅可以掌握Oracle 9i的基础知识,还能深入了解如何在Web环境中部署和管理数据库,为未来的职业生涯打下坚实的基础。无论是数据库管理员...

    《Oracle 11g从入门到精通》PDF版本下载.txt

    - **新特性介绍**:Oracle 11g相比之前的版本,在性能、可用性、安全性等方面进行了诸多改进和增强,如Real Application Clusters (RAC) 的改进、Data Guard技术的增强等。 ### 2. 安装与配置 - **系统要求**:...

    Oracle Database 12c 数据库100个新特性与案例总结V2.0

    根据提供的文档信息,我们可以深入探讨Oracle Database 12c中的一些关键新特性和案例总结。以下是对部分提及的新特性的详细解析: ### 1. Oracle Pluggable Database #### 1.1 可插拔数据库概述 - **定义**:在...

    Oracle 11g 从入门到精通——第十章(视频教程)

    本教程主要聚焦于数据库的进阶概念,通过四个视频教程帮助学习者深入理解Oracle 11g的关键特性。以下是对每个视频内容的详细解读: 1. **视图对象**: 视图是数据库中的虚拟表,它不实际存储数据,而是基于一个或...

    Oracle Database 11g OLTP压缩总结

    Oracle Database 11g Release 1 (11gR1) 引入了一项重要的新特性——OLTP(Online Transaction Processing)表压缩。这一功能允许数据库在执行常规的数据维护操作,如INSERT和UPDATE时自动对数据进行压缩,这不仅...

    oracle经典书籍(Oracle 9i初学者指南.zip、Oracle专家高级编程.pdf、Effective+Oracle+by+Design.pdf)

    内容可能包括索引策略,数据模型设计,查询优化,以及如何利用Oracle的特性如分区,物化视图等来提升系统效率。 这三本书籍的组合涵盖了从基础到高级,从编程到设计的全面Oracle知识体系,无论你是Oracle新手还是有...

    oracle数据仓库解决方案

    1. **Oracle8i的数据仓库新特性**:引入了许多针对数据仓库场景优化的新特性,比如增强的查询处理技术和高级SQL优化器等。 2. **Oracle OLAP产品的新发展**:提供了强大的在线分析处理(OLAP)能力,支持多维数据分析...

    Oracle数据仓库解决方案

    - **Oracle8i的数据仓库新特性**:如高级SQL优化器、资源管理、分区表等,这些新特性大大提升了数据处理的速度和效率。 - **Oracle OLAP产品的新发展**:Oracle提供了先进的在线分析处理(OLAP)工具,如Oracle ...

    Oracle数据仓库解决方案.docx

    - **Oracle8i的数据仓库新特性**:Oracle8i版本引入了许多针对数据仓库的新特性,如丰富的查询处理技术、高级SQL优化器等,这些特性显著提高了数据仓库的性能和可用性。 - **Oracle OLAP产品的新发展**:Oracle ...

    《数据库系统原理与应用——Oracle版》-电子教案.rar

    5. Oracle数据库特性:讲解Oracle数据库特有的功能,如PL/SQL编程、存储过程、触发器、索引、视图、游标、事务处理、备份与恢复、性能优化等。 6. 数据库安全性:讨论如何保护数据库免受未授权访问,包括用户权限...

    数据仓库,Oracle数据仓库解决方案。

    - **分区表与索引**:提高大型表的查询效率。 - **摘要管理**:支持预计算汇总数据,加快查询速度。 - **透明的表空间**:简化数据库管理。 - **直接的路径装载API**:加速数据导入过程。 - **数据仓库的增强...

    Oracle Database 9i/10g/11g Programming Techniques and Solutions

    - Oracle 9i:引入了新的功能,如XML支持、分区功能增强等。 - Oracle 10g:强调了网格计算和自动管理能力,提高了可用性和性能。 - Oracle 11g:重点放在提高数据完整性、简化管理以及增强安全性上。 2. **...

    21天学通oracle

    - **表空间与数据文件**:了解Oracle数据库中如何组织存储数据的物理结构,包括表空间的概念及其组成元素——数据文件。 - **段与区**:进一步探讨Oracle数据库中逻辑存储单元——段和区的作用及管理方法。 ### ...

Global site tag (gtag.js) - Google Analytics