oracle定时添加或删除分区表的分区 - 冰刀(skate) - 博客频道 - CSDN

oracle定时添加或删除分区表的分区 - 冰刀(skate) - 博客频道 - CSDN
oracle定时添加或删除分区表的分区 - 冰刀(skate) - 博客频道 - CSDN

分类: oracle 管理知识总结有奖征资源,博文分享有内涵 4月推荐博文汇总 专访朱燚:弃移动和互联网应用战场转战传统应用的弄潮儿

oracle定时添加或删除分区表的分区

2009-04-15 20:07 5921人阅读 评论(1) 收藏 举报

oracle table user insert constraints exception

author :skate

time : 2009/04/15

平台如下:

os :centos4.7

oracle 10g

定时添加或删除分区表的分区

这几天,根据业务的需求和性能的考虑,需要定时删除历史数据,表里

只保留最近指定的wareid 的数据,考虑删除时对表的影响及便利性,我决定

把这个表建立成分区表,定期添加和删除分区

步骤:

1. 创建相关procedure

pro_ADD_PARTITION_wareid ---用户添加分区的过程

pro_DROP_PARTITION_wareid ---用户删除分区的过程

pro_expdatainto_his ---用户备份要删除分区数据的过程

2.创建系统上的脚本

3.用cron 做定时任务

1. 创建相关procedure

CREATE OR REPLACE PROCEDURE pro_ADD_PARTITION_wareid(tablename varchar2, ---要添加分区

的表

partNum NUMBER, --添加分区的个数

TableSpaceName VARCHAR2, --表空间名

wareidnum number default 100 ---分区的范围

) AS

/*******************************************************

author :skate

time :2009/02/28

功能:添加分区表的指定分区

目录视图摘要视图订阅

冰刀(skate)

善于从不同角度看同一问题----这样你会站的更高、看的更远

登录 | 注册

说明:可以通过定时任务来完成自动添加分区,添加后要检查索引的状态最好是重建索引,以达到对表的分析

eg: exec pro_add_partition_wareid('d_order_bak',2,'yytickets','200');

********************************************************/

v_SqlExec VARCHAR2(2000); --DDL语句变量

v_Partwareid1 number; --创建分区的wareid

v_err_num NUMBER; --ORA错误号

v_err_msg VARCHAR2(100); --错误描述

v_part_wareid_max number; --tablename 表分区的最大wareid号

v_begin number; ----字符串的开始位置

v_count number; ----取多少个字符串

v_part_name varchar2(100); --要添加分区表的名称的前缀

BEGIN

----字符串的开始位置

select INSTR(partition_name, '_', -1, 1) + 1

into v_begin

from user_tab_partitions

where table_name = UPPER(tablename)

and rownum < 2;

----取多少个字符串

select length(partition_name) - v_begin + 1

into v_count

from user_tab_partitions

where table_name = UPPER(tablename)

and rownum < 2;

--查询分区表tablename的最大wareid值

select max(to_number(SUBSTR(partition_name, v_begin, v_count)))

into v_part_wareid_max

from user_tab_partitions

WHERE table_name = UPPER(tablename);

---计算分区表的名称

select SUBSTR(partition_name, 1, v_begin - 1)

into v_part_name

from user_tab_partitions

WHERE table_name = UPPER(tablename)

and rownum < 2;

v_Partwareid1 := v_part_wareid_max;

FOR i IN 1 .. partNum LOOP

v_Partwareid1 := v_Partwareid1 + wareidnum; ----计算要添加分区的wareid

v_SqlExec := 'ALTER TABLE ' || tablename || ' ADD PARTITION ' ||

v_part_name || v_Partwareid1 || ' values less than(' ||

v_Partwareid1 || ') TABLESPACE ' || TableSpaceName;

dbms_output.put_line('创建 d_order 表分区' || i || '=' || v_SqlExec);

DBMS_Utility.Exec_DDL_Statement(v_SqlExec);

END LOOP;

/*EXCEPTION

WHEN OTHERS THEN

v_err_num := SQLCODE;

v_err_msg := SUBSTR(SQLERRM, 1, 100);

dbms_output.put_line('pro_ADD_PARTITION_wareid执行出现异常,错误码=' || v_err_num || '错误描述=' || v_err_msg);*/

commit;

END pro_ADD_PARTITION_wareid;

##########################################################################################删除分区的procedure:

CREATE OR REPLACE PROCEDURE pro_DROP_PARTITION_wareid(tablename varchar2, ---要删除分区

表的名称

beforewareid NUMBER default 200 --要保留最新多少wareid

) As

/*******************************************************

author:skate

time :2009/02/28

功能:删除分区表的指定分区

说明:可以通过定时任务来完成自动删除分区,删除后要检查索引的状态

最好是重建索引,以达到对表的分析

eg:exec pro_drop_partition_wareid('d_order_bak',10800);

********************************************************/

