1:查看表空间情况
select tablespace_name,
file_id,
file_name,
round(bytes / (1024 * 1024), 0) total_space
from dba_data_files
order by tablespace_name
2:创建表空间
CREATE TABLESPACE gxpt_in_gxzy_data
LOGGING
DATAFILE '/ora_data/SFGXPT/gxpt_in_gxzy_data_001.dbf' SIZE 10240M REUSE AUTOEXTEND
ON NEXT 2048M MAXSIZE UNLIMITED EXTENT MANAGEMENT
LOCAL SEGMENT SPACE MANAGEMENT AUTO ;
3:将普通表转换为分区表
方式1:不指定表空间
create table t_yj_part(id, name, dept, salery, postion, createdate) partition by range(createdate)
(partition t_yj_part_1 values less than (to_date('2016-01-29','yyyy-mm-dd')),
partition t_yj_part_2 values less than (to_date('2016-02-29','yyyy-mm-dd')),
partition t_yj_part_3 values less than (to_date('2016-03-29','yyyy-mm-dd')),
partition t_yj_part_4 values less than (to_date('2016-04-29','yyyy-mm-dd')),
partition t_yj_part_5 values less than (to_date('2016-05-29','yyyy-mm-dd')),
partition t_yj_part_6 values less than (to_date('2016-06-29','yyyy-mm-dd')),
partition t_yj_part_7 values less than (to_date('2016-07-29','yyyy-mm-dd')),
partition t_yj_part_8 values less than (to_date('2016-08-29','yyyy-mm-dd')),
partition t_yj_part_9 values less than (to_date('2016-09-29','yyyy-mm-dd')))
as select id, name, dept, salery, postion, createdate from t_yj;
方式1:指定表空间
create table t_yj_part(id, name, dept, salery, postion, createdate) partition by range(createdate)
(partition t_yj_part_1 values less than (to_date('2016-01-29','yyyy-mm-dd')) TABLESPACE gxpt_fq_part1,
partition t_yj_part_2 values less than (to_date('2016-02-29','yyyy-mm-dd')) TABLESPACE gxpt_fq_part1,
partition t_yj_part_3 values less than (to_date('2016-03-29','yyyy-mm-dd')) TABLESPACE gxpt_fq_part1,
partition t_yj_part_4 values less than (to_date('2016-04-29','yyyy-mm-dd')) TABLESPACE gxpt_fq_part1,
partition t_yj_part_5 values less than (to_date('2016-05-29','yyyy-mm-dd')) TABLESPACE gxpt_fq_part1,
partition t_yj_part_6 values less than (to_date('2016-06-29','yyyy-mm-dd')) TABLESPACE gxpt_fq_part1,
partition t_yj_part_7 values less than (to_date('2016-07-29','yyyy-mm-dd')) TABLESPACE gxpt_fq_part2,
partition t_yj_part_8 values less than (to_date('2016-08-29','yyyy-mm-dd')) TABLESPACE gxpt_fq_part2,
partition t_yj_part_9 values less than (to_date('2016-09-29','yyyy-mm-dd')) TABLESPACE gxpt_fq_part2)
as select id, name, dept, salery, postion, createdate from t_yj;
4:创建分区索引
分区索引和全局索引:
a:分区索引就是在所有每个区上单独创建索引,它能自动维护,在drop或truncate某个分区时不影响该索引的其他分区索引的使用,也就是索引不会失效,维护起来比较方便,但是在查询性能稍微有点影响。
-- Create/Recreate indexes
create index idx_ta_c2 on ta(c2) local (partition p1,partition p2,partition p3,partition p4); 或者 create index idx_ta_c2 on ta(c2) local ;
另外在create unique index idx_ta_c2 on ta(c2) local ;系统会报ORA-14039错误,这是因为ta表的分区列是c1,oracle不支持在分区表上创建PK主键时主键列不包含分区列,创建另外的约束 (unique)也不可以。
b:全局索引就是在全表上创建索引,它可以创建自己的分区,可以和分区表的分区不一样,也就是它是独立的索引。在drop或truncate某个分区时需要创建索引alter index idx_xx rebuild,也可以alter table table_name drop partition partition_name update global indexes;实现,但是要花很长时间在重建索引上。可以通过查询user_indexes、user_part_indexes和 user_ind_partitions视图来查看索引是否有效。
create index idx_ta_c3 on ta(c3);
或者把全局索引分成多个区(注意和分区表的分区不一样):
create index idx_ta_c4 on ta(c4) global partition by range(c4)(partition ip1 values less than(10000),partition ip2 values less than(20000),partition ip3 values less than(maxvalue));
注意索引上的引导列要和range后列一致,否则会有ORA-14038错误。
oracle会对主键自动创建全局索引
如果想在主键的列上创建分区索引,除非主键包括分区键,还有就是主键建在两个或以上列上。
在频繁删除表的分区且数据更新比较频繁时为了维护方便避免使用全局索引。
显示Oracle查看分区表信息
显示数据库所有分区表的信息:DBA_PART_TABLES
显示当前用户可访问的所有分区表信息:ALL_PART_TABLES
显示当前用户所有分区表的信息:USER_PART_TABLES
显示Oracle查看分区表信息 显示数据库所有分区表的详细分区信息: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
---------------------------------------------------------------------------------------------------
怎样查询出Oracle数据库中所有的的分区表
select * from user_tables a where a.partitioned='YES'删除一个表的数据是truncate table table_name;
删除分区表一个分区的数据是alter table table_name truncate partition p5;
如果我要将分区表中各个分区的数据都清空,可以用truncate table table_name;吗?
还是必须从头执行
alter table table_name truncate partition p1;
alter table table_name truncate partition p2;
alter table table_name truncate partition p3;
alter table table_name truncate partition p4;
alter table table_name truncate partition p5;
alter table table_name truncate partition p6;
答:truncate table table_name