在oracle 10g世界里面,分区表主要分range,hash,list,range-hash,range-list五种类型,在oracle 11g中,则发展到了3*3的分区组合类型,以满足更多的应用场景!但无论在什么情况下,范围分区都是最常见的一种表分区方式,尤其在需要对过期的数据进行整理归档,只保留一定时期内的数据的条件下,几乎都会优先选择使用范围分区的方式!分区表可以说是一项百利而无一害的技术,当数据量达到一定的级别后(通常是超过100G后),就算使用了ASM技术,数据库中一样会产生严重的I/O等待事件!

下面来简要介绍下范围分区,范围分区的主要优点主要如下:
1:分区表可以将表存储在多个表空间内,进而离散I/O;
2:同时各个分区维护各自的本地索引(一般使用local索引,而不是global索引);
3:select语句可以根据索引进行分区范围扫描,减少查询语句所带来的一致性读;
4:可以对单个分区进行备份或者truncate,归档或者清除过期的数据;
5: 可以方便的对表的分区进行添加,删除,truncate,拆分和合并操作

一:创建一张分区表,分区的条件是以销售日期来界定,同时分区的索引为本地索引,每个分区的对应一个单独的表空间,基于离散I/O和方便管理的双重需要

SQL> create table sale_data
  2  (sale_id number(5), salesman_name varchar2(30),sales_date date)
  3  partition by range(sales_date)
  4  (
  5  partition sales_01 values less than (to_date('01/02/2012','DD/MM/YYYY')) tablespace tbs_sale01,
  6  partition sales_02 values less than (to_date('01/03/2012','DD/MM/YYYY')) tablespace tbs_sale02,
  7  partition sales_03 values less than (to_date('01/04/2012','DD/MM/YYYY')) tablespace tbs_sale03,
  8  partition sales_04 values less than (to_date('01/05/2012','DD/MM/YYYY')) tablespace tbs_sale04,
  9  partition sales_05 values less than (to_date('01/06/2012','DD/MM/YYYY')) tablespace tbs_sale05,
 10  partition sales_06 values less than (to_date('01/07/2012','DD/MM/YYYY')) tablespace tbs_sale06,
 11  partition sales_07 values less than (to_date('01/08/2012','DD/MM/YYYY')) tablespace tbs_sale07,
 12  partition sales_08 values less than (to_date('01/09/2012','DD/MM/YYYY')) tablespace tbs_sale08,
 13  partition sales_09 values less than (to_date('01/10/2012','DD/MM/YYYY')) tablespace tbs_sale09,
 14  partition sales_10 values less than (to_date('01/11/2012','DD/MM/YYYY')) tablespace tbs_sale10,
 15  partition sales_11 values less than (to_date('01/12/2012','DD/MM/YYYY')) tablespace tbs_sale11,
 16* partition sales_12 values less than (to_date('31/12/2012','DD/MM/YYYY')) tablespace tbs_sale12)
Table created.

SQL> select owner,partitioning_type,partition_count,status from dba_part_tables where table_name='SALE_DATE';

OWNER          PARTITI PARTITION_COUNT STATUS
------------------------------ ------- --------------- --------
SALE          RANGE      12 VALID

SQL> create index ind_sale_data_date on sale_data(sale_id) local
  2  (
  3  partition sales_01 tablespace tbs_sale01,
  4  partition sales_02 tablespace tbs_sale02,
  5  partition sales_03 tablespace tbs_sale03,
  6  partition sales_04 tablespace tbs_sale04,
  7  partition sales_05 tablespace tbs_sale05,
  8  partition sales_06 tablespace tbs_sale06,
  9  partition sales_07 tablespace tbs_sale07,
 10  partition sales_08 tablespace tbs_sale08,
 11  partition sales_09 tablespace tbs_sale09,
 12  partition sales_10 tablespace tbs_sale10,
 13  partition sales_11 tablespace tbs_sale11,
 14* partition sales_12 tablespace tbs_sale12)
Index created.

SQL> select segment_name,partition_name,tablespace_name from user_segments where segment_name in ('SALE_DATA','IND_SALE_DATA_DATE');