v_SqlExec VARCHAR2(2000); --DDL语句变量

v_err_num NUMBER; --ORA错误号

v_err_msg VARCHAR2(100); --错误描述

v_begin number; ----字符串的开始位置

v_count number; ----取多少个字符串

v_ware_id number;

v_max_ware_id number;

b varchar2(10);

cursor cursor_table_part is

select partition_name

from user_tab_partitions

WHERE table_name = UPPER(tablename)

AND SUBSTR(partition_name, v_begin, v_count) < v_ware_id

ORDER BY partition_name;

---为禁用或启用约束而定义的游标

cursor cursor_const_part is

select b.constraint_name

from user_constraints a, user_cons_columns b

where a.table_name=b.table_name

and a.constraint_name=b.constraint_name

and a.owner='TICKETS'

and a.table_name=upper(tablename);

---为索引失效而重建索引定义游标

cursor cursor_idx is

select index_name

from user_indexes

where table_name = UPPER(tablename)

and status = 'UNUSABLE';

record_table_oldpart cursor_table_part%rowType;

record_cursor_const_part cursor_const_part%rowtype;

record_cursor_idx cursor_idx%rowtype;

BEGIN

----字符串的开始位置

select INSTR(partition_name, '_', -1, 1) + 1

into v_begin

from user_tab_partitions

where table_name = UPPER(tablename)

and rownum < 2;

----取多少个字符串

select length(partition_name) - v_begin + 1

into v_count

from user_tab_partitions

where table_name = UPPER(tablename)

and rownum < 2;

--确定要删除的最大wareid

select max(to_number(substr(partition_name, v_begin, v_count)))

into v_max_ware_id

from user_tab_partitions

where table_name = UPPER(tablename);

--select max(w.ware_id) into v_max_ware_id from d_ware w;

v_ware_id := v_max_ware_id - beforewareid;

---暂时禁用约束

open cursor_const_part;

loop

fetch cursor_const_part into record_cursor_const_part;

exit when cursor_const_part%notfound;

execute immediate 'alter table '||tablename||' disable constraint

'||record_cursor_const_part.constraint_name||' cascade';

end loop;

close cursor_const_part;

open cursor_table_part;

loop

fetch cursor_table_part

into record_table_oldpart;

exit when cursor_table_part%notfound;

if substr(record_table_oldpart.partition_name, v_begin, v_count) <

v_ware_id then

--把要删除的数据提前备份到历史表里

pro_expdatainto_his(tablename,record_table_oldpart.partition_name,b);

--验证是否可以删除指定的分区表

if (b='Y' or b='R') then

--删除 tablename 表分区

v_SqlExec := 'ALTER TABLE ' || tablename || ' DROP PARTITION ' ||

record_table_oldpart.partition_name;

dbms_output.put_line('删除' || tablename || '表分区=' || v_SqlExec);

DBMS_Utility.Exec_DDL_Statement(v_SqlExec);

elsif b='N' then

exit;

end if;

end if;

end loop;

close cursor_table_part;

---启用约束

open cursor_const_part;

loop

fetch cursor_const_part into record_cursor_const_part;

exit when cursor_const_part%notfound;

execute immediate 'alter table '||tablename||' enable novalidate constraint

'||record_cursor_const_part.constraint_name;

end loop;

close cursor_const_part;

--重建失效的索引

open cursor_idx;

loop

fetch cursor_idx into record_cursor_idx;

exit when cursor_idx%notfound;

execute immediate 'alter index ' ||record_cursor_idx.index_name||' rebuild';

end loop;

close cursor_idx;

/*EXCEPTION

WHEN OTHERS THEN

v_err_num := SQLCODE;

v_err_msg := SUBSTR(SQLERRM, 1, 100);

dbms_output.put_line(pro_DROP_PARTITION_wareid ||

'执行出现异常,错误码=' || v_err_num ||

'错误描述=' || v_err_msg);*/

END pro_DROP_PARTITION_wareid;

#########################################################################################这个存储过程用户在删除分区的时候,用户备份所删除的分区表

create or replace procedure pro_expdatainto_his(tablename varchar2,---要导数据的表名

part_tablename varchar2,---要导数据的分区表名

issuccess in out varchar2)--返回是否导入成功(Y:成功 N:失败 R:之前

已经导入过了)

as

v_SqlExechis VARCHAR2(2000); --DDL语句变量

v_SqlExec VARCHAR2(2000); --DDL语句变量

v_count number(30); --本次导入的数据行数

v_expcount number(30); --历史表中有多少符合本次导入的行数

/*******************************************************

author:skate

time :2009/04/15

功能:把预删除的分区表的数据提前导入到历史表中

说明:这个程序是配合定时删除分区的过程,pro_add_partition_wareid调用

此过程,本过程适合如下表:

D_ORDER

D_ORDER_DETAIL

D_PRINT_BATCH

d_batch_detail

如果想让其适合其他表,只要做简单修改即可

eg: exec pro_expdatainto_his('d_order','D_ORDER_P_31100',b);

注意:本procedure的表名用到了变量,所以要用动态sql来执行:execute immediate

********************************************************/

