欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ORACLE 分区表的设计

程序员文章站 2023-12-06 12:46:04
分区表的概念 分区致力于解决支持极大表和索引的关键问题。它采用他们分解成较小和易于管理的称为分区的片(piece)的方法。一旦分区被定义,sql语句就可以访问的操作某一个分...
分区表的概念
分区致力于解决支持极大表和索引的关键问题。它采用他们分解成较小和易于管理的称为分区的片(piece)的方法。一旦分区被定义,sql语句就可以访问的操作某一个分区而不是整个表,因而提高管理的效率。分区对于数据仓库应用程序非常有效,因为他们常常存储和分析巨量的历史数据。

分区表的分类
range partitioning(范围分区)
hash partitioning(哈希分区)
list partitioning(列表分区)
composite range-hash partitioning(范围-哈希组合分区)
composite range-list partitioning(范围-列表组合分区)

何时选择范围分区
必须可以将表的记录按照某一列值的范围进行划分。你想处理一些数据,这些数据经常是属于某一个范围内,例如月份。如果数据能够按照分区的范围均匀分布的话,那会获得最佳性能。如果数据分布很不均匀的话,你可能不得不选择其他分区方式。
create table sales
( invoice_no number,
sale_year int not null,
sale_month int not null,
sale_day int not null )
partition by range (sale_year, sale_month, sale_day)
( partition sales_q1 values less than (1999, 04, 01)
tablespace tsa,
partition sales_q2 values less than (1999, 07, 01)
tablespace tsb,
partition sales_q3 values less than (1999, 10, 01)
tablespace tsc,
partition sales_q4 values less than (2000, 01, 01)
tablespace tsd );

何时选择hash分区
如果数据不容易用范围分区,但你想提升性能和表的易管理性。 hash分区提供了一个在指定数量的分区内交叉均匀分布数据的方法。行根据分区键的hash值映射到相应分区中。创建和使用hash分区你可以灵活放置数据,可以通过交叉访问在不同i/o设备上的分区提升性能。
create table scubagear (id number, name varchar2 (60))
partition by hash (id)
partitions 4 store in (gear1, gear2, gear3, gear4);

何时选择列表分区
使用list分区你可以直接控制某些数据映射到某些分区。你可以为某个分区指定不连续的分区键值。这不同于range分区(用键值的范围划分分区),也不同于hash分区(不能控制某行映射到哪个分区)。
create table q1_sales_by_region
(deptno number, deptname varchar2(20), quarterly_sales number(10, 2), state varchar2(2))
partition by list (state)
(partition q1_northwest values ('or', 'wa'),
partition q1_southwest values ('az', 'ut', 'nm'),
partition q1_northeast values ('ny', 'vm', 'nj'),
partition q1_southeast values ('fl', 'ga'),
partition q1_northcentral values ('sd', 'wi'),
partition q1_southcentral values ('ok', 'tx'));

分区表的设计
如何选择分区的类型,如何选择分区的列呢?在这之前你必须明确你的目的——易管理性和性能,你更注重哪个方面?分区表所影响的方面可以归类为以下几种:性能、易管理性、数据清理。
下面分别说说分区表对每一项的具体影响,
性能:
这一般是分区的主要目的。分区将大表变成了小表,当where之后的条件体现分区字段的具体值时,避免了全表扫描。
易于管理:
对于包含海量数据的大表,分区带来的易于管理性是非常明显的。当你建议一个基于非分区表的索引时,唯一的选择就是创建整个索引。如果表被分区,你就可以根据分区并行为此表创建索引,例如:
alter index par_ind_01 reuild partition yy05;
除此之外你还可以同时的做很多事情,像改变表所在表空间、导出表,删除表数据等等。
数据清理:
我们经常会需要删除表的一些历史数据,一般做法是delete,但是这会导致undo和redo的信息快速增长,而且影响数据库整体性能。这时我们就可以利用drop某个分区来完成此任务,例如:
alter table tab_a drop partition yy01;
当一个表的分区被删除,对应的local索引也同时被删除。如果还存在着global索引,那么它会变成unusable状态。为了避免此事情的发生,你可以使用:
alter table tab_a drop partition yy01 update global indexes;