zoukankan      html  css  js  c++  java
  • Oracle 表分区介绍与使用

    什么是表分区

      分区表是将大表的数据分成称为分区的许多小的子集,类型有FAT32,NTFST32,NTFS。另外,分区表的种类划分主要有:range,list,和hash分区。划分依据主要是根据其表内部属性。同时,分区表可以创建其独特的分区索引。倘若硬盘丢失了分区表,数据就无法按顺序读取和写入,导致无法操作。

    为什么要使用表分区以及什么情况下使用

    当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

    使用情况:

    1、表的大小超过2GB。
    2、表中包含历史数据,新的数据被增加都新的分区中。

    优点:

    1)   改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

    2)   增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

    3)   维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

    4)   均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。

    缺点:

    分区表相关,已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。

    表分区主要实现方式

    1.范围分区。2.列表分区。3.哈希分区。4.组合分区。

    1.范围分区。

      范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。

      当使用范围分区时,请考虑以下几个规则:
    1、每一个分区都必须有一个VALUES LESS THEN子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
    2、所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
    3、在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的VALUE LESS THEN的值,同时包括空值。
     
    --按值大小分区
    CREATE TABLE part_andy1
        (
            andy_ID NUMBER NOT NULL PRIMARY KEY,
            FIRST_NAME  VARCHAR2(30) NOT NULL,
            LAST_NAME   VARCHAR2(30) NOT NULL,
            PHONE        VARCHAR2(15) NOT NULL,
           EMAIL        VARCHAR2(80),
            STATUS       CHAR(1)
        )
       PARTITION BY RANGE (andy_ID)
       (
           PARTITION PART1 VALUES LESS THAN (10000) ,
           PARTITION PART2 VALUES LESS THAN (20000)
       );

    --按照时间分区

     CREATE TABLE part_andy2
        (
        ORDER_ID      NUMBER(7) NOT NULL,
        ORDER_DATE    DATE,
        OTAL_AMOUNT NUMBER,
        CUSTOTMER_ID NUMBER(7),
        PAID           CHAR(1)
        )
        PARTITION BY RANGE (ORDER_DATE)
       (
         PARTITION p1 VALUES LESS THAN (TO_DATE('2014-10-1', 'yyyy-mm-dd')) ,
         PARTITION p2 VALUES LESS THAN (TO_DATE('2015-10-1', 'yyyy-mm-dd')) ,
         PARTITION p3 VALUES LESS THAN (TO_DATE('2016-10-1', 'yyyy-mm-dd')) ,
         partition p4 values less than (maxvalue)
       );

    2.列表分区。

    概念:
    List分区也需要指定列的值,其分区值必须明确指定,该分区列只能有一个,不能像range或者hash分区那样同时指定多个列做为分区依赖列,但它的单个分区对应值可以是多个。
    注意:
    在分区时必须确定分区列可能存在的值,一旦插入的列值不在分区范围内,则插入/更新就会失败,因此通常建议使用list分区时,要创建一个default分区存储那些不在指定范围内的记录,类似range分区中的maxvalue分区。

    CREATE TABLE PROBLEM_TICKETS
    (
        PROBLEM_ID   NUMBER(7) NOT NULL PRIMARY KEY,
        DESCRIPTION  VARCHAR2(2000),
        CUSTOMER_ID  NUMBER(7) NOT NULL,
        DATE_ENTERED DATE NOT NULL,
        STATUS       VARCHAR2(20)
    )
    PARTITION BY LIST (STATUS)
    (
          PARTITION PROB_ACTIVE   VALUES ('ACTIVE') TABLESPACE PROB_TS01,
          PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02

    3.哈希分区。

    概念:
    对于那些无法有效划分范围的表,可以使用hash分区,这样对于提高性能还是会有一定的帮助。hash分区会将表中的数据平均分配到你指定的几个分区中,列所在分区是依据分区列的hash值自动分配,因此你并不能控制也不知道哪条记录会被放到哪个分区中,hash分区也可以支持多个依赖列。
    注意:
    hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,Oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

    CREATE TABLE HASH_TABLE
    (
      COL NUMBER(8),
      INF VARCHAR2(100)
    )
    PARTITION BY HASH (COL)
    (
      PARTITION PART01 TABLESPACE HASH_TS01,
      PARTITION PART02 TABLESPACE HASH_TS02,
      PARTITION PART03 TABLESPACE HASH_TS03
    )

    4.组合分区。

    Oracle10g提供两种分区组合
    – Range-hash

    create table dinya_test
     (
     transaction_id number primary key,
     item_id number(8) not null,
     item_description varchar2(300),
     transaction_date date
     )
     partition by range(transaction_date)subpartition by hash(transaction_id)  subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
     (
         partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),
         partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),
         partition part_03 values less than(maxvalue)
     );

    – Range-list

    CREATE TABLE SALES
    (
    
    PRODUCT_ID VARCHAR2(5),
    
    SALES_DATE DATE,
    
    SALES_COST NUMBER(10),
    
    STATUS VARCHAR2(20)
    
    )
    
    PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
    
    (
    
       PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009
              (
                  SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
                  SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
              ),
       PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009
              (
                  SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
                  SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
              )
    )
  • 相关阅读:
    C# Socket TcpClient 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。
    C#编程使用Managed Wifi API连接无线SSID
    中国最精确的电子地图,可以找到你家哦
    利用mysql数据库中的TMD表修复“is marked as crashed and last (automatic?) repair failed”的错误 Database query error
    Google Directions API 中路线编码解析
    c语言 nmealib-0.5.3 学习 简单代码 ,供参考
    【转】IT管理人才必备的十大能力
    【转】10个让人受益的管理原理
    【转】耐心看
    【转】对于移动APP测试的一个小技巧
  • 原文地址:https://www.cnblogs.com/lidedong/p/9759039.html
Copyright © 2011-2022 走看看