begin

if upper(tablename) = 'D_ORDER' then

v_SqlExec := 'select count(1) from ' || tablename || ' partition(' ||

part_tablename || ')';

--准备导入多少行数据

execute immediate v_SqlExec

into v_count;

--执行导入操作

execute immediate 'insert into ' || tablename ||

'_his select * from '||tablename||' partition(' ||

part_tablename || ') nologing';

v_SqlExechis := 'select count(1) from ' || tablename || '_his th ,' ||

tablename || ' partition(' || part_tablename ||

') t where t.order_id=th.order_id';

--在历史表中有多少和本此导入相同的记录

execute immediate v_SqlExechis

into v_expcount;

elsif upper(tablename) = 'D_ORDER_DETAIL' then

v_SqlExec := 'select count(1) from ' || tablename || ' partition(' ||

part_tablename || ')';

execute immediate v_SqlExec

into v_count;

execute immediate 'insert into ' || tablename ||'_his select * from '||tablename||' partition('||part_tablename || ') nologing';

v_SqlExechis := 'select count(1) from ' || tablename || '_his th ,' ||tablename || ' partition(' || part_tablename

||') t where t.detail_id=th.detail_id';

execute immediate v_SqlExechis

into v_expcount;

elsif upper(tablename) = 'D_PRINT_BATCH' then

v_SqlExec := 'select count(1) from ' || tablename || ' partition(' || part_tablename || ')';

execute immediate v_SqlExec

into v_count;

execute immediate 'insert into ' || tablename ||

'_his select * from '||tablename||' partition(' ||

part_tablename || ') nologing';

v_SqlExechis := 'select count(1) from ' || tablename || '_his th ,' || tablename || ' partition(' || part_tablename ||

') t where t.batch_id=th.batch_id';

execute immediate v_SqlExechis

into v_expcount;

elsif upper(tablename) = upper('d_batch_detail') then

v_SqlExec := 'select count(1) from ' || tablename || ' partition(' || part_tablename || ')';

execute immediate v_SqlExec

into v_count;

execute immediate 'insert into ' || tablename ||

'_his select * from '||tablename||' partition(' ||

part_tablename || ') nologing';

v_SqlExechis := 'select count(1) from ' || tablename || '_his th ,' || tablename || ' partition(' || part_tablename ||

') t where t.batch_detail_id=th.batch_detail_id';

execute immediate v_SqlExechis

into v_expcount;

end if;

--验证是否导入成功,如果成功就commit,否则rollback

if v_count = v_expcount then

issuccess := 'Y';

commit;

elsif v_count * 2 = v_expcount then

issuccess := 'R';

rollback;

else

issuccess := 'N';

rollback;

end if;

end pro_expdatainto_his;

主题推荐

oracle exception 历史备份索引

博文推荐Activiti5.15.1部署到ora...

springMVC3学习(八)--全局的...android调用measure时报空指针

Oracle基础知识(十八) - 数值函数Oracle基础知识(十七) - 转换函数

oracle 更新Clob字段hibernate.exception....Oracle基础知识(十六) - 表或列...

更多1

下一篇oracle定时分析用户下的所有表

################################################################

2.创建系统上的脚本

[oracle@svr-db-test sh]$ more ticket_del_part.sh

cd /home/oracle/sh

date

sqlplus /nolog @ ticket_del_part.sql

date

[oracle@svr-db-test sh]$

[oracle@svr-db-test sh]$ more ticket_del_part.sql

connect tickets/123456

set timing on

exec pro_drop_partition_wareid('d_order',50);

exec pro_drop_partition_wareid('d_order_detail',50);

exec pro_drop_partition_wareid('D_PRINT_BATCH',50);

exit

[oracle@svr-db-test sh]$

3.用cron 做定时任务

在oracle 用户的crontab 下增加一条定时任务即可:

#delete partition

1 */3 * * * sh /home/oracle/sh/ticket_del_part.sh >> /home/oracle/sh/ticket_del_part.log 简单吧!!!

真TMD 累啊!! 回家

------end-----

oracle 建立分区表

