How to Partition a Non-partitioned Table [ID 1070693.6]

    技术2022-05-20  32

    How to Partition a Non-partitioned Table [ID 1070693.6]


     

    Modified 03-MAR-2010     Type BULLETIN     Status PUBLISHED

     

     

     

    PURPOSE

    You have a table that is not partitioned that you would like to make into a partitioned table.  This article describes four possible methods for partitioning a non-partitioned table.

     

    These steps can also be used to change other partitioning characteristics such as adding subpartitioning to a partitioned table.

     

    SCOPE & APPLICATION

    Users needing to partition a non-partitioned table.

     

    RELATED DOCUMENTS

    Note:72332.1  DIAGNOSING ORA-14097 ON ALTER TABLE EXCHANGE PARTITION

    Note:105317.1 Section "VII.7 Partition exchanges

    Note:472449.1       How To Partition Existing Table Using DBMS_Redefinition

     

    You can partition a non-partitioned table in one of four ways:

     

    A)  Export/import method

     

    B)  Insert with a subquery method

     

    C)  Partition exchange method

     

    D)  DBMS_REDEFINITION

     

    Either of these four methods will create a partitioned table from an existing non-partitioned table.

     

    A. Export/import method

       --------------------

     

    1)  Export your table:

     

        exp usr/pswd tables=numbers file=exp.dmp

     

    2)  Drop the table:

     

        drop table numbers;

     

    3)  Recreate the table with partitions:

     

        create table numbers (qty number(3), name varchar2(15))

        partition by range (qty)

        (partition p1 values less than (501),

         partition p2 values less than (maxvalue));

     

    4)  Import the table with ignore=y:

     

        imp usr/pswd file=exp.dmp ignore=y

     

        The ignore=y causes the import to skip the table creation and

        continues to load all rows.

     

     

    B. Insert with a subquery method

       -----------------------------

     

    1)  Create a partitioned table:

     

        create table partbl (qty number(3), name varchar2(15))

        partition by range (qty)

        (partition p1 values less than (501),

         partition p2 values less than (maxvalue));

     

    2)  Insert into the partitioned table with a subquery from the

        non-partitioned table:

     

        insert into partbl (qty, name)

           select * from origtbl;

     

    3)  If you want the partitioned table to have the same name as the

        original table, then drop the original table and rename the

        new table:

     

        drop table origtbl;

        alter table partbl rename to origtbl;

     

    C. Partition Exchange method

       -------------------------

     

    ALTER TABLE EXCHANGE PARTITION can be used to convert a partition (or

    subpartition) into a non-partitioned table and a non-partitioned table into a

    partition (or subpartition) of a partitioned table by exchanging their data

    and index segments.

     

    1) Create table dummy_t as select with the required partitions

     

    2) Alter table EXCHANGE partition partition_name

           with table non-partition_table;

     

     

    Example

    -------

     

    SQL> CREATE TABLE p_emp

       2     (sal NUMBER(7,2))

       3      PARTITION BY RANGE(sal)

       4      (partition emp_p1 VALUES LESS THAN (2000),

       5       partition emp_p2 VALUES LESS THAN (4000));

     Table created.

     

     

     SQL> SELECT * FROM emp;

         EMPNO ENAME      JOB             MGR HIREDATE        SAL

     --------- ---------- --------- --------- --------- ---------

          7369 SMITH      CLERK          7902 17-DEC-80       800

          7499 ALLEN      SALESMAN       7698 20-FEB-81      1600

          7521 WARD       SALESMAN       7698 22-FEB-81      1250

          7566 JONES      MANAGER        7839 02-APR-81      2975

          7654 MARTIN     SALESMAN       7698 28-SEP-81      1250

          7698 BLAKE      MANAGER        7839 01-MAY-81      2850

          7782 CLARK      MANAGER        7839 09-JUN-81      2450

          7788 SCOTT      ANALYST        7566 19-APR-87      3000

          7839 KING       PRESIDENT           17-NOV-81      5000

          7844 TURNER     SALESMAN       7698 08-SEP-81      1500

          7876 ADAMS      CLERK          7788 23-MAY-87      1100

          7900 JAMES      CLERK          7698 03-DEC-81       950

          7902 FORD       ANALYST        7566 03-DEC-81      3000

          7934 MILLER     CLERK          7782 23-JAN-82      1300

     14 rows selected.

     

    SQL> CREATE TABLE dummy_y as SELECT sal

     FROM emp WHERE  sal<2000;

     Table created.

     

    SQL> CREATE TABLE dummy_z as SELECT sal FROM emp WHERE sal

     BETWEEN 2000 AND 3999;

     Table created.

     

    SQL> alter table p_emp exchange partition emp_p1

     with table dummy_y;

     Table altered.

     

    SQL> alter table p_emp exchange partition emp_p2

     with table dummy_z;

     Table altered.

     

     

    D. DBMS_REDEFINITION

       -----------------

     

    See Note 472449.1 "How To Partition Existing Table Using DBMS_Redefinition" for detailed instructions.

     

    在线重定义参考:

    http://blog.csdn.net/tianlesoftware/archive/2011/03/02/6218693.aspx

     

     

     

     

    ------------------------------------------------------------------------------

    QQ: 492913789

    Email:ahdba@qq.com

    Blog: http://www.cndba.cn/dave

    DBA1 群:62697716(); DBA2 群:62697977()

    DBA3 群:62697850   DBA 超级群:63306533;    

    聊天 群:40132017

    --加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请


    最新回复(0)