SEGMENT_NAME      PARTITION_NAME      TABLESPACE_NAME
-------------------- ------------------------------ --------------------
SALE_DATA      SALES_01       TBS_SALE01
SALE_DATA      SALES_02       TBS_SALE02
SALE_DATA      SALES_03       TBS_SALE03
SALE_DATA      SALES_04       TBS_SALE04
SALE_DATA      SALES_05       TBS_SALE05
SALE_DATA      SALES_06       TBS_SALE06
SALE_DATA      SALES_07       TBS_SALE07
SALE_DATA      SALES_08       TBS_SALE08
SALE_DATA      SALES_09       TBS_SALE09
SALE_DATA      SALES_10       TBS_SALE10
SALE_DATA      SALES_11       TBS_SALE11

SEGMENT_NAME      PARTITION_NAME      TABLESPACE_NAME
-------------------- ------------------------------ --------------------
SALE_DATA      SALES_12       TBS_SALE12
IND_SALE_DATA_DATE   SALES_01       TBS_SALE01
IND_SALE_DATA_DATE   SALES_02       TBS_SALE02
IND_SALE_DATA_DATE   SALES_03       TBS_SALE03
IND_SALE_DATA_DATE   SALES_04       TBS_SALE04
IND_SALE_DATA_DATE   SALES_05       TBS_SALE05
IND_SALE_DATA_DATE   SALES_06       TBS_SALE06
IND_SALE_DATA_DATE   SALES_07       TBS_SALE07
IND_SALE_DATA_DATE   SALES_08       TBS_SALE08
IND_SALE_DATA_DATE   SALES_09       TBS_SALE09
IND_SALE_DATA_DATE   SALES_10       TBS_SALE10  

SEGMENT_NAME      PARTITION_NAME      TABLESPACE_NAME
-------------------- ------------------------------ --------------------
IND_SALE_DATA_DATE   SALES_11       TBS_SALE11
IND_SALE_DATA_DATE   SALES_12       TBS_SALE12

二:插入测试数据,收集优化器的统计信息(包括索引),当前的系统时间为2012年3月12日(传说中的植树节哦!),因而数据应当在sales_03和sales_05两个分区

  1. SQL> begin 
  2.   2  for i in 1..10000  
  3.   3  loop  
  4.   4  insert into sale_data values (i,'yang',sysdate);  
  5.   5  commit;  
  6.   6  end loop;  
  7.   7* end;  
  8. PL/SQL procedure successfully completed.  
  9.  
  10. SQL> begin 
  11.   2  for i in 1..10000  
  12.   3  loop  
  13.   4  insert into sale_data values (i,'yang',sysdate+60);  
  14.   5  commit;  
  15.   6  end loop;  
  16.   7* end;  
  17. PL/SQL procedure successfully completed.  
  18.  
  19. SQL> exec dbms_stats.gather_table_stats('SALE','SALE_DATA',CASCADE => TRUE);  
  20. PL/SQL procedure successfully completed. 

三:以sys用户运行,将plustrace权限赋予用户sale

  1. SQL> @?/sqlplus/admin/plustrce.sql;  
  2. SQL>   
  3. SQL> drop role plustrace;  
  4. drop role plustrace  
  5.           *  
  6. ERROR at line 1:  
  7. ORA-01919: role 'PLUSTRACE' does not exist  
  8.  
  9. SQL> create role plustrace;  
  10. Role created.  
  11.  
  12. SQL> grant select on v_$sesstat to plustrace;  
  13. Grant succeeded.  
  14.  
  15. SQL> grant select on v_$statname to plustrace;  
  16. Grant succeeded.  
  17.  
  18. SQL> grant select on v_$mystat to plustrace;  
  19. Grant succeeded.  
  20.  
  21. SQL> grant plustrace to dba with admin option;  
  22. Grant succeeded.  
  23.  
  24. SQL> set echo off  
  25. SQL> grant plustrace to sale;  
  26. Grant succeeded. 

四:查看在分区表上的查询语句的执行计划

SQL> set autot trace exp stat
SQL> select count(*) from sale_data;
Execution Plan
----------------------------------------------------------
Plan hash value: 268098023

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

| Id  | Operation      | Name  | Rows  | Cost (%CPU)| Time  | Pstart| Pstop |

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

|   0 | SELECT STATEMENT     |   |     1 |    17   (0)| 00:00:01 | |  |

|   1 |  SORT AGGREGATE      |   |     1 |       |   | |  |

|   2 |   PARTITION RANGE ALL|   | 20000 |    17   (0)| 00:00:01 |     1|    12 |

