oracle中的分区表

来源:互联网 发布:淘宝规则培训 编辑:程序博客网 时间:2024/06/04 17:40
查看数据库名


SQL> select name from v$database;


查看实例名


SQL> select instance_name from v$instance;


oracle分区表


1.表空间及分区表的概念
 表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。
  
 分区表: 
 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。
 表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
  
  
  首先明确分区表和表分区的区别:表分区是一种思想,分区表示一种技术实现。当表的大小过G的时候
  可以考虑进行表分区,提高查询效率,均衡IO。oracle分区表是oracle数据库提供的一种表分区的实现形式。
  表进行分区后,逻辑上仍然是一张表,原来的查询SQL同样生效,同时可以采用使用分区查询来优化SQL查询效率,不至于每次都扫描整个表


2.表分区的具体作用
 Oracle的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。
 此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。 
 分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。
 每个分区有自己的名称,还可以选择自己的存储特性。
 从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,
 这就使数据库管理员在管理分区后的对象时有相当大的灵活性。
 但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用 SQL DML 命令访问分区后的表时,无需任何修改。
  
 什么时候使用分区表:
  1、表的大小超过2GB。
  2、表中包含历史数据,新的数据被增加到新的分区中。
 
3.表分区的优缺点
 表分区有以下优点: 
  1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
  2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
  3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 
  4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
 缺点: 
  分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。




分区表的基本操作:


1.按时间分区表创建: 


create table t_test (
   pk_id                number(30)                      not null,
  add_date_time        DATE,
   constraintPK_T_TEST primary key (pk_id)
)
PARTITION BY RANGE (add_date_time)
(
  PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
  PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
  PARTITION t_test_2014VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))TABLESPACE TS_MISPS
)
其中add_date_time为分区字段,每一年一个分区。


插入100W数据


declare
  i    int := 1;
  yearVARCHAR2(20);
begin
  loop
    year := CASEmod(i, 3)
             WHEN 0 THEN
              '2012-01-14 12:00:00'
             WHEN 1 THEN
              '2013-01-14 12:00:00'
             ELSE
              '2014-01-14 12:00:00'
            END;
           insert into t_test values(i, to_date(year, 'yyyy-mm-dd hh24:mi:ss'));
    exit when i= 1000000;
    i := i + 1;
  end loop;
end;






查看分区的详细信息:
Select table_name,partition_name,high_value fromdba_tab_partitions where table_name='T_TEST';


2、分区表修改
2.1增加一个分区


分两种情况:1.没有maxvalue分区。2.有maxvalue分区。我们创建的分区就是没有maxValue的分区


1.没有maxvalue分区添加新分区:
alter table t_test add partition t_test_2015 VALUESLESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACETS_MISPS ;


2、有maxvalue分区添加新分区:


有了maxvalue,就不能直接add partition,而是需要max分区split。例如我们将创建的分区的语句修改下:


create table t_test (
   pk_id                number(30)                      not null,
  add_date_time        DATE,
   constraintPK_T_TEST primary key (pk_id)
)
PARTITION BY RANGE (add_date_time)
(
  PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
  PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
  PARTITIONt_test_2014 VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS,
    PARTITION t_test_maxVALUES LESS THAN (MAXVALUE)
)
增加一个2016年的分区语句为:
alter table t_test split partition t_test_max at(TO_DATE('2016-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) into (partitiont_test_2015,partition t_test_max);
2.2删除一个分区


alter table t_test drop partition t_test_2014 
注:droppartition时,该分区内存储的数据也将同时删除,你的本意是希望删除掉指定的分区但保留数据,你应该使用merge partition,执行该语句会导致glocal索引的失效需要重建全局索引
Alter  table t_test  merge partitions t_test_2013  ,t_Test_2014 into partition t_Test_2013_to_2014


2.3合并分区


相邻的分区可以merge为一个分区,新分区的下边界为原来边界值较低的分区,上边界为原来边界值较高的分区,原先的局部索引相应也会合并,全局索引会失效,需要rebuild。


二、对分区表进行查询
2.1查询


不使用分区查询:默认查询所有分区数据
select * from t_test 
使用分区查询:只查询该分区数据


select * from t_testpartition(t_test_2014) where add_date_time >=TO_DATE('2014-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
.1插入




insert into t_test values(i, to_date(year,'yyyy-mm-dd hh24:mi:ss'));


使用分区删除


更新的时候指定了分区,而根据查询的记录不在该分区中时,将不会删除数据




delete t_test partition(t_test_2013) where id=1;
不使用分区删除




delete t_test  whereid=1;


2.1修改


使用分区更新


更新的时候指定了分区,而根据查询的记录不在该分区中时,将不会更新数据




delete t_test where id=1;
update t_test partition(t_test)  set id=1 where id=2;
不使用分区


delete t_test where id=1;
update t_test  set id=1 where id=2;
























创建表空间  
create tablespace part1   
datafile 'E:/oracle_tablespaces/prat1.dbf'   
size 1500M   
autoextend on next 5M maxsize 3000M;
  
删除表空间  
drop tablespace part1 including contents and datafiles


创建分区表:


create table obj_range
    (object_id number,
     object_name varchar2(128),
     created date,
     object_type varchar2(19)
    )
    partition by range(object_id)
    (
     partition range_p1 values less than(3000) tablespace part1,
    partition range_p2 values less than(6000) tablespace part2,
    partition range_p3 values less than(maxvalue) tablespace part3
   );
   
  
  写一个pl/sql 脚本插入数据:
  
declare
  i    int := 1;
  year VARCHAR2(20);
begin
  loop
    year := CASE mod(i, 3)
             WHEN 0 THEN
              '2012-01-14 12:00:00'
             WHEN 1 THEN
              '2013-01-14 12:00:00'
             ELSE
              '2014-01-14 12:00:00'
            END;
           insert into obj_range values(i,to_char(i), to_date(year, 'yyyy-mm-dd hh24:mi:ss'));
    exit when i= 1000000;
    i := i + 1;
  end loop;
end;






查看分区的信息:


select table_name,partition_name,high_value from dba_tab_partitions where table_name='prat1';


hash分区表:
 create table obj_hash
    (object_id number,
     object_name varchar2(128),
     created date,
     
    )
    partition by hash(object_name)
  (
    partition hash_p1 tablespace part1,
    partition hash_p2 tablespace part2,
    partition hash_p3 tablespace part3
  )
0 0
原创粉丝点击