基本关系:数据库---表空间---数据段---分区---数据块

一、分区(extent)
分区extent是比数据块大一级的存储结构,是几个逻辑上相邻的data block的组合。我们知道,物理存储通常是随机的读写过程。即使在同一个文件里,我们也不能保证相同的一个信息是存储在绝对连续的物理存储空间的。Oracle数据存储同样如此。

分区extent是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。区存储于段中,它由连续的数据块组成。区的分配过程中,每次至分配5个区。如果所剩的空闲空间不够5个区,就会出现错误:ORA-01653。

在进行存储数据信息的时候,Oracle将分配数据块进行存储,但是不能保证所有分配的数据块都是连续的结构。所以,出现分区extent的概念,表示一系列连续的数据块集合。

SQL>  desc dba_extents;
Name                  Type          Nullable     Default Comments                                                  
--------------- ------------- -------- ------- ---------------------------------------------------------
OWNER                VARCHAR2(128)    Y                Owner of the segment associated with the extent           
SEGMENT_NAME     VARCHAR2(128)    Y                Name of the segment associated with the extent            
PARTITION_NAME    VARCHAR2(128)    Y                Partition/Subpartition Name, if any, of the segment       
SEGMENT_TYPE      VARCHAR2(18)     Y                Type of the segment                                       
TABLESPACE_NAME VARCHAR2(30)    Y                Name of the tablespace containing the extent              
EXTENT_ID          NUMBER           Y                Extent number in the segment                              
FILE_ID             NUMBER          Y                Name of the file containing the extent                    
BLOCK_ID          NUMBER            Y                Starting block number of the extent                       
BYTES                 NUMBER           Y                Size of the extent in bytes                               
BLOCKS              NUMBER           Y                Size of the extent in ORACLE blocks                       
RELATIVE_FNO       NUMBER           Y                Relative number of the file containing the segment header

二、什么时候使用分区表:
1、表的大小超过2gb。
2、表中包含历史数据,新的数据被增加都新的分区中。

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

四、表分区的几种类型及操作方法
 一.范围分区:
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。
当使用范围分区时,请考虑以下几个规则:
1、每一个分区都必须有一个values less then子句,它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。
2、所有分区,除了第一个,都会有一个隐式的下限值,这个值就是此分区的前一个分区的上限值。
3、在最高的分区中,maxvalue被定义。maxvalue代表了一个不确定的值。这个值高于其它分区中的任何分区键的值,也可以理解为高于任何分区中指定的value less then的值,同时包括空值。

假设有一个customer表,表中有数据200000行,我们将此表进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下:
例一:按customer_id进行分区
create table customer
(
    customer_id  number   not null primary key,
    first_name  varchar2(30)  not null,
    last_name   varchar2(30)  not null,
    phone        varchar2(15)  not null,
    email        varchar2(80),
    status       char(1)
)
partition by range (customer_id)
(
    partition cus_part1 values less than (100000) tablespace cus_ts01,
    partition cus_part2 values less than (200000) tablespace cus_ts02
)
例二:按时间划分
create table order_activities
(
    order_id         number(7) not null,
    order_date     date,
    total_amount  number,
    custotmer_id   number(7),
    paid                 char(1)
)
partition by range (order_date)
(
  partition ord_act_part01 values less than (to_date('01- may -2003','dd-mon-yyyy')) tablespaceord_ts01,
  partition ord_act_part02 values less than (to_date('01-jun-2003','dd-mon-yyyy')) tablespace ord_ts02,
  partition ord_act_part02 values less than (to_date('01-jul-2003','dd-mon-yyyy')) tablespace ord_ts03
)
例三:maxvalue
create table rangetable
(
  idd       int   primary key ,
  iname  varchar(10),
  grade   int
)
partition  by  range (grade)
(
      partition  part1 values  less  then (1000) tablespace  part1_tb,
      partition  part2 values  less  then (maxvalue) tablespace  part2_tb
);

二.列表分区:
列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。基于这样的特点我们可以采用列表分区。
例一
create table problem_tickets
(
    problem_id   number(7) not null primary key,
    description  varchar2(2000),
    customer_id  number(7) not null,
    date_entered date not null,
    status       varchar2(20)
)
partition by list (status)
(
      partition prob_active   values ('active') tablespace prob_ts01,
      partition prob_inactive values ('inactive') tablespace prob_ts02
例二
create  table  listtable
(
    id    int  primary  key ,
    name  varchar (20),
    area  varchar (10)
)
partition  by  list (area)
(
    partition  part1 values ('guangdong','beijing') tablespace  part1_tb,
    partition  part2 values ('shanghai','nanjing')  tablespace  part2_tb
);
)