|   3 |    TABLE ACCESS FULL | SALE_DATA | 20000 |    17   (0)| 00:00:01 |    |    12 |

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

Statistics
----------------------------------------------------------
   0  recursive calls
   0  db block gets
 106  consistent gets
   0  physical reads
   0  redo size
 515  bytes sent via SQL*Net to client
 469  bytes received via SQL*Net from client
   2  SQL*Net roundtrips to/from client
   0  sorts (memory)
   0  sorts (disk)
   1  rows processed
可以看到,统计整个分区表的行数的时候,先走了全表扫描,而后是全部的分区范围扫描,总共有106个一致性读!  
 
SQL> select count(*) from sale_data partition(sales_03);
Execution Plan
----------------------------------------------------------
Plan hash value: 2733649240
--------------------------------------------------------------------------------
| Id  | Operation  | Name     | Rows  | Cost (%CPU)| Time     | Pstart| Pstop |

--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |     |   1 |   9   (0)| 00:00:01 | |     |

|   1 |  SORT AGGREGATE  |     |   1 |   |     | |     |

|   2 |   PARTITION RANGE SINGLE|     | 10000 |   9   (0)| 00:00:01 | 3 |   3 |

|   3 |    TABLE ACCESS FULL | SALE_DATA | 10000 |   9   (0)| 00:00:01 |3 |   3 |

--------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
   1  recursive calls
   0  db block gets
  38  consistent gets
   0  physical reads
   0  redo size
 515  bytes sent via SQL*Net to client
 469  bytes received via SQL*Net from client
   2  SQL*Net roundtrips to/from client
   0  sorts (memory)
   0  sorts (disk)
   1  rows processed
  
可以看到,统计整个分区表的行数的时候,先走了全表扫描,而后是单个的分区范围扫描,总共有38个一致性读! 

SQL> set autot trace exp stat
SQL> select * from sale_data partition(sales_03) where sale_id=100;

   SALE_ID SALESMAN_NAME    SALES_DATE
---------- ------------------------------ -------------------
       100 yang      2012-03-12:20:04:31
   
Execution Plan
----------------------------------------------------------
Plan hash value: 4229050284
--------------------------------------------------------------------------------
| Id  | Operation      | Name  | Rows | Bytes| Cost (%CPU)| Time | Pstart| Pstop |

--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |   |     1 |    16|     2   (0)| 00:00:01 | | |

|   1 |  PARTITION RANGE SINGLE     |   |     1 |    16|     2   (0)| 00:00:01 |     3 |     3 |

|   2 |   TABLE ACCESS BY LOCAL INDEX ROWID| SALE_DATA  |     1 |   162|    2   (0)| 00:00:01 |     3 |     3 |

|*  3 |    INDEX RANGE SCAN     | IND_SALE_DATA_DATE |     1 |
|     1   (0)| 00:00:01 |     3 |     3 |

--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("SALE_ID"=100)

Statistics
----------------------------------------------------------
   1  recursive calls
   0  db block gets
   4  consistent gets
   0  physical reads
   0  redo size
 666  bytes sent via SQL*Net to client
 469  bytes received via SQL*Net from client
   2  SQL*Net roundtrips to/from client
   0  sorts (memory)
   0  sorts (disk)
   1  rows processed

可以看到,当进行等值查询的时候,先走了范围索引扫描,而后是通过本地索引定位rowid,然后访问单个分区,总共有4个一致性读!

五:对单个分区的truncate操作

  1. SQL> select count(*) from sale_data partition(sales_03);  
  2.  
  3.   COUNT(*)  
  4. ----------  
  5.      10000  
  6.  
  7. SQL> select count(*) from sale_data partition(sales_05);  
  8.  
  9.   COUNT(*)  
  10. ----------  
  11.      10000  
  12.  
  13. SQL> select * from sale_data partition(sales_03) where rownum=1;  
  14.  
  15.    SALE_ID SALESMAN_NAME          SALES_DATE  
  16. ---------- ------------------------------ -------------------  
  17.      1 yang               2012-03-12:20:04:31  
  18.  
  19. SQL> select * from sale_data partition(sales_05) where rownum=1;  
  20.  
  21.    SALE_ID SALESMAN_NAME          SALES_DATE  
  22. ---------- ------------------------------ -------------------  
  23.      1 yang               2012-05-11:20:08:45  
  24.  
  25. SQL> alter table sale_data truncate partition sales_03;  
  26. Table truncated.  
  27.  
  28. SQL> select count(*) from sale_data partition(sales_03);  
  29.  
  30.   COUNT(*)  
  31. ----------  
  32.      0 