oracle 建立分区表 从上次在亚旭培训的时候,我和dba讨论一次我开发系统中为了一张表不是非常的大,采用了动态sql创建多个部门的表,然后存取相应的数据,从而解决了一张表过大的问题。当时dba和我说了分区表,我第一感觉,如果当时我知道数据库还有这种表,那我当时开发起来应该轻松的多,后来就一直有个想法,去了解分区表,因为最近自己一直都比较忙,被琐事所困,今天晚上终于抽出了点时间,了解了相关的知识,并做了400多w条数据的一个分区表的测试。 一.范围分区 范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。 1 2 3 4 5 6 7 8 9 10 11 12 --例一取值范围: 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) (

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01, PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02, PARTITION CUS_PART3 VALUES LESS THEN(MAXVALUE) 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')) TABLESPACE ORD_TS01, PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02, PARTITION ORD_ACT_PART03 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03

postgresql和oracle表分区对比

PostgreSQL和oracle表分区对比 PostgreSQL是开源数据库,完全免费,oracle是有强大厂商支持和维护的数据库,把这两个的表分区特性放在一起对比,似乎有些勉强。但对于我们多了解一些特性,在实际开发中可以更好地进行理性选择和快速入手。

总结,数据库的表分区特性优点很多,比如: 1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。 5、将很少用的数据可以移动到便宜的、慢一些地存储介质上。 这两种数据库的分区表都具有这些优点。 对比来说,Oracle的分区创建和管理更加方便,很多工作是由oracle的内部机制来实现的。postgreSQL的分区表其实是一个个实际存在的数据表,分区的创建和管理都需要我们用语言来控制,增加了应用人员的工作量。 但,由于oracle自身的“侵占式”硬盘存储,对过期数据进行清除时,即便是drop分区表,也不能直接释放硬盘空间,属于“占了就占了”,这个管理起来就比较麻烦,除非对每个分区表都建立各个独立的tablespace,放在独立的物理文件上,删除过期分区表时,可以同时drop tablespace including contents。而postgreSQL在truncate 分区表时,可以直接释放硬盘,会看到硬盘使用率下降了,这一点对硬盘资源紧张时,就非常好了。 两种数据库的分区表使用,各有利弊,但总的来说,比较偏向postgreSQL,毕竟硬盘有限。而且,oracle收费。 Ps,在数据量很大时,任何关系型数据库都有性能上的瓶颈,不属于我们这两种数据库分区表对比的范围了。 以上,是一些使用中的总结,还请达人们指教:)。

Oracle 分区表的优点

ORACLE 表分区 表分区的好处和事处理 表分区描述 表分区(partition):表分区技术是在超大型数据库(VLDB)中将大表及其索引通过分区(patition)的形式分割为若干较小、可管理的小块,并且每一分区可进一步划分为更小的子分区(sub partition)。而这种分区对于应用来说是透明的。Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。 分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。每个分区都是一个独立的段(SEGMENT),可以存放到相同(不同)的表空间中。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用SQL DML 命令访问分区后的表时,无需任何修改。(对于高效率查询是有影响,主要差别是对某一分区数据时行查询时和对整体数据进行查询) 表分区的好处 通过对表进行分区,可以获得以下的好处: 1)增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 2)维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 3)均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能; 4)改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速

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

下载的,写的非常好,给大家分享下。 什么时候使用分区: 1、大数据量的表,比如大于2GB。一方面2GB文件对于32位os是一个上限,另外备份时间长。 2、包括历史数据的表,比如最新的数据放入到最新的分区中。典型的例子:历史表,只有当前月份的数据可以被修改,而其他月份只能read-only ORACLE只支持以下分区:tables, indexes on tables, materialized views, and indexes on materialized views 分区对SQL和DML是透明的(应用程序不必知道已经作了分区),但是DDL 可以对不同的分区进行管理。 不同的分区之间必须有相同的逻辑属性,比如共同的表名,列名,数据类型,约束; 但是可以有不同的物理属性,比如pctfree, pctused, and tablespaces. 分区独立性:即使某些分区不可用,其他分区仍然可用。 最多可以分成64000个分区,但是具有LONG or LONG RAW列的表不可以,但是有CLOB or BLOB列的表可以。 可以不用to_date函数,比如: alter session set nls_date_format='mm/dd/yyyy'; CREATE TABLE sales_range (salesman_id NUMBER(5), salesman_name VARCHAR2(30), sales_amount NUMBER(10), sales_date DATE) PARTITION BY RANGE(sales_date) ( PARTITION sales_jan2000 VALUES LESS THAN('02/01/2000'),

oracle大表分区

摘要:本篇文章介绍了ORACLE数据库的新特性—分区管理,并用例子说明使用方法。 关键词:ORACLE,分区 一、分区概述: 为了简化数据库大表的管理,ORACLE8推出了分区选项。分区将表分离在若干不同的表空间上,用分而治之的方法来支撑无限膨胀的大表,给大表在物理一级的可管理性。将大表分割成较小的分区可以改善表的维护、备份、恢复、事务及查询性能。针对当前社保及电信行业的大量日常业务数据,可以推荐使用ORACLE8的该选项。 二、分区的优点: 1 、增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍然可以使用; 2 、减少关闭时间:如果系统故障只影响表的一部分分区,那么只有这部分分区需要修复,故能比整个大表修复花的时间更少; 3 、维护轻松:如果需要重建表,独立管理每个分区比管理单个大表要轻松得多; 4 、均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;

5 、改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快; 6 、分区对用户透明,最终用户感觉不到分区的存在。 三、分区的管理: 1 、分区表的建立: 某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生30M的数据),操作如下: STEP1、建立表的各个分区的表空间: CREATE TABLESPACE ts_sale1999q1 DATAFILE ‘/u1/oradata/sales/sales1999_q1.dat’ SIZE 100M DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0) CREATE TABLESPACE ts_sale1999q2 DATAFILE ‘/u1/oradata/sales/sales1999_q2.dat’ SIZE 100M DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0)

