分区表分list,range,hash 分区
list是按列值分区,叫列表分区,分区列不能重复,没法分的放default里,default存在时不能再加新的分区
range是按范围分区,叫范围分区,没法分的放maxvalue里面
hash是将数据平均分配到指定的区域里,hash分区又叫散列分区,尽可能将数据平均放到各个分区里面,具体怎么放oracle说了算
参数含义:
nologging:不要日志
nocompress:不压缩
pctfree:块中保留用于UPDATE操作的空间百分比,当数据占用的空间达到此上限时,新的数据将不能插入此块中,但是单位是什么?m?条?数值是10
initrans:每个块中处理行级锁事务,值是1表示表,值是2表示索引
maxtrans:最大并发事务
storage(
initial:分给segment的第一个extent的大小
next:下一个extent的大小
minextents:第一次创建时分配的大小
maxextents:随着数据量的增长,虽多可分配的extent的数量,unlimited是无限制
pctincrease:指定第三个及以后的extent相对于上一个所增长的百分比,如果值是0,那么所有新增的都和next一样
buffe_pool:定义缺省缓冲池
flash_cache:不知道,没搜到
cell_flash_cache :不知道没搜到
)
extent:就是block集
建list分区表:
建表的时候就要建成分区表,不能建普通表再转成分区表,麻烦
CREATE TABLE 表名(字段 字段类型)
PARTITION BY LIST(要按哪个字段分区的字段名)
(
PATITION 分区名 VALUES ('值')
TABLESPACE 表空间名
);
其他参数上面写了,就不重复了
建有default分区的list分区表
CREATE TABLE 表名(字段 字段类型)
PARTITION BY LIST(要按哪个字段分区的字段名)
(
PATITION 分区名 VALUES ('值')
PARTITION 分区名 VALUES(DEFAULT)
);
注意:default不能有引号,就是不能写成PARTITION 分区名 VALUES('DEFAULT'),否则就会把default当做值了
有了default分区后不能增加分区
如果一定要增加有两种方式
(方式一):
可以通过先建临时表备份数据,再drop default分区,再新增分区,再增加default分区并将数据恢复的方式
备份数据采用CREATE TABLE 表名AS SELECT * FROM 分区表名 PARTITION (分区名) 的方式,不要加where 1=2,加上之后就只是建和分区表同表结构的表而已,不会将数据插到新表里面,与我们备份数据的目的不符,这种方式要快于先建表,再查处数据并插入到新表里面的方式
drop分区下面有讲
恢复数据用交换的方式,交换的原理是A表有数据,B表没数据,交换后变成A表没数据,B表有数据,就是把我的全给你,你的全给我,如果你本来没有,那给我的就是空
ALTER TABLE 分区表名 EXCHANGE PARTITION DEFAULT的分区名 WITH TABLE 临时表表名
(方式二):
分裂分区,将原来的default分区按值分裂成两个分区,满足值条件的分成一个,不满足的留在default里面
ALTER TABLE 分区表名 SPLIT PARTITION DEFAULT的分区名 VALUES ('值') INTO (PARTITION 新分区名,PARTITION DEFAULT的分区名)
建range分区表:
CREATE TABLE 表名(字段 字段类型)
PARTITION BY RANGE (要按哪个字段分区的字段名)
(
PARTITION 分区名 VALUES LESS THAN ('值')
);
加maxvalue分区的语句是:
ALTER TABLE 表名 ADD PARTITION 分区名 VALUES LESS THAN (MAXVALUE)
注意:建表时如果给了maxvalue时就不能加分区了,因为没有比maxvalue更大的值了
分裂maxvalue分区的语句是:
ALTER TABLE 分区表名 SPLIT PARTITION DEFAULT的分区名 AT('值') INTO (PARTITION 新分区名,PARTITION DEFAULT的分区名)
建hash分区表:
CREATE TABLE 表名(字段 字段类型)
PARTITION BY HASH(要按哪个字段分区的字段名)
(
PARTITION 分区名,
PARTITION 分区名
);
给list分区表加分区:
ALTER TABLE 用户名.表名 ADD PARTITION 分区名 VALUES ('分区名') TABLESPACE 表空间名
给range分区表加分区:
ALTER TABLE 用户名.表名 ADD PARTITION 分区名 VALUES LESS THAN (值)
注意:range分区表加分区时只能加一个比上次更大的分区,比如按日期分区,上次是20170101,下次加分区就要加20170101以后的日期,不能是小于20170101的日期,例如2016年的日期,否则会报错
给hash分区表加分区:
ALTER TABLE 用户名.表名 ADD PARTITION 分区名;
删除分区:
ALTER TABLE 用户名.表名 DROP PARTITION 分区名
注意:这样删除会删除掉分区以及分区内所有数据,分区名不需要加括号或者是引号等符号,直接打上去就可以,不会影响其他分区
删除分区内所有数据但保留分区:
DELETE FROM 用户名.表名 PARTITION (分区名)
注意:分区名要有括号,但不要引号,这样删除会保留分区,然后删除分区内所有数据,不会影响其他分区
查分区内所有数据:
SELECT * FROM 表名 PARTITION (分区名)
查询分区表相关信息在DBA_PART_TABLES
查询分区表的分区相关信息在DBA_TAB_PARTITIONS