六:添加分区(非默认)以及默认分区(对应范围分区的最大值),本地索引会自动创建,删除分区的时候,索引也会自动维护!

  1. SQL> alter table sale_data add partition sales_13 values less than (to_date('01/02/2013','DD/MM/YYYY')) tablespace tbs_sale12;  
  2. Table altered.  
  3.  
  4. SQL> alter table sale_data add partition sales_14 values less than (maxvalue) tablespace tbs_sale12;  
  5. Table altered.  
  6.  
  7. SQL> select segment_name,partition_name,tablespace_name from user_segments where segment_name='IND_SALE_DATA_DATE' and partition_name in ('SALES_13','SALES_14');  
  8.  
  9. SEGMENT_NAME         PARTITION_NAME   TABLESPACE_NAME  
  10. -------------------- -------------------- ------------------------------  
  11. IND_SALE_DATA_DATE   SALES_13         TBS_SALE12  
  12. IND_SALE_DATA_DATE   SALES_14         TBS_SALE12  
  13.  
  14. SQL> alter table sale_data drop partition sales_13;  
  15. Table altered.  
  16.  
  17. SQL> alter table sale_data drop partition sales_14;  
  18. Table altered.  
  19.  
  20. SQL> select segment_name,partition_name,tablespace_name from user_segments where segment_name='IND_SALE_DATA_DATE' and partition_name in ('SALES_13','SALES_14');  
  21. no rows selected. 

七:下面来讨论下表分区的拆分与合并,创建一张结构简单的分区表来说明,根据用户id进行分区;

  1. SQL> create table emp (id number,first_name char(10))  
  2.   2  partition by range(id)  
  3.   3  (  
  4.   4  partition p_1 values less than (10000) tablespace tbs_sale01,  
  5.   5  partition p_2 values less than (20000) tablespace tbs_sale02,  
  6.   6* partition p_3 values less than (30000) tablespace tbs_sale03)  
  7. Table created.  
  8.  
  9. SQL> begin 
  10.   2  for i in 1..20000  
  11.   3  loop  
  12.   4  insert into emp values (i,'t_i');  
  13.   5  commit;  
  14.   6  end loop;  
  15.   7* end;  
  16. PL/SQL procedure successfully completed. 

1:首先,当创建分区表的时候未指定maxvalue值所在的分区的情况下,插入分区以外的值,将会报ORA-14400错误

  1. SQL> insert into emp values (30001,'t');  
  2. insert into emp values (30001,'t')  
  3.             *  
  4. ERROR at line 1:  
  5. ORA-14400: inserted partition key does not map to any partition  
  6.  
  7. SQL> alter table emp add partition p_max values less than (maxvalue) tablespace tbs_sale04;  
  8. Table altered.  
  9.  
  10. SQL> insert into emp values (30001,'t');  
  11. 1 row created.  
  12.  
  13. SQL> commit;  
  14. Commit complete.  
  15.  
  16. SQL> select * from emp partition(p_max);  
  17.  
  18.     ID FIRST_NAME  
  19. ---------- ----------  
  20.      30001 t 