详解ORACLE簇表、堆表、IOT表、分区表

详解ORACLE簇表、堆表、IOT表、分区表 簇和簇表 簇其实就是一组表,是一组共享相同数据块的多个表组成。将经常一起使用的表组合在一起成簇可以提高处理效率。 在一个簇中的表就叫做簇表。建立顺序是:簇→簇表→数据→簇索引 1、创建簇的格式 CREATE CLUSTER cluster_name (column date_type [,column datatype]...) [PCTUSED 40 | integer] [PCTFREE 10 | integer] [SIZE integer] [INITRANS 1 | integer] [MAXTRANS 255 | integer] [TABLESPACE tablespace] [STORAGE storage] SIZE:指定估计平均簇键,以及与其相关的行所需的字节数。 2、创建簇 create cluster my_clu (deptno number) pctused60 pctfree10 size1024 tablespace users storage( initial128k next128k minextents2 maxextents20

); 3、创建簇表 create table t1_dept( deptno number, dname varchar2(20) ) cluster my_clu(deptno); create table t1_emp( empno number, ename varchar2(20), birth_date date, deptno number ) cluster my_clu(deptno); 4、为簇创建索引 create index clu_index on cluster my_clu; 注:若不创建索引,则在插入数据时报错:ORA-02032: clustered tables cannot be used before the cluster index is built 管理簇 使用ALTER修改簇属性(必须拥有ALTER ANY CLUSTER的权限) 1、修改簇属性 可以修改的簇属性包括: * PCTFREE、PCTUSED、INITRANS、MAXTRANS、STORAGE * 为了存储簇键值所有行所需空间的平均值SIZE

ORACLE_分区表_分区索引_索引分区

分区表_分区索引_索引分区 在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用。 在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级。虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。 使用分区的优点: ·增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; ·维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; ·均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能; ·改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。 Oracle数据库提供对表或索引的分区方法有三种: ·范围分区 ·Hash分区(散列分区) ·复合分区 下面将以实例的方式分别对这三种分区方法来说明分区表的使用。为了测试方便,我们先建三个表空间。 create tablespace dinya_space01 datafile ’/test/demo/oracle/demodata/dinya01.dnf’ size 50M create tablespace dinya_space01 datafile ’/test/demo/oracle/demodata/dinya02.dnf’ size 50M create tablespace dinya_space01 datafile ’/test/demo/oracle/demodata/dinya03.dnf’ size 50M 1.1. 分区表的创建 1.1.1. 范围分区

oracle分区表彻底删除的办法

