oracle表分区之后怎么用,Oracle分区表用法

分区表的用处

我们oracle中的表数据最终是保存到磁盘文件中.默认情况下表中的数据都是放到一起的,但表中的数据一多,对表的操作就会变得较慢.而分区表是把一个表中的数据保存到不同地方去.这样会带来如下好处.

1.减小表中数据损坏的可能性,数据分散到不同地方了嘛.另外可以单独对不同的分区做备份与恢复操作.

2.提高IO性能,表分我后可能就保存到不同的磁盘上去了.这样可以并行的读取表中数据.

当表中数据大于2G时建议使用分区表.

分区表类型

我们可能会想到既然要把一个表中数据分散到不同地方,那根据个啥标准来分呢.总共有这么4大类标准.

Oracle分区表分为四类:范围分区表;列表分区表;哈希分区表;组合分区表

range范围分区表

就是根据某一列的值来做判断,把不同的行保存到不同的地方

假如创建一个分区表,以列id值来做判断依据分区

createtablepart_tb(idnumber,infovarchar2(500))partitionbyrange(id)

(

partitionpart1valueslessthan(100)tablespaceusers,

partitionpart2valueslessthan(200)tablespacesystem,

partitionpart3valueslessthan(maxvalue)tablespacesystem

)

往表中插入如下两行数据

insertintopart_tbvalues(38,'vlaues is 38');  --存入分区part1

insertintopart_tbvalues(520,'vlaues is 520'); --存入分区part2

查找数据

我们可以把分区表当作一般表来操作.直接查询select * from part_tb;--返回两行数据

但还有一种特殊操作,直接指定查找哪个分区中的信息

select*frompart_tbpartition(part1); --此时只返回id小于100的数据

分区的修改

(注:这时的分区修改是针对所有类型的分区表有效)

添加分区

假如你创建表之后又突然想在原有的表上增加分区可以这样

altertablepart_tbaddpartitionpart4valueslessthan(300);

不过你执行下发会会报错,会提示

ORA-14074: partition bound must collate higher than that of the last partition

因为之前创建表时你用到了lessthan(maxvalue).如果没有这个东东就能成功添加

那现在出现这种情况时怎么解决呢,有两种方法,一是先删除分区part3于添加,另一个是split分区.

删除分区

altertablepart_tbdroppartitionPART3;

拆分分区 :split

合并分区: merge

list列表分区表

列表分区跟范围分区也类似,只不过范围分区一般适用于针对一些数值范围,而列表分区一般用于判断某些字符串.

假如创建一个表,通过判断城市信息来分区

createtableuser_info(idnumber,user_namevarchar2(500),cityvarchar2(100))partitionbylist(city)

(

partitionpart1values('BeiJing')tablespaceusers,

partitionpart2values('ChangSha')tablespacesystem,

partitionpart3values(default)tablespacesystem

)

插入数据

insertintouser_infovalues(1,'arwen','BeiJing');--part1

insertintouser_infovalues(1,'weiwen','ChangSha');-- part2

查找数据

select*fromuser_infopartition(part2);

看到这里你是不想到如果一个超级大的表中有用户信息,如果是普通表要查找某一类用户的信息要等半天才有反应.弄成分区表是不是可以一下子就查出结果来了啊.

hash哈希分区表

前面讲的范围分区表,列表分区表都是某一列具有确定的信息可以做为依据.但假如某一列的信息是杂乱无章的,你想让随机分区下咋整呢.这就可以用哈希分区.

假如创建如下哈希分区表

createtableorder_info(order_numbernumber,infovarchar2(100))partitionbyhash(order_number)

(

partitionpart1tablespaceusers,

partitionpart2tablespacesystem

)

插入数据

insertintoorder_infovalues(12,'buy car');

insertintoorder_infovalues(888,'buy house');

查找数据

select*fromorder_infopartition(part1);

由于数据是随机存取的所以你不能保证哪些行存到哪个分区.

组合分区表

综合上面三种分区方法,大的分区下面又有小分区.

在Oracle 10g中有如下两种组合方法

范围-哈希复合分区(range-hash)

范围-列表复合分区(range-list)

在Oracle 11g中

又增加了range-range,list-range,

list-list,list-hash,并且11g里面还支持Interval分区和虚拟列分区

下面举个简单的例子看下范围-列表复合分区(range-list).

createtablecompound(arrange_idnumber,list_infovarchar2(500))

partitionbyrange(arrange_id)subpartitionbylist(list_info)

(

partitionpart1valueslessthan(100)

(subpartitionpart11values('car'),

subpartitionpart12values(default)

),

partitionpart2valueslessthan(200)

);

插入数据

insertintocompoundvalues(50,'car');

insertintocompoundvalues(60,'books');

查找数据

select*fromcompoundpartition(part1)

select*fromcompoundsubpartition(part11)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值