一:分区表创建
先建三个表空间
createtablespace dinya_space01 datafile'E:\dinya01.dnf'size50M autoallocate;
createtablespace dinya_space02 datafile'E:\dinya02.dnf'size50M autoallocate;
createtablespace dinya_space03 datafile'E:\dinya03.dnf'size50M autoallocate;
建立分区表(按范围存储)
createtable kkkk
(
transaction_id numberprimarykey,
item_id number(8)notnull,
item_description varchar2(300),
transaction_date datenotnull
)
partitionbyrange(transaction_id)
(
partition part_01 valueslessthan(30000000)tablespace dinya_space01,
partition part_02 valueslessthan(60000000)tablespace dinya_space02,
partition part_03 valueslessthan(maxvalue)tablespace dinya_space03 )
建立分区表(按日期存储)
createtable PPP
(
transaction_id numberprimarykey,
item_id number(8)notnull,
item_description varchar2(300),
transaction_date datenotnull
)
partitionbyrange(transaction_date)
(
partition part_01 valueslessthan(to_date('2006-01-01','yyyy-mm-dd'))
tablespace dinya_space01,
partition part_02 valueslessthan(to_date('2010-01-01','yyyy-mm-dd'))
tablespace dinya_space02,
partition part_03 valueslessthan(maxvalue)tablespace dinya_space03
);
查询分区表
select table_name,partition_name,tablespace_name from user_tab_partitions;
SELECT*FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='KKKK'
select*from user_tables a where a.partitioned='YES'
select*from DBA_PART_TABLES
select table_name,partitioned from user_tables;
插入数据
insert into KKKK values(3,12, 'BOOKS',to_date('2006-05-30','yyyy-mm-dd'));
insert into KKKK values(4,12, 'BOOKS',to_date('2007-06-23','yyyy-mm-dd'));
insert into KKKK values(5,12, 'BOOKS',to_date('2007-06-23','yyyy-mm-dd'));
insert into KKKK values(13,12, 'BOOKS',to_date('2006-05-30','yyyy-mm-dd'));
insert into KKKK values(14,12, 'BOOKS',to_date('2007-06-23','yyyy-mm-dd'));
insert into KKKK values(15,12, 'BOOKS',to_date('2007-06-23','yyyy-mm-dd'));
insert into KKKK values(54000000,12, 'BOOKS',to_date('2011-02-26','yyyy-mm-dd'));
insert into KKKK values(54000100,12, 'BOOKS',to_date('2011-02-26','yyyy-mm-dd'));
insert into KKKK values(54001000,12, 'BOOKS',to_date('2011-02-26','yyyy-mm-dd'));
insert into KKKK values(54000010,12, 'BOOKS',to_date('2011-02-26','yyyy-mm-dd'));
insert into KKKK values(54001020,12, 'BOOKS',to_date('2011-02-26','yyyy-mm-dd'));
insert into KKKK values(9999999999999,12, 'BOOKS',to_date('2011-04-30','yyyy-mm-dd'));
insert into KKKK values(9999999199999,12, 'BOOKS',to_date('2011-04-30','yyyy-mm-dd'));
insert into KKKK values(9999999299999,12, 'BOOKS',to_date('2011-04-30','yyyy-mm-dd'));
查询分区数据
select*from KKKK
select*from KKKK partition(part_01);
select*from KKKK partition(part_02);
select*from KKKK partition(part_03);
分区表分区及数据移动到另一个表空间
altertable GIS_CAMERA_RENAME movepartition CUS_PART1 tablespace sde ;
查询分区是否存在
select*from user_segments where segment_type='TABLE PARTITION'and partition_name like'PART%'
删除分区表:
此可以彻底删除分区表及分区
droptable KKKK purge;
此只删除分区表但不删除分区
truncatetable KKKK;
整个表创建索引:
Create index dinya_idx_t on dinya_test(item_id);
重建索引:
alter index xxx rebuild
查询所有索引
select*from all_indexes
删除分区:
alter table ABCD drop partition "p3";
增加分区:
ALTER TABLE ABCD add partition "p3" values less than (to_date('2014-01-01', 'yyyy-mm-dd') ) tablespace CAS;
合并分区:
alter table ABCD MERGE PARTITIONS "p1","p2" into partition "p2"
合并后的分区名,不能是边界值较低的那个
将一个分区分为两个分区:
alter table ABCD split Partition "p2" at (to_date('2012-07-01', 'yyyy-mm-dd'))
into (Partition "p5" tablespace CAS2,
Partition "p6" tablespace CAS2);
注:原分区将自动删除
分区改名:
alter table ABCD rename Partition "p6" to "p7"
在此顺便再提一下truncate操作后不释放空间的解决办法
Truncate不支持回滚,并且不能truncate一个带有外键的表,如果要删除首先要取消外键,然后再删除。
truncate table 后,有可能表空间仍没有释放,可以使用如下语句:
alter table 表名称 deallocate UNUSED KEEP 0;
注意如果不加KEEP 0的话,表空间是不会释放的。
例如:
alter table tablename deallocate UNUSED KEEP 0;
或者:
TRUNCATE TABLE tablename DROP STORAGE才能释放表空间。
例如: truncate table tablename DROP STORAGE;
注:在删除带有分区表的表空间时必须删除表空间下所有的分区表,否则报错ora-14404
若分区表跨不同表空间,做导出、导入时目标数据库必须预建这些表空间。分区表各区所在表空间在做导入时目标数据库一定要预建这些表空间!这些表空间不一定是用户的默认表空间,只要存在即可。如果有一个不存在,就会报错!
分区表导出脚本:
expdp sde/sde directory=DIR dumpfile= GIS_CAMERA_RENAME.dmp logfile=kkkk.log tables= GIS_CAMERA_RENAME parallel=3
在分区表中的所属表空间可以不属于任何用户,但分区表属于某个用户就行
在导入数据时只需预建好目标表空间和相关用户即可,这样分区表就可以顺利导入(不需要单独导入备份文件然后再导入分区表备份文件,只要分区表在整个备份文件某个用户中.分区表在某个用户下,该用户下还有其他普通表,只需要把该用户备份还原将就可以了,不需要再单独还原分区表了)
分区表实际上是没有数据的, 所以dba_tables里,他的表空间是null, 实际数据是在分区中的,所以dba_tab_partitions里有