oracle分区表彻底删除的办法 当对一个不再使用的分区表进行drop后,查询user_tab_partitions视图发现出现如下不规则的分区表表名: SQL> select distinct table_name from user_tab_partitions; BIN$l+Pv5l1jCMXgQKjAyQFA0A==$0 这样很容易导致自己写的"自动增加表的分区"的存过发生错误,因此为了避免再修改存过,只能把这些不规则的表名删除才行.现提供如下方法彻底删除这些不规则的表名. 其实当我们执行drop table tablename的时候,不是直接把表删除掉,而是放在了回收站里,可以通过查询user_recyclebin查看被删除的表信息.这样,回收站里的表信息就可以被恢复或彻底清除。 通过查询回收站user_recyclebin获取被删除的表信息,如果想恢复被drop掉的表,可以使用如下语句进行恢复 flashback table to before drop; 上面的语句是将回收站里的表恢复为原表名称 flashback table to before drop rename to ; 将回收站里的表恢复为指定的新表名称,表中数据不会丢失。 若要彻底删除表,则使用语句:drop table purge;这样drop后的表就不被放入回收站 如果是清除回收站中指定的表,可以使用语句purge table ; 如果是清除当前用户回收站所有的表,可以使用语句purge recyclebin; 如果是清除所有用户的回收站:purge dba_recyclebin; 到此,按上面的方法清除回收站的数据后,再查询user_tab_partitions视图,发现不规则表名已经没有了 SQL> select distinct table_name from user_tab_partitions; no rows selected 在此顺便再提一下truncate操作后不释放空间的解决办法 Truncate不支持回滚,并且不能truncate一个带有外键的表,如果要删除首先要取消外键,然后再删除。 truncate table 后,有可能表空间仍没有释放,可以使用如下语句: alter table 表名称deallocate UNUSED KEEP 0; 注意如果不加KEEP 0的话,表空间是不会释放的。 例如: alter table tablenamedeallocate UNUSED KEEP 0; 或者: TRUNCATE TABLE tablename DROP STORAGE才能释放表空间。 例如:truncate table tablename DROP STORAGE; 查看各表空间空置率: select a.tablespace_name,a.free_space,b.total_space, a.free_space/ b.total_spacefree_ratio from (select tablespace_name,sum(bytes)/1024/1024free_space from dba_free_spa

Oracle建分区表

在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。 以system身份登陆数据库,查看v$option视图,如果其中Partition为TRUE,则支持分区功能;否则不支持。Partition有基于范围、哈希、综和三种类型。我们用的比较多的是按范围分区的表。 在ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。 以system身份登陆数据库,查看v$option视图,如果其中Partition为TRUE,则支持分区功能;否则不支持。Partition有基于范围、哈希、综和三种类型。我们用的比较多的是按范围分区的表。 我们以一个2001年开始使用的留言版做例子讲述分区表的创建和使用: 1 、以system 身份创建独立的表空间(大小可以根据数据量的多少而定) create tablespace g_2000q4 datafile '/home/oradata/oradata/test/g_2000q4.dbf' size 50M default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1); create tablespace g_2001q1 datafile '/home/oradata/oradata/test/g_2001q1.dbf' size 50M default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1); create tablespace g_2001q2 datafile '/home/oradata/oradata/test/g_2001q2.dbf' size 50M default storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 1); 2 、用EXPORT工具把旧数据备份在guestbook.dmp中 把原来的guestbook表改名 alter table guestbook rename to guestbookold; 以guestbook 身份创建分区的表 create table guestbook( id number(16) primary key, username varchar2(64), sex varchar2(2), email varchar2(256), expression varchar2(128), content varchar2(4000), time date, ip varchar2(64) ) partition by range (time) (partition g_2000q4 values less than (to_date('2001-01-01','yyyy-mm-dd')) tablespace g_2000q4

ORACLE分区表的使用

分区表的使用 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。 一、Oracle中提供了以下几种表分区: 1、范围分区:这种类型的分区是使用列的一组值,通常将该列成为分区键。 示例1:假设有一个CUSTOMER表,表中有数据200000行,我们将此表通过CUSTOMER_ID 进行分区,每个分区存储100000行,我们将每个分区保存到单独的表空间中,这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码,如下: CREATE TABLE CUSTOMER ( CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY, FIRST_NAME V ARCHAR2(30) NOT NULL, LAST_NAME V ARCHAR2(30) NOT NULL, PHONE VARCHAR2(15) NOT NULL, EMAIL VARCHAR2(80), STATUS CHAR(1) ) PARTITION BY RANGE (CUSTOMER_ID) ( PARTITION CUS_PART1 V ALUES LESS THAN (100000) TABLESPACE CUS_TS01, PARTITION CUS_PART2 V ALUES LESS THAN (200000) TABLESPACE CUS_TS02 ) 注意:在创建表进行分区时,表空间必须先存在,而且建议将不同的分区放入不同的表空间中。 示例2:假设有ORDER_ACTIVITIES表,每6个月对订单进行清理,我们可以按月份对表进行分区,分区代码如下: CREATE TABLE ORDER_ACTIVITIES ( ORDER_ID NUMBER(7) NOT NULL, ORDER_DATE DA TE, TOTAL_AMOUNT NUMBER, CUSTOTMER_ID NUMBER(7), PAID CHAR(1) ) PARTITION BY RANGE (ORDER_DA TE) ( PARTITION ORD_ACT_PART01 V ALUES LESS THAN

oracle分区表的建立方法

oracle分区表的建立方法 Oracle的分区表能够包括多个分区,每个分区差不多上一个独立的段(SEGMENT),能够存放到不同的表空间中。查询时能够通过查询表来访咨询各个分区中的数据,也能够通过在查询时直截了当指定分区的方法来进行查询。 分区提供以下优点: 由于将数据分散到各个分区中,减少了数据损坏的可能性; 能够对单独的分区进行备份和复原; 能够将分区映射到不同的物理磁盘上,来分散IO; 提高可治理性、可用性和性能。 Oracle提供了以下几种分区类型: 范畴分区(range); 哈希分区(hash); 列表分区(list); 范畴-哈希复合分区(range-hash); 范畴-列表复合分区(range-list)。 Oracle的一般表没有方法通过修改属性的方式直截了当转化为分区表,必须通过重建的方式进行转变,下面介绍三种效率比较高的方法,并讲明它们各自的特点。

方法一:利用原表重建分区表。 步骤: SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE); 表已创建。 SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS; 已创建6264行。 SQL> COMMIT; 提交完成。 SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME) 2 (PARTITION P1 V ALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')), 3 PARTITION P2 V ALUES LESS THAN (TO_DA TE('2005-1-1', 'YYYY-MM-DD')), 4 PARTITION P3 V ALUES LESS THAN (TO_DA TE('2005-7-1', 'YYYY-MM-DD')), 5 PARTITION P4 V ALUES LESS THAN (MAXV ALUE)) 6 AS SELECT ID, TIME FROM T; 表已创建。 SQL> RENAME T TO T_OLD;

oracle数据表分区介绍

此文从以下几个方面来整理关于分区表的概念及操作:1.表空间及分区表的概念2.表分区的具体作用3.表分区的优缺点4.表分区的几种类型及操作方法5.对表分区的维护性操作。 (1.) 表空间及分区表的概念表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。 分区表:当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。 ( 2)。表分区的具体作用Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。 分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。 什么时候使用分区表:1、表的大小超过2GB. 2、表中包含历史数据,新的数据被增加都新的分区中。 (3)。表分区的优缺点表分区有以下优点:1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。 2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 3、维护方便:如果表的某个分区出现故障,需要修复数

Oracle分区表(partitioned table)

Oracle分区表(partitioned table)管理分区表和索引 一、什么是分区表 现在的数据库,单个表的数据量可能很大,达到几百个G和几T的程度,这时侯,你需要使 用分区表和分区索引来管理数据,它将一个大的多分为块,称为分区(patitions),甚至子分 区(subpartition)。每一个分区都保存在自已的段中,可以单独的管理。分区可以结合并行 执行和合理的数据分布来提高系统的可用性和性能。 ●减少数据中断的可能性 ●可以单独备份或恢复每一个分区 ●控制分区的分布(平衡I/O负荷) ●提高可管理性,可用性和性能 二、表分区的方法 1. range 使用表的字段的值的范围来进行分区,它特别适用于数据有逻辑范围的表。如一年中的月。 当数据在范围内均匀分布时性能最好。 create table salse ( invoice_no number, sale year int not null, sale month int not null, sale_day int not null) partion by range(sale yea,sale_month,sale_day) (partition sale_q1 value less than (1999,04,01) tablespace tsa partition sale_q2 value less than (2000,04,01) tablespace tsb partition sale_q2 value less than (maxvalue) tablespace tsc);--最大值maxvalue 可以指定 enable row movement来设置当分区列的值被修改时,将行移动到不同的分区。 2. hash 当数据不容易使用range分区,但你又需要使用分区来提高性能和可管理性,hash分区方法, 根据分区值(partitioning key)的hash值来确定分区。 create table scubagear( id number, name varchar2(60)) partition by hash (id) partitions 4 store in (gear1,gear2,gear3,gear4); 3. list 当你需要控制行怎么映射至分区时,使用list分区方法,你可以将分区列的值指定到分区中。 create table q1_sale_by_region (dept_no number, dept_name varchar2(20), quarterly_sales number(10,2), state varchar2(2)) partition by list(state) (partition q1_northwest value ('OR','WA'), (partition q1_southwest value ('AZ','UT')); 可以用值DEFAULT来指定除已经明确指定的值以外其他的值,NULL来指定空值。

ORACLE分区表的概念及操作

ORACLE分区表的概念及操作 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点4.表分区的几种类型及操作方法5.对表分区的维护性操作. (1.) 表空间及分区表的概念表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。 ( 2).表分区的具体作用 Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。 分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每

个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用SQL DML 命令访问分区后的表时,无需任何修改。 什么时候使用分区表: 1、表的大小超过2GB。 2、表中包含历史数据,新的数据被增加都新的分区中。 (3).表分区的优缺点 表分区有以下优点: 1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。 2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。 缺点: 分区表相关:已经存在的表没有方法可以直接转化为分区表。不过Oracle 提供了在线重定义表的功能。 (4).表分区的几种类型及操作方法 一.范围分区: 范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期。举个例子:你可能会将销售数据按照月份进行分区。

Oracle 删除表分区

删除表分区 作者:来源:发布日期:2008-05-23 删除表分区(drop partition) 删除表分区包含两种操作,分别是: ? 删除分区:alter table [tbname] drop partition [ptname]; ? 删除子分区:alter table [tbname] drop subpartition [ptname]; 除hash分区和hash子分区外,其它的分区格式都可以支持这项操作。例如,删除分区: JSSWEB> select table_name,partition_name 2 from user_tab_partitions where table_name='T_PARTITION_LIST'; TABLE_NAME PARTITION_NAME ------------------------------ ------------------------------ T_PARTITION_LIST T_LIST_P1 T_PARTITION_LIST T_LIST_P2 T_PARTITION_LIST T_LIST_P3 T_PARTITION_LIST T_LIST_PD JSSWEB> alter table t_partition_list drop partition t_list_p2; 表已更改。 提示,drop partition时,该分区内存储的数据也将同时删除,例如:

JSSWEB> insert into t_partition_list values (1,'a'); .......... --插入一批记录,分布于当前各个分区.......... JSSWEB> commit; 提交完成。 JSSWEB> select *from t_partition_list; ID NAME ---------- -------------------------------------------------- 1 a 2 b 21 a 22 b --单独查询t_list_p3分区,当前有数据 JSSWEB> select *from t_partition_list partition(t_list_p3); ID NAME ---------- -------------------------------------------------- 21 a 22 b

oracle表分区详解

一、Oracle分区简介 ORACLE的分区是一种处理超大型表、索引等的技术。分区是一种“分而治之”的技术,通过将大表和索引分成可以管理的小块,从而避免了对每个表作为一个大的、单独的对象进行管理,为大量数据提供了可伸缩的性能。分区通过将操作分配给更小的存储单元,减少了需要进行管理操作的时间,并通过增强的并行处理提高了性能,通过屏蔽故障数据的分区,还增加了可用性。 二、Oracle分区优缺点 优点: 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能; 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。 缺点: 分区表相关:已经存在的表没有方法可以直接转化为分区表。不过Oracle 提供了在线重定义表的功能。 三、Oracle分区方法 范围分区: 范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。如根据序号分区,根据业务记录的创建日期进行分区等。 Ha sh分区(散列分区): 散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。 List分区(列表分区): 当你需要明确地控制如何将行映射到分区时,就使用列表分区方法。与范围分区和散列分区所不同,列表分区不支持多列分区。如果要将表按列分区,那么分区键就只能由表的一个单独的列组成,然而可以用范围分区或散列分区方法进行分区的所有的列,都可以用列表分区方法进行分区。 范围-散列分区(复合分区): 有时候我们需要根据范围分区后,每个分区内的数据再散列地分布在几个表空间中,这样我们就要使用复合分区。复合分区是先使用范围分区,然后在每个分区内再使用散列分区的一种分区方法(注意:先一定要进行范围分区) 范围-列表分区(复合分区): 范围和列表技术的组合,首先对表进行范围分区,然后用列表技术对每个范围分区再次分区。与组合范围-散列分区不同的是,每个子分区的所有内容表示数据的逻辑子集,由适当的范围和列表分区设置来描述。(注意:先一定要进行范围分区) 四、Oracle表分区表操作 --Partitioning 是否为true select * from v$option s order by s.PARAMETER desc --创建表空间 CREATE TABLESPACE "PARTION_03" LOGGING DA TAFILE 'D:\ORACLE\ORADATA\JZHUA\PARTION_03.dbf' SIZE 50M

oracle表空间表分区详解

oracle表空间表分区详解及oracle表 分区查询使用方法 此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。 分区表: 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。 ( 2).表分区的具体作用 Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。 分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。 什么时候使用分区表: 1、表的大小超过2GB。 2、表中包含历史数据,新的数据被增加都新的分区中。 (3).表分区的优缺点 表分区有以下优点: 1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。 2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

Oracle 修改分区表

Oracle 修改分区表 对分区表而言,可以像普通表一样使用ALTER TABLE语句进行修改。因引,本节主要介绍分区表所特有修改。 1.为范围分区表添加分区 如果要在范围分区表的尾部增加新分区,可以使用ADD PARTITION选项。下面以在范围分区表SALES_RANGE的尾部增加一个新分区为例,说明在范围分区表的尾部增加分区的方法。示例如下: SQL> alter table sales_range 2 add partition part_05 values less than(to_date('2009-04-01','yyyy-mm-dd')); 表已更改。 SQL> select segment_name,partition_name,tablespace_name 2 from user_segments 3 where segment_name='SALES_RANGE'; SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME --------------- ------------------------------ --------------- SALES_RANGE PART_01 SPACE01 SALES_RANGE PART_02 SPACE02 SALES_RANGE PART_03 SPACE03 SALES_RANGE PART_05 USERS SALES_RANGE PART_04 SPACE04 如果在创建分区表时,最后一个分区的上限值为MAXV ALUE,则无法在分区表的尾部添加新分区,反之将返回如下错误: SQL> alter table sales_range 2 add partition part_05 values less than(to_date('2009-04-01','yyyy-mm-dd')); add partition part_05 values less than(to_date('2009-04-01','yyyy-mm-dd')) * 第 2 行出现错误: ORA-14074: 分区界限必须调整为高于最后一个分区界限 如果在范围分区表的顶部或中间增加分区,可以使用SPLIT PARTITION选项。下面以在范围分区表SALES_RANGE的中间增加分区为例,说明使用SPLIT PARTITION选项的方法。示例如下: SQL> alter table sales_range 2 split partition part_0 3 at (to_date('2008-08-15','yyyy-mm-dd')) 3 into (partition part_03_01,partition part_03_02); 表已更改。 2.为散列分区表增加分区 如果要为散列分区表增加分区,即可以指定分区名,也可以不指定分区名。如果不指定

相关主题
相关文档
最新文档