`
vanchee
  • 浏览: 26307 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

表分区介绍(转)

阅读更多


(1)分区表的作用:

在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使   用。在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级。虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。

(2)使用分区的优点:

增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;
改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

(3)Oracle数据库提供对表或索引的分区方法:

范围分区(range);
哈希分区(hash);
列表分区(list);
范围-哈希复合分区(range-hash);
范围-列表复合分区(range-list)。

一、范围分区:
CREATE TABLE range_example ( range_key_column date , data varchar2(20) )
 PARTITION BY RANGE (range_key_column)
 ( PARTITION part_1 VALUES LESS THAN (to_date('01/01/2005','dd/mm/yyyy')),
 PARTITION part_2 VALUES LESS THAN (to_date('01/01/2006','dd/mm/yyyy'))
 )
 
二、散列分区:
create table t_partition_hash (id number,name varchar2(50))
 partition by hash(id)(
 partition t_hash_p1 tablespace GCOMM,
 partition t_hash_p2 tablespace GCOMM,
 partition t_hash_p3 tablespace GCOMM);

同样也可以用如下语句创建(直接指定要分区个数及存储的表空间)
create table t_partition_hash2 (id number,name varchar2(50))
 partition by hash(id)
 partitions 3 store in(GCOMM,GMAPDATA);--3个分区,第三个没指定表空间即存储在默认的表空间
 
散列分区数应该使用2的幂
--例子来进行说明
create or replace procedure hash_proc(p_nhash  in number,
                                      p_cursor out sys_refcursor) authid current_user as
  l_text     long;
  l_template long := 'select $POS$ oc, ''p$POS$'' pname,count(*) cnt ' ||
                     'from t partition($PNAME$) union all ';
begin
  begin
    execute immediate 'drop table t';
  exception
    when others then
      null;
  end;

  execute immediate 'create table t(id) partition by hash(id) partitions ' ||
                    p_nhash || ' as select rownum from all_objects';
  for x in (select partition_name pname, partition_position pos
              from user_tab_partitions
             where table_name = 'T'
             order by partition_position) loop
    l_text := l_text || replace(replace(replace(l_template, '$POS$', x.pos),
                                        'p$POS$',
                                        x.pname),
                                '$PNAME$',
                                x.pname);
  end loop;
  open p_cursor for 'select pname,cnt,substr( rpad(''*'',30*round(cnt/max(cnt)over(),2),''*''),1,30) hg from (' || substr(l_text,
                                                                                                                          1,
                                                                                                                          length(l_text) - 11) || ')order by oc';
end;

SQL> variable x refcursor
SQL> set autoprint on
SQL> exec hash_proc( 4, :x ); --四个分区
PL/SQL 过程已成功完成。

PN        CNT HG
-- ---------- ------------------------------  数据在每个区分布很均匀
p1      21500 *****************************
p2      21508 *****************************
p3      21811 ******************************
p4      21403 *****************************

SQL> exec hash_proc( 5, :x );--5个分区
PL/SQL 过程已成功完成。

PN        CNT HG
-- ---------- ----------------------------------- 数据分布不均匀
p1      10837 ***************
p2      21511 *****************************
p3      21812 ******************************
p4      21403 *****************************
p5      10665 **************

SQL> exec hash_proc( 6, :x );--6个分区
PL/SQL 过程已成功完成。

PN        CNT HG
-- ---------- --------------------------------- 数据分布不均匀
p1      10838 ***************
p2      10857 ***************
p3      21812 ******************************
p4      21405 *****************************
p5      10666 **************
p6      10657 **************

SQL> exec hash_proc( 7, :x );--7个分区
PL/SQL 过程已成功完成。

PN        CNT HG
-- ---------- -------------------------------
p1      10838 ***************
p2      10857 ***************
p3      10895 ***************
p4      21408 ******************************
p5      10666 ***************
p6      10658 ***************
p7      10921 ***************

SQL> exec hash_proc( 8, :x );--8个分区
PL/SQL 过程已成功完成。

PN        CNT HG
-- ---------- -------------------------------
p1      10841 *****************************
p2      10857 *****************************
p3      10897 ******************************
p4      10726 *****************************
p5      10666 *****************************
p6      10658 *****************************
p7      10922 ******************************
p8      10685 *****************************

--总结:从以上的结果可以看出,分区数为2的n次方,数据可以均匀分布到各个区。

三、列表分区:
create table list_example
 ( state_cd varchar2(2), data varchar2(20))
 partition by list(state_cd)
 ( partition part_1 values ( 'ME', 'NH', 'VT', 'MA' ),
   partition part_2 values ( 'CT', 'RI', 'NY' )
 )

--如果state_cd字段的值不在定义两个分区的值之内,则无法插入
insert into list_example values ( 'VA', 'data' );
--无法插入,提示ORA-14400:插入的分区关键字未映射到任何分区
解决办法:增加一个默认分区
alter table list_example add partition part_3 values ( DEFAULT );
insert into list_example values ( 'VA', 'data' );--成功插入

但是,如果存在一个默认分区,就无法再增加一个具体其他值的分区:
alter table list_example add partition part_4 values( 'CA', 'NM' );
--提示ORA-14323:在default分区已存在时无法添加分区
解决办法:先把default分区删除,再添加需要的分区,最后再增加default分区
alter table list_example drop partition part_3


四、组合分区:

--range和hash组合分区
CREATE TABLE composite_example ( range_key_column date, hash_key_column int, data varchar2(20))
 PARTITION BY RANGE (range_key_column)--范围分区
 subpartition by hash(hash_key_column) subpartitions 2 --hash分区
 ( PARTITION part_1 VALUES LESS THAN(to_date('01/01/2005','dd/mm/yyyy'))
 (subpartition part_1_sub_1, subpartition part_1_sub_2),
 PARTITION part_2 VALUES LESS THAN(to_date('01/01/2006','dd/mm/yyyy'))
 (subpartition part_2_sub_1, subpartition part_2_sub_2 )
 )
 
--range和list组合分区
CREATE TABLE composite_range_list_example ( range_key_column date, code_key_column int, data varchar2(20))
 PARTITION BY RANGE (range_key_column)
 subpartition by list(code_key_column)
 (PARTITION part_1 VALUES LESS THAN(to_date('01/01/2005','dd/mm/yyyy'))
 (subpartition part_1_sub_1 values( 1, 3, 5, 7 ), subpartition part_1_sub_2 values( 2, 4, 6, 8 )),
 PARTITION part_2 VALUES LESS THAN(to_date('01/01/2006','dd/mm/yyyy'))
 (subpartition part_2_sub_1 values ( 1, 3 ), subpartition part_2_sub_2 values ( 5, 7 ), subpartition part_2_sub_3 values ( 2, 4, 6, 8 ))
 )
 
  
行移动:即更新后其值从第一个分区移到了第二个分区时必须启用行移动才能更新成功
insert into range_example( range_key_column, data )
 values( to_date( '15-12-2004 00:00:00','dd-mm-yyyy hh24:mi:ss' ),'application data...' );

insert into range_example ( range_key_column, data )
 values ( to_date( '01-1-2005 00:00:00', 'dd-mm-yyyy hh24:mi:ss' )-1/24/60/60, 'application data...' );

select * from range_example partition(part_1);
RANGE_KEY_COLUMN DATA
---------------- --------------------
2004-12-15       application data...
2004-12-31 23:59 application data...

update range_example
 set range_key_column = trunc(range_key_column)
 where range_key_column = to_date( '31-12-2004 23:59:59', 'dd-mm-yyyy hh24:mi:ss' );

--如果更新时超出了本区则会提示:ORA-14402:更新分区关键字列将导致分区的更改
update range_example
 set range_key_column = to_date('02-1-2005','dd-mm-yyyy')
 where range_key_column = to_date('31-12-2004','dd-mm-yyyy');
 
select rowid from range_example where range_key_column = to_date('31-12-2004','dd-mm-yyyy');--AAAWlCAAGAADxMlAAB
--解决办法:启动该表的行移动
alter table range_example enable row movement;
select rowid from range_example where range_key_column = to_date('02-1-2005','dd-mm-yyyy');--AAAWlDAAGAADxMtAAA
--总结:对于有分区的表,进行更新时,如果更新后其分区发生改变,则必须启动该表的行移动,由以上也可以看到,更新前后其rowid是不同的。


原文地址:http://www.cnblogs.com/lanzi/archive/2011/03/24/1993612.html

分享到:
评论

相关推荐

    BLOG_如何将一个普通表转换为分区表.pdf

    从提供的文件内容可以看出,本文主要介绍的是如何将一个非分区表转换为分区表,其中涉及了四种不同的方法,并且强调了每种方法的执行细节以及注意事项。 1. Export/Import方法 Export/Import方法是最传统的转换策略...

    oracle普通表转化为分区表的方法

    本文将详细介绍如何通过在线重定义(DBMS_REDEFINITION)将普通表转换为分区表,这是官方给出的四种方法之一,且对系统的影响最小。 在线重定义是一种在不影响用户访问的情况下,改变表结构的方法。以下是将普通表...

    oracle 普通表转分区表方式

    Oracle 普通表转分区表方式 Oracle 分区表(Partitioned Table)是一种特殊的表结构,可以根据不同的条件将数据分割成多个独立的分区,以提高查询效率和减少存储空间。本文将详细介绍将 Oracle 普通表转换为分区表...

    利用kettle自动创建oracle表分区

    在本篇文章中,将会介绍如何使用Kettle自动创建Oracle表分区。Oracle表分区是一种非常重要的数据库优化技术,它可以将大型表分割成多个小的独立表,从而提高查询效率和数据管理效率。在本篇文章中,我们将使用Kettle...

    Oracle分区表详解

    ### Oracle 分区表详解 #### 一、Oracle 分区简介 ...以上是 Oracle 分区表的基础概念及其操作的详细介绍。通过合理应用分区技术,不仅可以提高数据的可管理性,还能有效提升查询性能和系统可用性。

    SQL2008分区表的建立

    本文将详细介绍 SQL Server 中的分区表,包括分区表的概念、创建分区表、操作分区表、将普通表转换为分区表等内容。 一、分区表简介 分区表是 SQL Server 中的一种数据存储方式,它将大型表拆分成多个小的、独立的...

    5、ClickHouse查看数据库容量、表的指标、表分区、数据大小等

    本篇文章主要介绍了如何在ClickHouse中查看数据库容量、表的指标、表分区以及数据大小等关键信息。 一、查看数据库容量 要查看ClickHouse数据库的总容量,可以查询`system.parts`系统表。以下查询返回每个表的总行...

    Oracle分区表用法

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

    linux分区表修复工具

    除了基本的分区表修复,testdisk还支持其他高级功能,如创建新的分区、转换分区类型(例如从FAT转NTFS,或者从EXT3转EXT4)以及处理启动问题。然而,这些操作需要谨慎进行,因为错误的操作可能导致数据丢失。 总的...

    硬盘GPT分区与MBR分区的转换.

    随着技术的发展,出现了两种主要的硬盘分区表类型——**MBR**(Master Boot Record)主引导记录和**GPT**(GUID Partition Table)全局唯一标识分区表。这两种分区方式各有优势,适用于不同的场景。本文将详细介绍这两种...

    Oracle堆表转换成分区表方案

    本文将详细介绍如何将Oracle中的堆表转换为分区表,包括两种不同的转换方案及其实施步骤。 #### 二、目标表简介 目标表名为`tb_order`,具有以下特性: - **主键字段**:`orderno` - **表结构**:包含订单相关...

    oracle表分区.[归类].pdf

    本篇将详细介绍Oracle分区的原理、优缺点以及各种分区方法,并提供相关操作示例。 一、Oracle分区简介 Oracle分区的核心理念是“分而治之”,它将大表和索引分成多个小的逻辑单元,称为分区。这种技术有助于减少...

    分区表详解、如何计算扇区

    下面我们将详细介绍分区表的参数和计算扇区的方法。 一、进制转换 在了解分区表之前,需要熟悉进制转换。分区表中使用二进制、16 进制和 10 进制表示数据。例如,16 进制的 3F 等于 10 进制的 63 等于二进制的 ...

    oracle分区表的使用与介绍

    Oracle 分区表是一种高效的数据管理技术,用于处理大数据量的表,提高查询性能,增强可用性和简化维护。本文将深入探讨分区表的概念、作用、优缺点以及不同类型的分区方法。 首先,了解表空间和分区表的基本概念。...

    硬盘分区计算方法详解

    其中,“-1 * 4”部分主要是考虑到为了保留一定的空间用于存储分区表等元数据,而“+ 1024 * X”则是因为1GB等于1024KB,这里是为了将GB转换成KB进行计算。 #### 计算步骤 1. **确定X值**:首先,需要明确所需分区...

    TRANSCAD使用技巧(od表、id转换、合并分区).pdf

    本文将详细介绍TransCAD中的一些重要使用技巧,包括OD表、ID转换、合并分区等。 首先,我们需要了解什么是OD表。OD表,即起点-终点矩阵(Origin-Destination Matrix),它是一种用于表示各交通小区之间交通流动量的...

    PTDD分区表医生

    "PTDD分区表医生"是一款专门用于修复硬盘分区表问题的专业工具,对于处理硬盘数据丢失、分区错误等常见问题有着显著的效果。这款软件在IT领域中被广泛使用,尤其是在数据恢复和系统维护方面,是技术人员的得力助手。...

    分区魔术师使用说明及电脑格式转换方法.doc

    ### 分区魔术师使用说明及电脑格式转换方法 #### 一、软件介绍 **分区魔术师**(Partition Magic)是一款专业的磁盘管理工具,它的核心优势在于能够在不影响数据安全的前提下,灵活调整硬盘分区及其文件系统。相较...

    linux磁盘分区:linux查看磁盘分区等命令和相关工具介绍

    Linux系统下磁盘分区的查看和管理涉及到多个命令和工具,以下将详细介绍几个核心的命令和工具及其使用方法。 ### df命令 df命令是查看文件系统磁盘空间使用情况的常用命令。它可以从coreutils软件包获取,几乎在...

Global site tag (gtag.js) - Google Analytics