oracle 分区表方法详解介绍

分区表的概念,简单来说就是:原来一个用户下表的数据是放在一个表空间里,使用了分区表后,表的数据是放在多个表空间中。

PS:表空间是包括一个用户下所有文件的逻辑概念。

如果一个数据库中,某几个表(特别是历史表)占了数据库50%以上的空间,或达到几百G的磁盘容量。这时就要考虑使用分区表了。

Oracle表分区分为四种:范围分区(Range分区),散列分区(Hash分区),列表分区(List分区)和复合分区(范围-散列分区range-hash,范围-列表分区range-list)

分区的好处,主要用到以下两点:
改善查询性能
维护备份数据方便

一、范围分区
范围分区就是根据表中某一字段的值的范围来分区,特别适用于时间日期、ID号来分区

1、建立测试用户

create user wangyi identified by wangyi;
grant dba to wangyi;
conn wangyi/wangyi;

2、建立测试表和数据
//策略是按月创建分区,保留一年数据,年末备份前年数据。

例子:

create table range_table (
inst_date date,
produce_id number,
amt varchar(12)
)
partition by range(inst_date)
(
partition p1 values less than(to_date('01/02/2016','DD/MM/YYYY')),
partition p2 values less than(to_date('01/03/2016','DD/MM/YYYY')),
partition p3 values less than(to_date('01/04/2016','DD/MM/YYYY')),
partition p4 values less than(to_date('01/05/2016','DD/MM/YYYY')),
partition p5 values less than(to_date('01/06/2016','DD/MM/YYYY'))
);

插入测试数据:

insert into range_table values(to_date('01/02/2016','DD/MM/YYYY'),1,'0.1');
insert into range_table values(to_date('01/03/2016','DD/MM/YYYY'),2,'0.2');
insert into range_table values(to_date('01/04/2016','DD/MM/YYYY'),3,'0.3');

PS:分区表不一定要放到不同的表空间中,如要放入不同的表空间,需先建立表空间文件,然后在partition语句后面加入tablespace space_nameXX。

3、查询分区情况
1)

select * from dba_part_tables where owner = 'WANGYI';

2)

select count(*) from range_table;

  COUNT(*)
----------
  3

3)

select count(*) from range_table partition (p2);

  COUNT(*)
----------
  1

可以看到3条记录,落到了3个分区中。

4、11g可以用interval函数自动分区

create table range_table (
inst_date date,
produce_id number,
amt varchar(12)
)
partition by range(inst_date)
interval(numtoyminterval(1, 'month'))
(
partition p1 values less than(to_date('2016-01-01','YYYY-MM-DD'))
);

二、散列分区
散列分区是根据字段的hash值进行均匀分布,尽可能的实现各分区所散列的数据相等。

例子:

create table hash_table (
inst_date date,
produce_id number,
amt varchar(12)
)
partition by hash(inst_date)
(
partition p1,
partition p2,
partition p3
);

insert into hash_table values(to_date('01/02/2016','DD/MM/YYYY'),1,'0.1');
insert into hash_table values(to_date('01/03/2016','DD/MM/YYYY'),2,'0.2');
insert into hash_table values(to_date('01/04/2016','DD/MM/YYYY'),3,'0.3');

2、查询分区情况
1)

select count(*) from hash_table;

  COUNT(*)
----------
  3

2)

select count(*) from hash_table partition (p1);

  COUNT(*)
----------
  1

3)

select count(*) from hash_table partition (p2);

  COUNT(*)
----------
  2

记录具体落到哪个分区是由oracle计算hash值后决定的。

三、列表分区
列表分区明确指定了根据某字段的某个具体值进行分区,而不是像范围分区那样根据字段的值范围来划分的。

列表分区不支持多列,但是范围分区和哈希分区支持多列。

例子:

create table list_table (
inst_date date,
produce_id number,
amt varchar(12)
)
partition by list(produce_id)
(
partition p1 values(1),
partition p2 values(2),
partition p3 values(3)
);

insert into list_table values(to_date('01/02/2016','DD/MM/YYYY'),1,'0.1');
insert into list_table values(to_date('01/03/2016','DD/MM/YYYY'),2,'0.2');
insert into list_table values(to_date('01/04/2016','DD/MM/YYYY'),3,'0.3');

3、查询分区情况
1)

select count(*) from list_table partition (p1);

  COUNT(*)
----------
  1

2)

select count(*) from list_table partition (p2);

  COUNT(*)
----------
  1

3)

select count(*) from list_table partition (p3);

  COUNT(*)
----------
  1

四、复合分区(范围-散列分区,范围-列表分区)
复合分区就是可以在分区里再建子分区。

比较复杂,见参考资料第一个链接。。。

五、对分区的维护

1、清空表分区数据

alter table 表名 truncate partition 分区名;

2、直接删除分区

alter table 表名 drop partition 分区名;

时间: 2024-09-12 16:57:31