三.散列分区:
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在i/o设备上进行散列分区,使得这些分区大小一致。
例一:
create table hash_table
(
  col number(8),
  inf varchar2(100)
)
partition by hash (col)
(
  partition part01 tablespace hash_ts01,
  partition part02 tablespace hash_ts02,
  partition part03 tablespace hash_ts03
)
简写:
create table emp
(
    empno number (4),
    ename varchar2 (30),
    sal   number
)
partition by  hash (empno) partitions 8
store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数,oracle中如果你要使用hash分区,只需指定分区的数量即可。建议分区的数量采用2的n次方,这样可以使得各个分区间数据分布更加均匀。

四.组合范围散列分区
这种分区是基于范围分区和列表分区,表首先按某列进行范围分区,然后再按某列进行列表分区,分区之中的分区被称为子分区。
create table sales
(
product_id varchar2(5),
sales_date date,
sales_cost number(10),
status varchar2(20)
)
partition by range(sales_date) subpartition by list (status)
(
   partition p1 values less than(to_date('2003-01-01','yyyy-mm-dd'))tablespace rptfact2009
          (
              subpartition p1sub1 values ('active') tablespace rptfact2009,
              subpartition p1sub2 values ('inactive') tablespace rptfact2009
          ),
   partition p2 values less than (to_date('2003-03-01','yyyy-mm-dd')) tablespace rptfact2009
          (
              subpartition p2sub1 values ('active') tablespace rptfact2009,
              subpartition p2sub2 values ('inactive') tablespace rptfact2009
          )
)

五.复合范围散列分区:
这种分区是基于范围分区和散列分区,表首先按某列进行范围分区,然后再按某列进行散列分区。
create table dinya_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 (dinya_space01,dinya_space02,dinya_space03)
 (
     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)
 );

六、有关表分区的一些维护性操作:
一、添加分区
以下代码给sales表添加了一个p3分区
alter table sales add partition p3 values less than(to_date('2003-06-01','yyyy-mm-dd'));
注意:以上添加的分区界限应该高于最后一个分区界限。
以下代码给sales表的p3分区添加了一个p3sub1子分区
alter table sales modify partition p3 add subpartition p3sub1 values('complete');

二、删除分区
以下代码删除了p3表分区:
alter table sales drop partition p3;
在以下代码删除了p4sub1子分区:
alter table sales drop subpartition p4sub1;
注意:如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表。

三、截断分区
截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。通过以下代码截断分区:
alter table sales truncate partition p2;
通过以下代码截断子分区:
alter table sales truncate subpartition p2sub2;

四、合并分区
合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。以下代码实现了p1 p2分区的合并:
alter table sales merge partitions p1,p2 into partition p2;

五、拆分分区
拆分分区将一个分区拆分两个新分区,拆分后原来分区不再存在。注意不能对hash类型的分区进行拆分。
alter table sales sblit partition p2 at(to_date('2003-02-01','yyyy-mm-dd')) into (partition p21,partition p22);

六、接合分区(coalesca)
结合分区是将散列分区中的数据接合到其它分区中,当散列分区中的数据比较大时,可以增加散列分区,然后进行接合,值得注意的是,接合分区只能用于散列分区中。通过以下代码进行接合分区:
alter table sales coalesca partition;

七、重命名表分区
以下代码将p21更改为p2
alter table sales rename partition p21 to p2;

八、相关查询
跨分区查询
select sum( *) from
(select count(*) cn from t_table_ss partition (p200709_1)
union all
select count(*) cn from t_table_ss partition (p200709_2)
);

查询表上有多少分区
select * from user_tab_partitions where table_name='tablename'

查询索引信息
select object_name,object_type,tablespace_name,sum(value)
from v$segment_statistics
where statistic_name in ('physical reads','physical write','logical reads')and object_type='index'
group by object_name,object_type,tablespace_name
order by 4 desc
 
--显示数据库所有分区表的信息:
select * from dba_part_tables
 
--显示当前用户可访问的所有分区表信息:
select * from all_part_tables
 
--显示当前用户所有分区表的信息:
select * from user_part_tables
 
--显示表分区信息 显示数据库所有分区表的详细分区信息:
select * from dba_tab_partitions
 
--显示当前用户可访问的所有分区表的详细分区信息:
select * from all_tab_partitions
 
--显示当前用户所有分区表的详细分区信息:
select * from user_tab_partitions
 
--显示子分区信息 显示数据库所有组合分区表的子分区信息:
select * from dba_tab_subpartitions
 
--显示当前用户可访问的所有组合分区表的子分区信息:
select * from all_tab_subpartitions
 
--显示当前用户所有组合分区表的子分区信息:
select * from user_tab_subpartitions
 
--显示分区列 显示数据库所有分区表的分区列信息:
select * from dba_part_key_columns
 
--显示当前用户可访问的所有分区表的分区列信息:
select * from all_part_key_columns
 
--显示当前用户所有分区表的分区列信息:
select * from user_part_key_columns
 
--显示子分区列 显示数据库所有分区表的子分区列信息:
select * from dba_subpart_key_columns
 
--显示当前用户可访问的所有分区表的子分区列信息:
select * from all_subpart_key_columns
 
