关于数据库分区表的一些操作,如下:

一、创建分区

1、新建表同时创建分区

create table tmp_wzh_061102
(
  send_seq  NUMBER(15) not null,
  recv_seq  NUMBER(15),
  action_type     NUMBER(2),
  send_date       DATE
)
partition by range (SEND_DATE)
(
  partition part1 values less than (TO_DATE('2021-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace tablespaceName,
  partition part2 values less than (TO_DATE('2021-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
    tablespace tablespaceName
);

2、在现有表上创建分区

ALTER TABLE  tmp_wzh_061102  ADD PARTITION  part4 
values less than(TO_DATE('2021-09-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) TABLESPACE  tablespaceName;

二、删除分区数据

注意:操作分区同时要重建索引,否则索引失效。

--删除数据
delete from table_name partition(part1) a where a.condition。。。;

--全部删除数据
alter table table_name TRUNCATE PARTITION part2 update indexes;

--删除分区,数据也自动删除
alter table table_name DROP PARTITION part1 update indexes;

三、分区数据查询及修改

1、单表查询

select a.* from tablename partition(part1) a where a.column1 is not null;

2、关联查询

select a.*, a.rowid
from tablename a,
parttablename partition(part1) b
where a.send_queue_seq = b.send_queue_seq;

3、跨分区查询

select sum( *) from 
(select count(*) cn from t_table_SS PARTITION (P200709_1) 
union all 
select count(*) cn from t_table_SS PARTITION (P200709_2);

4、查询表上有多少分区

SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='tableName';

5、分区数据修改

update tablename partition(part1) a set a.column1='' where a.column is not null;

四、合并分区(相邻分区的合并)

合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。
ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2 UPDATE INDEXES; 

--如果省略update indexes子句的话,必须重建受影响的分区的index;
ALTER TABLE range_example MODIFY PARTITION part02 REBUILD UNUSABLE LOCAL INDEXES; 

实例:
ALTER TABLE table_name1 MERGE PARTITIONS 
TICKET_GSMNEAR_201604 ,
TICKET_GSMNEAR_201605 ,
TICKET_GSMNEAR_201606 ,
TICKET_GSMNEAR_201607 
 INTO PARTITION table_name2 UPDATE INDEXES;

五、重命名分区

ALTER TABLE table_name RENAME PARTITION old_name TO new_name;  
ALTER TABLE table_name RENAME SUBPARTITION old_name TO new_name;

六、移动分区

alter table custaddr move partition P_OTHER tablespace system update indexes;  
alter table custaddr move partition P_OTHER tablespace icd_service update indexes; 
分区移动会自动维护局部分区索引,oracle不会自动维护全局索引,所以需要我们重新rebuild分区索引,
具体需要rebuild哪些索引,可以通过dba_part_indexes,dba_ind_partitions去判断。

Select index_name,status From user_indexes Where table_name='CUSTADDR';

七、查询索引信息

select object_name,object_type,tablespace_name,sum(value)  
from v$segment_statistics  
where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'  
group by object_name,object_type,tablespace_name  
order by 4 desc

八、分区表的其他信息查询

--显示数据库所有分区表的信息:  
select * from DBA_PART_TABLES  
  
--显示当前用户可访问的所有分区表信息:  
select * from ALL_PART_TABLES  
  
--显示当前用户所有分区表的信息:  
select * from USER_PART_TABLES  
  
--显示表分区信息 显示数据库所有分区表的详细分区信息:  
select * from DBA_TAB_PARTITIONS  
  
--显示当前用户可访问的所有分区表的详细分区信息:  
select * from ALL_TAB_PARTITIONS  
  
--显示当前用户所有分区表的详细分区信息:  
select * from USER_TAB_PARTITIONS  
  
--显示子分区信息 显示数据库所有组合分区表的子分区信息:  
select * from DBA_TAB_SUBPARTITIONS  
  
--显示当前用户可访问的所有组合分区表的子分区信息:  
select * from ALL_TAB_SUBPARTITIONS  
  
--显示当前用户所有组合分区表的子分区信息:  
select * from USER_TAB_SUBPARTITIONS  
  
--显示分区列 显示数据库所有分区表的分区列信息:  
select * from DBA_PART_KEY_COLUMNS  
  
--显示当前用户可访问的所有分区表的分区列信息:  
select * from ALL_PART_KEY_COLUMNS  
  
--显示当前用户所有分区表的分区列信息:  
select * from USER_PART_KEY_COLUMNS  
  
--显示子分区列 显示数据库所有分区表的子分区列信息:  
select * from DBA_SUBPART_KEY_COLUMNS  
  
--显示当前用户可访问的所有分区表的子分区列信息:  
select * from ALL_SUBPART_KEY_COLUMNS  
  
--显示当前用户所有分区表的子分区列信息:  
select * from USER_SUBPART_KEY_COLUMNS  
  
--怎样查询出oracle数据库中所有的的分区表  
select * from user_tables a where a.partitioned='YES'  
  
--删除一个表的数据是  
truncate table table_name;  
  
--删除分区表一个分区的数据是  
alter table table_name truncate partition p5;