文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Oracle表空间详解

2023-04-19 05:09

关注

1. 基本概念

oracle表分区是将一个大型表分割成更小、更易于管理的部分的技术。分区后的表被称为分区表,其中每个分区都可以独立地进行维护、管理和查询。表分区可基于表中的一列或多列,称为分区键,分区键的值确定了每行数据属于哪个分区。

使用分区具有以下优点:

Oracle数据库提供对表或索引的分区常用方法主要有三种:

先建三个表空间:

create tablespace ma_tra01 datafile 'D:\oracle\product\10.2.0\oradata\orcl\ma_tra01.dnf' size 50M; 
create tablespace ma_tra02 datafile 'D:\oracle\product\10.2.0\oradata\orcl\ma_tra02.dnf' size 50M; 
create tablespace ma_tra03 datafile 'D:\oracle\product\10.2.0\oradata\orcl\ma_tra03.dnf' size 50M;

2. 范围分区

范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。如根据序号分区,根据业务记录的创建日期进行分区等。

e.g.

需求描述:有一个物料交易表,表名:material_transactions。该表将来可能有千万级的数据记录数。要求在建该表的时候使用分区表。 这时候我们可以使用序号分区三个区,每个区中预计存储三千万的数据,也可以使用日期分区,如每五年的数据存储在一个分区上。

create table material_transactions ( 
transaction_id number primary key,
item_id number(8) not null,
item_description varchar2(300),
transaction_date date not null 
) 
partition by range (transaction_id) ( 
partition part_01 values less than(30000000) tablespace ma_tra01,
partition part_02 values less than(60000000) tablespace ma_tra02, 
partition part_03 values less than(maxvalue) tablespace ma_tra03); 
create table material_transactions (
transaction_id number primary key, 
item_id number(8) not null,
item_description varchar2(300), 
transaction_date date not null ) 
partition by range (transaction_date) (
partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace ma_tra01,
partition part_02 values less than(to_date('2010-01-01','yyyy-mm-dd')) tablespace ma_tra02,
partition part_03 values less than(maxvalue) tablespace ma_tra03); 

这样分别建了以交易序号和交易日期来分区的分区表。

insert into material_transactions values(1,12,'BOOKS1',sysdate); 
insert into material_transactions Values(2,12, 'BOOKS2',sysdate+30); 
insert into material_transactions values(3,12, 'BOOKS3',to_date('2006-05-30','yyyy-mm-dd')); 
insert into material_transactions values(4,12, 'BOOKS4',to_date('2007-06-23','yyyy-mm-dd')); 
insert into material_transactions values(5,12, 'BOOKS5',to_date('2011-02-26','yyyy-mm-dd')); 
insert into material_transactions values(6,12, 'BOOKS6',to_date('2011-04-30','yyyy-mm-dd')); 
Commit;
select * from material_transactions partition(part_03) t

可以对分区表进行跟新或删除,默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报ORA-14402错误: 更新分区关键字列将导致分区的更改。但是可以通过打开表的row movement属性来允许对分区字段的update操作,但是这样会导致无效对象的产生,所以不推荐使用。可通过删除旧数据,插入新数据来解决。

还可以根据需求,使用两个字段的范围分布来分区,如partition by range ( transaction_id ,transaction_date), 分区条件中的值也做相应的改变。

Alter Table  material_transactions Add Partition part_04 Values Less Than (to_date('20150101','yyyymmdd')) Tablespace ma_tra04

增加分区的条件必须大于现有分区的最大条件值,否则会提示ORA-14074:分区界限必须调整为高于最后一个分区界限

Alter Table material_transactions Merge Partitions part_01,part_02 Into Partition part_02;

3. Hash分区(散列分区)

散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。如将物料交易表的数据根据交易ID散列地存放在指定的三个表空间中:

create table material_transactions_hash (
transaction_id number primary key,
item_id number(8) not null,
item_description varchar2(300), 
transaction_date Date) 
partition by hash(transaction_id) (
partition part_01 tablespace ma_tra01, 
partition part_02 tablespace ma_tra02, 
partition part_03 tablespace ma_tra03); 

建表成功,此时插入数据,系统将按transaction_id将记录散列地插入三个分区中,这里也就是三个不同的表空间中。

4. 复合分区

有时需要根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。复合分区是先使用范围分区,然后在每个分区内 再使用散列分区的一种分区方法,如将物料交易的记录按时间分区,然后每个分区中的数据分三个子分区,将数据散列地存储在三个指定的表空间中:

create table material_transactions_test  (
transaction_id number primary key,
item_id number(8) not null,
item_description varchar2(300), 
transaction_date date ) 
partition by range(transaction_date) subpartition by hash(transaction_id) 
subpartitions 3 store in (ma_tra01,ma_tra02,ma_tra03) (
partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')), 
partition part_02 values less than(to_date('2010-01-01','yyyy-mm-dd')), 
partition part_03 values less than(maxvalue) ); 

该例中,先是根据交易日期进行范围分区,然后根据交易的ID将记录散列地存储在三个表空间中。

分区表可以建立局部索引与全局索引,当分区表中出现许多事务并且要保证所有分区中的数据记录的唯一性时需要采用全局索引。

Create Index idx_matra_itemid On material_transactions(item_id) Local;
Create Index idx_matra_itemid On material_transactions(item_id);

到此这篇关于Oracle表空间详解的文章就介绍到这了,更多相关Oracle表空间内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