--显示当前用户所有分区表的子分区列信息:
select * from user_subpart_key_columns
 
--怎样查询出oracle数据库中所有的的分区表
select * from user_tables a where a.partitioned='yes'
 
--删除一个表的数据是
truncate table table_name;
 
--删除分区表一个分区的数据是
alter table table_name truncate partition p5;

涉及参数:
storage  --段
(
  initial 64K   --区段(extent)一次扩展64k
  next 1M    --当文件设置为可拓展时,next为每次进行拓展的步长。
  minextents 1 --最小区段数
  maxextents unlimited --最大区段无限制
  pctincrease 0 --指定第三个及其后的Extent相对于上一个Extent所增加的百分比,如果 PCTINCREASE为0,则Segment中所有新增加的Extent的大小都相同,等于     NEXT的值,如果PCTINCREASE大于0,则每次计算NEXT的值(用上面的公式),PCTINCREASE不能为负数
);

oracle --(二)分区(extent)的更多相关文章

  1. Oracle Spatial分区应用研究之二:按县分区与按省分区对比测试报告

    1.实验目的 在上一轮的实验中,oracle 11g r2版本下,在87县市实验数据的基础上,比较了分表与分区的效率,得出了分区+全局索引效率较高的结论(见上一篇博客).不过我们尚未比较过不同的分区粒 ...

  2. 转:Oracle表分区

    Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区. 一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: 1. create table graderecord 2. ...

  3. Oracle表分区[转]

    废话少说,直接讲分区语法. Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区. 一:范围分区 就是根据数据库表中某一字段的值的范围来划分分区,例如: create table gra ...

  4. oracle表分区的,分区操作,分区查询,子分区查询

    一.摘要 有关表分区的一些维护性操作: 注:分区根据具体情况选择. 表分区有以下优点: 1.数据查询:数据被存储到多个文件上,减少了I/O负载,查询速度提高. 2.数据修剪:保存历史数据非常的理想. ...

  5. Oracle 表分区partition(http://love-flying-snow.iteye.com/blog/573303)

    http://www.jb51.net/article/44959.htm Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区. 一:范围分区 就是根据数据库表中某一字段的值的范围来划 ...

  6. oracle 跨分区查询效率,Oracle分区表做跨分区查询

    问:有一张大表,其中按时间字段(TIME_ID)进行表分区(按季度分区),但是如果业务人员做跨季度的大批量数据的查询时,未能走TIME_ID分区索引,导致全表扫描.此种情况该如何处理? 示例解析: 1 ...

  7. oracle表分区、表分析及oracle数据泵文件导入导出开心版

    1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到 ...

  8. oracle表分区详解

    原文来自:http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html oracle表分区详解 从以下几个方面来整理关于分区表的概念及 ...

  9. oracle表分区、表分析及oracle数据泵文件导入导出

    1.先说oracle表分区是什么吧 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到要的那个打开,嘿嘿,我们得找到什么时候. 这时候,有个人告诉你, ...

随机推荐

  1. Uninstall Office 2016 for Mac

    官方原文:https://support.office.com/en-us/article/Uninstall-Office-2016-for-Mac-eefa1199-5b58-43af-8a3d- ...

  2. Windows 10 SDK 10.0.10158

    昨天微软发布了Windows 10 SDK 10158版本: http://blogs.windows.com/buildingapps/2015/06/30/windows-10-sdk-previ ...

  3. Linux-挂载命令

    1.查询与自动挂载 mount:查询系统中已挂载的设备 mount -a :依据配置文件.etc/fsatb的内容,自动挂载 2.挂在命令格式 mount [-t 文件系统] [-o 特殊选项] 设备 ...

  4. 【LeetCode】004. Median of Two Sorted Arrays

    题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  5. 查看.Net Framework版本号

    目录 摘要 .NET Framework 的版本 确定计算机上安装的 .NET Framework 版本 补充几个查看.Net Framework版本号 概要 本文描述如何确定计算机上安装的 Micr ...

  6. 如何让 PADS Layout 识别到板框

    如何让 PADS Layout 识别到板框 在很久很久以前 PADS Laout 还是 PowerPCB 的时候,铺铜是不认识板框的. 当有铺铜时必须复制一份板框再设置为铺铜才可以. 但到了 PADS ...

  7. (C#)Windows Shell 外壳编程系列2 - 解释,从“桌面”开始展开

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一篇:(C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 让我们详细解释一下 Shell 编程中最基本 ...

  8. [转]浅谈Web缓存

    在前端开发中,性能一直都是被大家所重视的一点,然而判断一个网站的性能最直观的就是看网页打开的速度.其中提高网页反应速度的一个方式就是使用缓存.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并 ...

  9. php 字符串的分割

    http://blog.sina.com.cn/s/blog_71ed1b870102uysa.html

  10. 关于移动端的一些tip

    移动端的一些tip 开发相关 关于viewport <meta name="viewport" content="name=value,name=value&quo ...