2:将p_1分区进行拆分操作

  1. SQL> select partition_name,tablespace_name from user_segments where segment_name='EMP';  
  2.  
  3. PARTITION_NAME             TABLESPACE_NAME  
  4. ------------------------------ ------------------------------  
  5. P_1                TBS_SALE01  
  6. P_2                TBS_SALE02  
  7. P_3                TBS_SALE03  
  8. P_MAX              TBS_SALE04  
  9.  
  10. SQL> alter table emp split partition p_1 at('9999'into (partition p_1_01 tablespace tbs_sale02,partition p_1_02 tablespace tbs_sale03);  
  11. Table altered.  
  12.  
  13. SQL> select partition_name,tablespace_name from user_segments where segment_name='EMP';  
  14.  
  15. PARTITION_NAME             TABLESPACE_NAME  
  16. ------------------------------ ------------------------------  
  17. P_2                    TBS_SALE02  
  18. P_3                    TBS_SALE03  
  19. P_MAX                  TBS_SALE04  
  20. P_1_01                 TBS_SALE02  
  21. P_1_02                 TBS_SALE03  
  22.  
  23. SQL> select count(*) from emp partition(p_1_01);  
  24.  
  25.   COUNT(*)  
  26. ----------  
  27.       9998  
  28.  
  29. SQL> select count(*) from emp partition(p_1_02);  
  30.  
  31.   COUNT(*)  
  32. ----------  
  33.      1  
  34. 由此可见,at关键字指的是在这个点进行拆分,且包含这个点! 

3:将p_1_01和p_1_02分区进行合并操作,若不指定表空间,将使用用户的默认表空间

  1. SQL> alter table emp merge partitions p_1_01,p_1_02 into partition p_01;  
  2. Table altered.  
  3.  
  4. SQL> select partition_name,tablespace_name from user_segments where segment_name='EMP';  
  5.  
  6. PARTITION_NAME             TABLESPACE_NAME  
  7. ------------------------------ ------------------------------  
  8. P_01                   USERS  
  9. P_2                    TBS_SALE02  
  10. P_3                    TBS_SALE03  
  11. P_MAX                  TBS_SALE04 

八:针对单个分区的导出和导入,使用expdp和impdp实现
1:查看表各个分区的情况,创建目录对象并授权,导出分区P_1

  1. SQL> select PARTITION_NAME ,TABLESPACE_NAME from user_segments where segment_name='EMP';  
  2.  
  3. PARTITION_NAME                 TABLESPACE_NAME  
  4. ------------------------------ ------------------------------  
  5. P_1                            TBS_SALE01  
  6. P_2                            TBS_SALE02  
  7. P_3                            TBS_SALE03  
  8. P_MAX                          TBS_SALE04  
  9.  
  10. SQL> select count(*) from emp partition (p_1);  
  11.  
  12.   COUNT(*)  
  13. ----------  
  14.       9999  
  15.  
  16. SQL> select count(*) from emp partition (p_2);  
  17.  
  18.   COUNT(*)  
  19. ----------  
  20.      10000  
  21.  
  22. SQL> select count(*) from emp partition (p_3);  
  23.  
  24.   COUNT(*)  
  25. ----------  
  26.          1  
  27.  
  28. SQL> select count(*) from emp partition (p_max);  
  29.  
  30.   COUNT(*)  
  31. ----------  
  32.          1         
  33.  
  34. SQL> conn /as sysdba  
  35. Connected.  
  36.  
  37. SQL> create directory dir01 as '/home/oracle/dir01';  
  38. Directory created.  
  39.  
  40. SQL> grant read,write on directory dir01 to sale;  
  41. Grant succeeded.  
  42.  
  43. [oracle@rhel6 ~]$ expdp help=y  
  44.  Example: expdp scott/tiger DUMPFILE=scott.dmp DIRECTORY=dmpdir SCHEMAS=scott  
  45.                or TABLES=(T1:P1,T1:P2), if T1 is partitioned table 
  46.                  
  47. [oracle@rhel6 ~]$ expdp sale/123456 directory=dir01 dumpfile=emp_p1.dmp logfile=emp_p1.log   tables=emp:p_1  
  48. Export: Release 10.2.0.1.0 - 64bit Production on Tuesday, 13 March, 2012 21:06:13  
  49. Copyright (c) 2003, 2005, Oracle.  All rights reserved.  
  50.  
  51. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production  
  52. With the Partitioning, OLAP and Data Mining options  
  53. Starting "SALE"."SYS_EXPORT_TABLE_01":  sale/******** directory=dir01 dumpfile=emp_p1.dmp logfile=emp_p1.log tables=emp:p_1   
  54. Estimate in progress using BLOCKS method...  
  55. Processing object type TABLE_EXPORT/TABLE/TABLE_DATA  
  56. Total estimation using BLOCKS method: 256 KB  
  57. Processing object type TABLE_EXPORT/TABLE/TABLE 
  58. Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS  
  59. . . exported "SALE"."EMP":"P_1"                          190.5 KB    9999 rows 
  60. Master table "SALE"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded  
  61. ******************************************************************************  
  62. Dump file set for SALE.SYS_EXPORT_TABLE_01 is:  
  63.   /home/oracle/dir01/emp_p1.dmp  
  64. Job "SALE"."SYS_EXPORT_TABLE_01" successfully completed at 21:06:17 

2.导出完成后,截断P_1分区

  1. [oracle@rhel6 ~]$ sqlplus sale/123456  
  2. SQL*Plus: Release 10.2.0.1.0 - Production on Tue Mar 13 21:07:18 2012  
  3. Copyright (c) 1982, 2005, Oracle.  All rights reserved.  
  4. Connected to:  
  5. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production  
  6. With the Partitioning, OLAP and Data Mining options  
  7.  
  8. SQL> alter table emp truncate partition p_1;  
  9. Table truncated.  
  10.  
  11. SQL> select count(*) from emp partition (p_1);  
  12.  
  13.   COUNT(*)  
  14. ----------  
  15.          0 

3:导入分区P_1的备份,需要设置table_exists_action参数为append,否则将导入失败

  1. [oracle@rhel6 ~]$ impdp sale/123456 directory=dir01 dumpfile=emp_p1.dmp logfile=emp_p1.log2  table_exists_action=append tables=emp:p_1  
  2. Import: Release 10.2.0.1.0 - 64bit Production on Tuesday, 13 March, 2012 21:29:58  
  3. Copyright (c) 2003, 2005, Oracle.  All rights reserved.  
  4. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production  
  5. With the Partitioning, OLAP and Data Mining options  
  6. Master table "SALE"."SYS_IMPORT_TABLE_01" successfully loaded/unloaded  
  7. Starting "SALE"."SYS_IMPORT_TABLE_01":  sale/******** directory=dir01 dumpfile=emp_p1.dmp logfile=emp_p1.log2 table_exists_action=append tables=emp:p_1   
  8. Processing object type TABLE_EXPORT/TABLE/TABLE 
  9. ORA-39152: Table "SALE"."EMP" exists. Data will be appended to existing table but all dependent metadata will be skipped due to table_exists_action of append  
  10. Processing object type TABLE_EXPORT/TABLE/TABLE_DATA  
  11. . . imported "SALE"."EMP":"P_1"                          190.5 KB    9999 rows 
  12. Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS  
  13. Job "SALE"."SYS_IMPORT_TABLE_01" completed with 1 error(s) at 21:30:01  
  14.  
  15. SQL> conn sale/123456  
  16. Connected.  
  17. SQL> select count(*) from emp partition (p_1);  
  18.  
  19.   COUNT(*)  
  20. ----------  
  21.       9999 

九:分区交换,这是一项非常实用的技术,即可以将字段完全相同的分区表分区和普通表进行存储空间的交换,从而达到数据交换的目的。就类似于将两个用户的名字对调,而原本用户用户的对象都没有改变。并且,当仅有local分区索引,且和普通表的索引相对应时,还可以将索引一起作交换。exchange partition的语法如下:
ALTER TABLE table1
EXCHANGE PARTITION partition
  WITH TABLE table2
  [{ INCLUDING | EXCLUDING } INDEXES]
  [{ WITH | WITHOUT } VALIDATION]
  [EXCEPTIONS INTO [schema.]table]
  [UPDATE/NVALIDATE GLOBAL INDEXES
  [NOPARALLEL/PARALLEL[int]]]

     

  1. SQL> create table emp_exchange as select * from emp where 1=0;  
  2. Table created.  
  3.  
  4. SQL> select count(*) from emp_exchange;  
  5.  
  6.   COUNT(*)  
  7. ----------  
  8.          0    
  9.  
  10. SQL> select count(*) from emp partition(p_1);  
  11.  
  12.   COUNT(*)  
  13. ----------  
  14.       9999  
  15.            
  16. SQL> alter table emp exchange partition p_1 with table emp_exchange;  
  17. Table altered.  
  18.  
  19. SQL> select count(*) from emp partition(p_1);  
  20.  
  21.   COUNT(*)  
  22. ----------  
  23.          0  
  24.  
  25. SQL> select count(*) from emp_exchange;  
  26.  
  27.   COUNT(*)  
  28. ----------  
  29.       9999  
  30.  
  31. SQL> select tablespace_name from user_segments where segment_name='EMP_EXCHANGE';   
  32.  
  33. TABLESPACE_NAME  
  34. ------------------------------  
  35. TBS_SALE01  
  36.  
  37. SQL> select tablespace_name from user_segments where segment_name='EMP';   
  38.  
  39. TABLESPACE_NAME  
  40. ------------------------------  
  41. USERS  
  42. TBS_SALE02  
  43. TBS_SALE03  
  44. TBS_SALE04