oracle 分区表方法详解介绍的相关文章

js中Math的属性和方法详解介绍

js中有一个内置对象--Math对象,在有的时候非常有用,我们来分析一下: Math常用属性(注意要大写): E 返回算术常量 e,即自然对数的底数(约等于2.718) LN2 返回 2 的自然对数(约等于0.693) LN10 返回 10 的自然对数(约等于2.302) LOG2E 返回以 2 为底的 e 的对数(约等于 1.414) LOG10E 返回以 10 为底的 e 的对数(约等于0.434) PI 返回圆周率(约等于3.14159) SQRT1_2 返回返回 2 的平方根的倒数(约等

qq游戏多开的方法详解介绍

首先下载勇芳qq游戏大厅多开补丁 下载完成后,双击打开多开补丁. 打开后,查看路径是否正确,有没有显示"QQGame.exe",没有的话只有自己指定你自己将QQ游戏装在那里 只要有自动有"QQGame.exe"显示出来,你自己就无需查找...过了一会儿,就会提示成功. 那样,补丁就完成了,这个补丁软件也用不着了这个补丁,就没有用处了,可以删除,也可以不删除,你自己看着办到此 你可以一个QQ号一个QQ号登入QQ游戏,或你下载一个多QQ登入器,先把QQ号与密码输入其中,

php设置时区方法详解介绍

能修改php.ini.打开php.ini查找date.timezone 去掉前面的分号= 后面加XXX,重启http服务(如apache2或iis等)即可 关于XXX,大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木 在php.ini中设置时区  代码如下 复制代码 date.timezone = PRC 在代码中设置时区  代码如下 复制代码 date_default_timezone_set('Asia/Sh

ORACLE异常恢复后awr异常处理方法详解

有一个通过非常规方法恢复过的客户数据库出现问题awr无法收集统计信息(几个月前非常规方法恢复的库,因为未重建库),不太方便跟踪数据库性能,让其帮忙分析跟踪问题.人工收集统计信息报错RA-00001: 违反唯一约束条件 (SYS.WRM$_SNAPSHOT_PK) SQL> execute dbms_workload_repository.create_snapshot(); BEGIN dbms_workload_repository.create_snapshot(); END;  *第 1

YUM解决RPM包安装依赖关系及yum工具介绍本地源配置方法详解_Linux

1.背景概述 在实际生产环境下,对于在linux系统上安装rpm包,主要面临两个实际的问题 1)安装rpm包过程中,不断涌现的依赖关系问题,导致需要按照提示或者查询资料,手工安装更多的包 2)由于内外网的隔离,无法连接外网的yum源 鉴于上述因此,本文将详细介绍,yum工具以及配置本地yum源的方法 2.yum工具简介 •yum工具作为rpm包的软件管理器,可以进行rpm包的安装.升级以及删除等日常管理工作,而且对于rpm包之间的依赖关系可以自动分析,大大简化了rpm包的维护成本. •yum工具

Mysql的基础使用之MariaDB安装方法详解_Mysql

我首次用mysql是在ubuntu上,现在用的是linux 中的Red Hat 分支的centOS 7 ,安装时发现通常用的都是MariaDB 来代替mysql,通过资料查询发现Mariadb是mysql的其中的一种分支,由mysql的创始人带领的团队所开发的mysql分支的一种版本,因为mysql受到被Oracle收购后的日渐封闭与缓慢的更新,众多Linux发行版逐渐抛弃了这个人气开源数据库,使MySQL在各大Linux发行版中的失势由于不满MySQL被Oracle收购后的日渐封闭与缓慢的更新

Linux crontab定时任务配置方法(详解)_Linux

CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行.cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业.crontab命令允许用户提交.编辑或删除相应的作业.每一个用户都可以有一个crontab文件来保存调度信息.系统管理员可以通过cron.deny 和 cron

ASP.NET动态设置页面标题的方法详解

这篇文章介绍了ASP.NET动态设置页面标题的方法详解,有需要的朋友可以参考一下     ASP.NET为我们提供了一个控件类:System.Web.UI.HtmlControls.HtmlGenericControl.它可以实现 HTML的元素的一个实例,比如在.cs代码中控制aspx中的<td>元素(注意,它不是<ASP:TableCell>). 我们知道,页面标题是被包含在<TITLE></TITLE>中的,而<TITLE>也是一个HTML

Lua中break语句的使用方法详解

  这篇文章主要介绍了Lua中break语句的使用方法详解,是Lua入门学习中的基础知识,需要的朋友可以参考下 当循环中遇到break语句,循环立即终止,程序控制继续下一个循环语句后面. 如果您正在使用嵌套循环(即一个循环里面另一个循环),break 语句将停止最内层循环的执行并开始执行的下一行代码的程序后段. 语法 Lua break语句语法如下: 代码如下: break 例子: 代码如下: --[ local variable definition --] a = 10--[ while l