zoukankan      html  css  js  c++  java
  • Oracle 分区表创建

    分区分类

    - 字段范围分区 range `Oracle 8`
    - 哈希分区 hash `Oracle 8i`
    - 组合分区 range-hash,range-list ... `Oracle 9i`
    - 列表分区 list `Oracle 9i`
    - 间隔分区 interval `Oracle 11g`
    - 系统分区 System `Oracle 11g`
    - 引用分区 Reference `Oracle 11g`
     
     
     字段范围 range 
    
    - NUMBER类型字段
    
    
    CREATE TABLE emp (
       empno NUMBER(4), 
       ename VARCHAR2(30), 
       sal   NUMBER
    ) 
    PARTITION BY RANGE(empno) (
      partition e1 values less than (1000)     tablespace ts1, 
      partition e2 values less than (2000)     tablespace ts2, 
      partition e3 values less than (MAXVALUE) tablespace ts3
    ); 
    
    
    - VARCHAR2类型字段
    
    
    CREATE TABLE emp
    ( id        NUMBER(5)    PRIMARY KEY,
      name      VARCHAR2(50) NOT NULL,
      phone     VARCHAR2(15),
      email     VARCHAR2(100) )
    PARTITION BY RANGE ( name )
         ( PARTITION p1 VALUES LESS THAN ('L')      TABLESPACE ts1,
           PARTITION p2 VALUES LESS THAN (MAXVALUE) TABLESPACE ts2 )
    
    
    - 基于时间类型字段
    
    
    CREATE TABLE t1 (id NUMBER, c1 DATE)
    PARTITION BY RANGE (c1)
      (PARTITION t1p1 VALUES LESS THAN (TO_DATE('2007-11-01', 'YYYY-MM-DD')),
       PARTITION t1p2 VALUES LESS THAN (TO_DATE('2007-12-01', 'YYYY-MM-DD')),
       PARTITION t1p3 VALUES LESS THAN (TO_DATE('2008-01-01', 'YYYY-MM-DD')),
       PARTITION t1p4 VALUES LESS THAN (MAXVALUE)
      );
    
    
    
    
    ### Hash分区
    
    - 两种写法
    
    
    create table emp2 (
       empno number(4), 
       ename varchar2(30), 
       sal   number
    ) 
    partition by hash(empno) (
      partition e1 tablespace emp1, 
      partition e2 tablespace emp2, 
      partition e3 tablespace emp3,
      partition e4 tablespace emp4
    ); 
    -- tablespace 可以去掉
    
    
    create table emp2 (
       empno number(4), 
       ename varchar2(30), 
       sal   number
    ) 
    PARTITION BY HASH(empno)
    PARTITIONS 3
    -- STORE IN (empts1, empts2, empts3);
    
    
    组合分区
    
    - 8i 之前 只支持 range-hash
    - 9i 支持 range-list
    - 11g 支持更多 详情看这[http://www.orafaq.com/wiki/Composite_partitioning](http://www.orafaq.com/wiki/Composite_partitioning)
    
    
    CREATE TABLE orders(
     ord#       NUMBER,
     orderdate  DATE,
     prod#      NUMBER,
     quantity   NUMBER)
    PARTITION    BY RANGE(orderdate)
    SUBPARTITION BY HASH(prod#) SUBPARTITIONS 4 -- STORE IN(ts1, ts2, ts3, ts4)
    ( PARTITION q1 VALUES LESS THAN (TO_DATE('01-APR-2009', 'DD-MON-YYYY')),
      PARTITION q2 VALUES LESS THAN (TO_DATE('01-JUL-2009', 'DD-MON-YYYY')),
      PARTITION q3 VALUES LESS THAN (TO_DATE('01-OCT-2009', 'DD-MON-YYYY')),
      PARTITION q4 VALUES LESS THAN (MAXVALUE)
    );
    
    
    List分区
    
    
    CREATE TABLE myemp_work (
           emp#   NUMBER PRIMARY KEY,
           ename    VARCHAR2(30),
           salary   NUMBER(8,2),
           deptno   NUMBER)
      PARTITION BY LIST (deptno) (  
           PARTITION p10 VALUES (10), 
           PARTITION p20 VALUES (20), 
           PARTITION p30 VALUES (30,40));
    
    
    
    间隔分区 Interval
    
    - 11g引入,作为range分区的补充,当插入的值超过所有其他分区的范围时,自动创建分区
    
    - 限制
        - 分区字段必须是NUMBER或者DATE类型
        - 不支持索引组织表 index-organized table 
        - 不能在间隔分区创建域索引domain index 
    
    
    -- 创建salary有限值的分区
    create table test
          (sno number(6),
          last_name varchar2(30),
          salary number(6))
          partition by range(salary)
         (
      partition p1 values less than (5000),
      partition p2 values less than (10000),
      partition p3 values less than (15000),
      partition p4 values less than (20000));
    
    -- 插入一条超过分区区间的记录
    insert into test values (1,'Michel',25000);
    
    -- 抛出分区key不能映射到某个分区的错误
    ORA-14400:
    inserted partition key does not map to any partition
    
    -- interval分区用法
    create table test
              (sno number(6),
              last_name varchar2(30),
              salary number(6))
              partition by range(salary)
              Interval  (5000) -- 每5000一个分区
             (
          partition p1 values less than (5000),
          partition p2 values less than (10000),
         partition p3 values less than (15000),
         partition p4 values less than (20000));
    
    
    系统分区 
    
    - 11g中引入的一种分区方法,它允许应用程序控制分区选择。系统分区不像其他分区模式那样具有分区键。
    
    
    -- 创建若干分区
    CREATE TABLE syspart (c1 NUMBER, c2 NUMBER)
    PARTITION BY SYSTEM (
       PARTITION p1 TABLESPACE ts1,
       PARTITION p2 TABLESPACE ts2,
       PARTITION p3 TABLESPACE ts3
    );
    
    -- 插入数据时程序选择指定分区
    INSERT INTO syspart PARTITION (p1) VALUES (1, 2);
    INSERT INTO syspart PARTITION (p2) VALUES (3, 4);
    
    
    
    引用分区
    
    - 11g中介绍的一种分区方法。使用引用分区,子表可以从父表继承分区特征。
    
    
    -- 父表
    CREATE TABLE orders (
      order_id    NUMBER PRIMARY KEY,
      order_date  DATE NOT NULL,
      customer_id NUMBER NOT NULL,
      shipper_id  NUMBER)
    PARTITION BY RANGE (order_date) (
      PARTITION y1 VALUES LESS THAN (TO_DATE('01-JAN-2006', 'DD-MON-YYYY')),
      PARTITION y2 VALUES LESS THAN (TO_DATE('01-JAN-2007', 'DD-MON-YYYY')),
      PARTITION y3 VALUES LESS THAN (TO_DATE('01-JAN-2008', 'DD-MON-YYYY')));
    
    -- 子表外键继承父表的分区
    CREATE TABLE order_items (
      order_id    NUMBER NOT NULL,
      product_id  NUMBER NOT NULL,
      price       NUMBER,
      quantity    NUMBER,
      CONSTRAINT order_items_fk FOREIGN KEY (order_id) REFERENCES orders)
    PARTITION BY REFERENCE (order_items_fk);
    
    
     分区压缩
    
    - 11g分区可以被单独压缩,10g只支持整表压缩
    
    查看压缩特性
    
    
    -- 创建分区表,指定分区是否压缩
    CREATE TABLE test
               (sno       NUMBER(6),
                last_name VARCHAR2(30),
                salary    NUMBER(6))
              PARTITION BY RANGE (salary)
               INTERVAL  (5000)
              (
         PARTITION p1 VALUES LESS THAN (5000)   COMPRESS,
         PARTITION p2 VALUES LESS THAN (10000)  NOCOMPRESS,
         PARTITION p3 VALUES LESS THAN (15000)  COMPRESS,
         PARTITION p4 VALUES LESS THAN (20000)) NOCOMPRESS;
    
    -- 检查该表的压缩属性
    SELECT table_name, partition_name, compression
      FROM user_tab_partitions
      WHERE table_name='TEST';
    
    --单个关键字指定整个表的所有分区可被压缩
    CREATE TABLE test
                  (sno       NUMBER(6),
                   last_name VARCHAR2(30),
                   salary    NUMBER(6))
              COMPRESS
                 PARTITION BY RANGE (salary)
                  INTERVAL (5000)
                 (
            PARTITION p1 VALUES LESS THAN (5000) ,
            PARTITION p2 VALUES LESS THAN (10000),
            PARTITION p3 VALUES LESS THAN (15000),
            PARTITION p4 VALUES LESS THAN (20000));
    
    
    

      

  • 相关阅读:
    正则表达式
    内涵函数二
    内置函数
    生成器的推导式 表达式
    函数的闭包 迭代器的使用
    函数的动态参数,命名空间
    函数
    文件的操作
    set 集合 拷贝的操作
    u-boot简介
  • 原文地址:https://www.cnblogs.com/fubinhnust/p/9928825.html
Copyright © 2011-2022 走看看