Oracle分区表常用于业务中大表使用,如历史交易记录表等,提高表记录查询效率。本文主要描述范围分区表的创建、新增以及索引创建。

Oracle操作分区表相关信息

显示数据库所有分区表的信息:DBA_PART_TABLES
SQL> select owner,table_name,partitioning_type,partition_count,partitioning_key_count,status from dba_part_tables;
显示当前用户可访问的所有分区表信息:ALL_PART_TABLES
显示当前用户所有分区表的信息:USER_PART_TABLES
显示表分区信息 显示数据库所有分区表的详细分区信息:DBA_TAB_PARTITIONS
显示当前用户可访问的所有分区表的详细分区信息:ALL_TAB_PARTITIONS
显示当前用户所有分区表的详细分区信息:USER_TAB_PARTITIONS
显示子分区信息 显示数据库所有组合分区表的子分区信息:DBA_TAB_SUBPARTITIONS
显示当前用户可访问的所有组合分区表的子分区信息:ALL_TAB_SUBPARTITIONS
显示当前用户所有组合分区表的子分区信息:USER_TAB_SUBPARTITIONS
显示分区列 显示数据库所有分区表的分区列信息:DBA_PART_KEY_COLUMNS
显示当前用户可访问的所有分区表的分区列信息:ALL_PART_KEY_COLUMNS
显示当前用户所有分区表的分区列信息:USER_PART_KEY_COLUMNS
显示子分区列 显示数据库所有分区表的子分区列信息:DBA_SUBPART_KEY_COLUMNS
显示当前用户可访问的所有分区表的子分区列信息:ALL_SUBPART_KEY_COLUMNS
显示当前用户所有分区表的子分区列信息:USER_SUBPART_KEY_COLUMNS

1、分区表创建

CREATE TABLE range_example(
range_key_column DATE,
DATA VARCHAR2(20),
ID integer
) PARTITION BY RANGE(range_key_column)
(
PARTITION part_20171101 VALUES LESS THAN (TO_DATE('2017-11-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
PARTITION part_20171102 VALUES LESS THAN (TO_DATE('2017-11-02 00:00:00','yyyy-mm-dd hh24:mi:ss')),
PARTITION part_20171103 VALUES LESS THAN (TO_DATE('2017-11-03 00:00:00','yyyy-mm-dd hh24:mi:ss'))
);

说明:如果是已创建的分区表,可以通过PL/SQL查看分区表创建语句。判断分区表类型。

2、新增分区表

ALTER TABLE range_example ADD PARTITION part_20171101 VALUES LESS THAN (TO_DATE('2017-11-01 00:00:00','yyyy-mm-dd hh24:mi:ss'));

3、删除分区表

ALTER TABLE range_example DROP PARTITION part_20171103;

4、查看分区表记录数

1,先生成各个分区的查询语句:
select 'select count(*) from TABLENAME partition('||partition_name||');' from (select * from user_tab_partitions where table_name='TABLENAME');
2,然后:
select (select count(*) from TABLENAME partition(PART1)) p1,
(select count(*) from TABLENAME partition(PART2)) p2,
(select count(*) from TABLENAME partition(PART3)) p3,
(select count(*) from TABLENAME partition(PART4)) p4,
(select count(*) from TABLENAME partition(PART5)) p5,
(select count(*) from TABLENAME partition(PART6)) p6,
(select count(*) from TABLENAME partition(PART7)) p7,
(select count(*) from TABLENAME partition(PART8)) p8,
(select count(*) from TABLENAME partition(PART9)) p9,
(select count(*) from TABLENAME partition(PART10)) p10
from dual;
05-06 19:16