zoukankan      html  css  js  c++  java
  • [bbk2902] 第58集 Chapter 14Using Oracle Dasta Storage Structures Efficiently(04)

    Hash Partitioning Overview

    • Easy to Implement
    • Enables better performance for PDML and partion-wise joins
      • PDML->P DML并发的修改数据
      • partition-wise join只能的Join,只需要有用的Partition 进行Join,没用的partition就不参加Join
    • Inserts rows into partitions automatically based on the hash of the partion key
    • Supports(hash) local indexes
      • partition table索引分为local indexes和global indexes
    • Does not support(hash) global indexes(oracle 10g以后,不再适用)

    Hash partitions 的目的,就是使数据能够均匀的分布在不同的分区或者不同的磁盘上.

    不像partition range一样机械的将数据存放在不同的分区磁盘上. 

    里面的hash函数是由Oracle 提供的,用户是无法修改的.

    hash partition table 在设计分区数量时,Oracle 建议分配2的幂次方倍个(2,4,8,16,32...)

    create hash partition table
    CREATE TABLE emp
    (
            empno   INT,
            ename   VARCHAR2(20)
    )
    PARTITION BY HASH(empno)
    (
            --分区的个数最好是2的幂次方倍2,4,8,16,32...............
            partition part1 tablespace ts1,
            partition part2 tablespace ts2
    );
    insert data into hash partition table to emp;
    SQL> show user
    USER is "U3"
    SQL> select object_name,object_type from user_objects;
    
    OBJECT_NAME                    OBJECT_TYPE
    ------------------------------ -------------------
    EMP                            TABLE
    EMP                            TABLE PARTITION
    EMP                            TABLE PARTITION
    RANGE1                         TABLE PARTITION
    RANGE1                         TABLE
    RANGE1                         TABLE PARTITION
    RANGE1                         TABLE PARTITION
    RANGE1                         TABLE PARTITION
    RANGE1                         TABLE PARTITION
    HC                             CLUSTER
    
    10 rows selected.
    
    SQL> insert into emp select empno,ename from SCOTT.emp;
    
    14 rows created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from emp;
    
         EMPNO ENAME
    ---------- --------------------
          7369 SMITH
          7499 ALLEN
          7654 MARTIN
          7698 BLAKE
          7782 CLARK
          7839 KING
          7876 ADAMS
          7934 MILLER
          7521 WARD
          7566 JONES
          7788 SCOTT
    
         EMPNO ENAME
    ---------- --------------------
          7844 TURNER
          7900 JAMES
          7902 FORD
    
    14 rows selected.
    select data from hash partition table;
    SQL> select * from emp partition(part1);
    
         EMPNO ENAME
    ---------- --------------------
          7369 SMITH
          7499 ALLEN
          7654 MARTIN
          7698 BLAKE
          7782 CLARK
          7839 KING
          7876 ADAMS
          7934 MILLER
    
    8 rows selected.
    
    SQL> 
    SQL> select * from emp partition(part2);
    
         EMPNO ENAME
    ---------- --------------------
          7521 WARD
          7566 JONES
          7788 SCOTT
          7844 TURNER
          7900 JAMES
          7902 FORD
    
    6 rows selected.

     以上实验一切正常.创建hash partition table emp;设计两个tablespace(ts1,ts2)存放数据; 

    现在进行一场破坏性实验,模拟tb1损坏(以SYSDBA用户登陆,设置ts1 offline)

    SQL> alter tablespace ts1 offline;
    
    Tablespace altered.

     再查询位于ts1上的数据(也就是part1),会出现如下错误(因为位于ts1上的磁盘已经损坏)

    SQL> select * from emp;
    select * from emp
                  *
    ERROR at line 1:
    ORA-00376: file 9 cannot be read at this time
    ORA-01110: data file 9: '/RealData/oradata/DATACENTER/ts1_01.dbf'
    
    
    SQL> select * from emp partition(part1);
    select * from emp partition(part1)
                  *
    ERROR at line 1:
    ORA-00376: file 9 cannot be read at this time
    ORA-01110: data file 9: '/RealData/oradata/DATACENTER/ts1_01.dbf'

     再查询位于ts2上的数据(也就是part2),一切正常(因为ts2所在的磁盘没有损坏)

    SQL> select * from emp partition(part2);
    
         EMPNO ENAME
    ---------- --------------------
          7521 WARD
          7566 JONES
          7788 SCOTT
          7844 TURNER
          7900 JAMES
          7902 FORD
    
    6 rows selected.

     恢复ts1 online状态,然后再次查询一切正常.

    SQL> alter tablespace ts1 online;
    
    Tablespace altered.
    SQL> select * from emp partition(part2);
    
         EMPNO ENAME
    ---------- --------------------
          7521 WARD
          7566 JONES
          7788 SCOTT
          7844 TURNER
          7900 JAMES
          7902 FORD
    
    6 rows selected.
    
    SQL> select * from emp;
    
         EMPNO ENAME
    ---------- --------------------
          7369 SMITH
          7499 ALLEN
          7654 MARTIN
          7698 BLAKE
          7782 CLARK
          7839 KING
          7876 ADAMS
          7934 MILLER
          7521 WARD
          7566 JONES
          7788 SCOTT
    
         EMPNO ENAME
    ---------- --------------------
          7844 TURNER
          7900 JAMES
          7902 FORD
    
    14 rows selected.
    
    SQL> select * from emp partition(part2);
    
         EMPNO ENAME
    ---------- --------------------
          7521 WARD
          7566 JONES
          7788 SCOTT
          7844 TURNER
          7900 JAMES
          7902 FORD
    
    6 rows selected.

    List Partitioning Example

    创建List Partitioning script

    CREATE TABLE locations
    (
            location_id int,
            street_address VARCHAR2(32),
            postal_code     VARCHAR2(16),
            city            VARCHAR2(16),
            state_province  VARCHAR2(24),
            country_id      int
    )
    STORAGE(INITIAL 10K NEXT 20K)
    TABLESPACE users
    PARTITION BY LIST(state_province)
    (
            PARTITION regeion_east('MA','NY','CT','ME','MD'),
            PARTITION regeion_west('ca','AZ','NM','OR','WA'),
            PARTITION regeion_south('TX','KY','TN','LA','MS'),
            PARTITION regeion_central'OH','ND','SD','MO','IL')
    
    );

    Default Partition

    Create a DEFAULT list patition for all values not convered by other partitions:

    如果在定义的时候,定了DEFAULT PARTITION,以后再想插入新的分区(不同通过ALTER TABLE ...),基本上就无法插入新的分区了.如果要想插入新的分区,就只能先将DEFAULT PARTITION给干掉,然后插入新的分区,再然后加入DEFAULT PARTITION; 

    CREATE TABLE customer
    ...
    PARTITION BY LIST(state)
    (
            PARTITION P1 VALUES('CA','CO'),
            PARTITION P2 VALUES('FL','TX'),
            PARTITION P3 VALUES(DEFAULT)
    );
    CREATE TABLE list1
    (
            stateid VARCHAR2(2),
            data    VARCHAR2(100)
    )
    PARTITION BY LIST(stateid)
    (
            PARTITION p1    VALUES('TX','MA','NY') TABLESPACE TS0,
            PARTITION p2    VALUES('CA','PA','LA') TABLESPACE TS0,
            PARTITION p3    VALUES(DEFAULT) TABLESPACE TS0
    );

    Composite Partitioning

    • Ideal for both historical data and data placement
    • Provides high availability  and manageability,like range partitioning.
    • Improves performance for parallel DML and supports partition-wise joins
    • Allows more granular partition elimination
    • Supports composite local indexes
    • Dose not support composite global indexes
    create composite partitions table
    CREATE TABLE composite1
    (
            range_key DATE,
            hash_key INT,
            data    VARCHAR2(100)
    )
    PARTITION BY RANGE(range_key)
    SUBPARTITION BY HASH(hash_key) subpartitions 2
    (
            PARTITION part1 VALUES LESS THAN (TO_DATE('01/01/2014','dd/mm/yyyy'))
            (
                    subpartition h1,
                    subpartition h2
            ),
            PARTITION part2 VALUES LESS THAN (TO_DATE('01/01/2015','dd/mm/yyyy'))
            (
                    subpartition h11,
                    subpartition h22
            )
    );

    如何删除一个composite partition table?是同删除普通Heap表一样吗? 

  • 相关阅读:
    Python中的单例模式
    硬件资产管理系统总结
    浏览器同源策略之JSONP、CORS
    设置全局的csrf跨站请求伪造
    keystone命令与client接口学习
    实验室双显示屏安装使用记录
    redhat 5.4 下rabbitMQ单机安装.md
    Android Studio Connection refused: connect 错误解决
    Add Google Maven repository and sync project
    Java向上转型和向下转型
  • 原文地址:https://www.cnblogs.com/arcer/p/3069322.html
Copyright © 2011-2022 走看看