关于数据库分区表的一些操作,如下:
一、创建分区
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;