`

Oracle之range,hash,list分区现实应用及优缺点汇总

阅读更多
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp51

[align=center;]
Oracle之range,hash,list分区现实应用及优缺点汇总
[/align]


引言:Oracle的range,hash,list三大分区可能我们大家在熟悉不过了,但什么每种分区适用于什么场景可能是很多人的疑惑点,那么在选择不同的分区时应该注意什么,为什么这么选,有哪些需要我们加以注意的地方,让我们一一来探索一下吧:)

A.创建range分区,一般用于日期化处理,range分区可以很好的管理基于日期来分区的数据
创建一个新用户ls
SYS@LEO> create user ls identified by ls;
SYS@LEO> grant dba to ls;
SYS@LEO> conn ls/ls
创建样本数据表
create table liusheng (orderid number(10),name varchar2(10),ls_date date);
insert into liusheng values (1,'ls1',to_date('1981-01-02','yyyy-mm-dd'));
insert into liusheng values (1,'ls2',to_date('1998-01-03','yyyy-mm-dd'));
insert into liusheng values (1,'ls3',to_date('1999-01-04','yyyy-mm-dd'));
insert into liusheng values (1,'ls4',to_date('2000-01-05','yyyy-mm-dd'));
insert into liusheng values (1,'ls5',to_date('2000-01-06','yyyy-mm-dd'));
insert into liusheng values (1,'ls6',to_date('2001-01-07','yyyy-mm-dd'));
insert into liusheng values (1,'ls7',to_date('2001-01-08','yyyy-mm-dd'));
insert into liusheng values (1,'ls8',to_date('2002-01-09','yyyy-mm-dd'));
insert into liusheng values (1,'ls9',to_date('2002-01-10','yyyy-mm-dd'));
insert into liusheng values (1,'ls10',to_date('2011-01-11','yyyy-mm-dd'));
创建range分区表
create table liusheng_part
partition by range (ls_date)
(
partition liusheng_part_1999_1 values less than (to_date('1999-01-01','yyyy-mm-dd')) ,
partition liusheng_part_2000_1 values less than (to_date('2000-01-01','yyyy-mm-dd')) ,
partition liusheng_part_2001_1 values less than (to_date('2001-01-01','yyyy-mm-dd')) ,
partition liusheng_part_2002_1 values less than (to_date('2002-01-01','yyyy-mm-dd')) ,
partition liusheng_part_2003_1 values less than (to_date('2003-01-01','yyyy-mm-dd')) ,
partition other values less than (maxvalue)
)
as select * from liusheng;
查看分区
select * from liusheng_part partition (liusheng_part_1999_1);
select * from liusheng_part partition (liusheng_part_2000_1);
select * from liusheng_part partition (liusheng_part_2001_1);
select * from liusheng_part partition (liusheng_part_2002_1);
select * from liusheng_part partition (liusheng_part_2003_1);
select * from liusheng_part partition (other);


B.创建hash分区,利用hash函数打散某列使数据均匀分布,一般用于均衡I/O,缺点数据不容易管理,哈希分区不能DROP、SPLIT 以及MERGE分区
我们创建了拥有10个分区的哈希分区表“LIUSHENG_HASH”
LS@LEO> create table liusheng_hash partition by hash(object_id) partitions 10 as select * from dba_objects;
hash分区所占用的区个数,看每个分区占用的个数都差不多,说明数据还是比较均匀分布的
缺点:hash列上数值不能有太多的重复值,否则会导致数据分布不均匀
select partition_name,count(*) from user_extents where segment_name='LIUSHENG_HASH' group by partition_name;
PARTITION_NAME                   COUNT(*)
------------------------------ ----------
SYS_P27                                 3
SYS_P26                                 3
SYS_P22                                 2
SYS_P28                                 3
SYS_P29                                 2
SYS_P21                                 2
SYS_P23                                 3
SYS_P25                                 3
SYS_P30                                 2
SYS_P24                                 3
select count(*) from liusheng_hash;

COUNT(*)
----------
       9860


C.创建list分区,一般用于数据可枚举,有限个值,可以考虑列表分区,例如国家名字,按州来分区
创建list分区表,我们按国家来分别存放在不同的州,每个州是一个分区
create table liusheng_list
(city_id NUMBER(5),
city_name VARCHAR2(30),
city_state VARCHAR2(20),
city_amount NUMBER(10)
)
partition by list (city_name)
(
partition  asia VALUES('china','japan'),
partition  europe VALUES ('germany','italy'),
partition  africa VALUES('libya','brazil'),
partition  other  VALUES(DEFAULT)              --默认分区
);
插入数据
insert into liusheng_list values(1,'china','asia',100);
insert into liusheng_list values(2,'germany','europe',101);
insert into liusheng_list values(3,'libya','africa',102);
insert into liusheng_list values(4,'liusheng_city','other',103);
查看数据
LS@LEO> select * from liusheng_list;

   CITY_ID COUNTRY_NAME                   STATE                CITY_AMOUNT
---------- ------------------------------ -------------------- -----------
          1 china                                               asia                         100
          2 germany                                      europe                       101
          3 libya                                                 africa                       102
          4 liusheng_city                                 other                        103

小结:测试了上面的三大分区后,我相信现在不仅仅有感性的认识而且也加深了理性的认识,分区是个好东西,合理的利用可以提高我们管理收益(但不一定会提高查询收益),使用不当也会给我们添加许多麻烦,三思而后行是做DBA的一个好习惯。

补充:分区之优势
分区技术实质可以把数据分摊到不同的物理位置,增加I/O负载,提高检索效率。
可用性:分区表可以跨越表空间,而普通表则不然,好处就是如果表的一个分区损坏,其他分区不会受到影响我们只需要修复损坏的分区即



分享到:
评论

相关推荐

    Oracle分区表详解

    #### 二、Oracle 分区的优缺点 ##### 优点: - **增强可用性**:即使某个分区出现故障,其他分区的数据仍然可用。 - **简化维护**:如果某个分区发生问题,只需对该分区进行修复即可。 - **均衡 I/O**:可以通过将...

    oracle数据库表按年分区脚本实战例子

    Oracle支持多种分区策略,包括范围分区(Range Partitioning)、列表分区(List Partitioning)、哈希分区(Hash Partitioning)以及复合分区(Composite Partitioning)。在本例中,我们关注的是范围分区,特别是在...

    Oracle10个分区和Mysql分区区别详解

    2. List分区:List分区则是根据列值的明确定义列表来进行划分,每个分区对应一个或多个特定的值。这种分区适用于列值是离散且已知的情况,比如城市代码。需要预先定义所有可能的值,或者创建一个`default`分区来处理...

    Oracle分区表及分区索引

    Oracle 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) ...

    Oracle分区表和分区索引在VLDB中的研究.pdf

    然后,讨论了Oracle分区表的类型,包括范围分区(Range)、散列分区(Hash)、列表分区(List)、组合分区(Subpartition)、Interval分区和引用分区(Reference)。每种类型的分区都有其特点和应用场景。 在 VLDB ...

    ORACLE分区

    根据提供的文件信息,本文将详细解释Oracle分区技术及其在解决UNDOTBS01.DBF文件过大问题中的应用方法,并进一步探讨Oracle分区的不同类型及其应用场景。 ### Oracle 分区概述 Oracle分区是一种将大表或索引分割成...

    Oracle 分区表 分区索引

    - **List分区**:根据列出的具体键值分配数据。 - **组合分区**:结合以上两种或多种分区方法,例如Range-Hash分区。 #### 四、创建分区表和索引 ##### 创建Range分区 ```sql CREATE TABLE sales ( sale_date DATE...

    Oracle分区表用法

    本文将详细介绍分区表的概念、作用、优缺点,以及各种类型的分区表及其创建方法。 1. **表空间与分区表的概念** - 表空间(Tablespace):在Oracle数据库中,表空间是存储数据的主要容器,由一个或多个数据文件...

    oracle表分区.[归类].pdf

    3. List分区:用户可以指定具体值将数据分配到特定分区,但不支持多列分区。 4. 范围-散列分区:先进行范围分区,再在每个范围内使用散列分区,适用于数据再平衡场景。 5. 范围-列表分区:结合范围和列表分区,首先...

    深入学习分区表及分区索引(详解oracle分区).docx

    - **List分区**:基于预定义的值列表进行分区。 - **Hash分区**:根据哈希函数的结果进行分区,提供均匀的数据分布。 - **Composite分区**:组合多种分区方法,如range-hash和range-list组合分区。 7. **Range...

    详解oracle 10g的分区

    ### 详解 Oracle 10g 的分区技术 #### 一、分区概述 在数据库管理领域,**分区**是一种...在实际应用中,应根据具体的业务场景和数据特点,综合考虑以上提到的各种分区方法及其优缺点,以达到最佳的数据库设计效果。

    oracle数据库表分区实例

    Oracle支持多种类型的分区方式,包括范围分区(range partitioning)、列表分区(list partitioning)、散列分区(hash partitioning)和复合分区(composite partitioning)。本示例主要关注范围分区。 #### 四、实例详解 ...

    oracle数据库优化-分区共.pdf

    分区技术在Oracle 10g R2版本中支持四种类型:范围分区(Range)、列表分区(List)、散列分区(Hash)和组合分区(Range-List和Range-Hash)。范围分区基于特定值的范围将数据分至不同分区,例如按日期创建的业务...

    oracle分区表详细讲解

    描述与标签:本文将深入探讨Oracle分区表的创建、管理以及查询技巧,重点包括范围分区(RANGE)、哈希分区(HASH)和列表分区(LIST),并涵盖复合分区(COMPOUND PARTITIONING)的概念。 ### 一、Oracle分区表概述...

    Oracle的分区是怎么回事Oracle的分区是怎么回事

    总之,Oracle的分区技术是大型数据库管理的关键策略之一,它有助于提升数据处理效率,简化维护工作,并提供更好的数据组织和管理能力。通过理解和正确应用这些分区策略,可以显著改善数据库的性能和可管理性。

    深入学习oracle分区表

    特别是在Oracle 10g版本中,支持了三种主要的分区表创建方式:范围分区(Range)、哈希分区(Hash)以及列表分区(List)。此外,还支持组合分区方式,例如Range-Hash、Range-List等。 #### 一、范围分区(Range) ...

    Oracle大表分区的技术

    5. **区间-散列分区**(Range-Hash Partitioning)和**列表-散列分区**(List-Hash Partitioning)也是复合分区的变种。 6. **全局索引分区**:当对分区表创建索引时,可以选择创建全局索引,索引覆盖所有分区,...

Global site tag (gtag.js) - Google Analytics