• 6.3、分区表、分区表索引--Oracle模式对象


    分区:

    (1).一种分区技术,可以在创建表时应用分区技术,将数据以分区形式保存

    (2).可以将巨型表或索引分割成相对较小的、可独立管理的部分

    (3).表分区时必须为表中的每一条记录指定所属分区

     

    对表进行分区优点:

    增强可用性;

    维护方便;

    均衡I/O

    改善查询性能。

     

    创建分区表

    分区方法:范围分区、散列分区、列表分区、组合范围散列分区和组合范围列表分区;

     

    1、范围分区:是对数据表中某个值的范围,使用partition by range子句进行分区。

     1 create table testscore(
     2 id      number primary key,
     3 name    varchar2(8),
     4 subject varchar2(10),
     5 score   number
     6 )
     7 --指定按照score列,进行范围分区
     8 partition by range(score)
     9 (
    10 --将表分成3个区,分别为range1、range2、range3,并存在不同的三个表空间上
    11 partition range1 values less than(60) tablespace AAA,
    12 partition range2 values less than(80) tablespace BBB,
    13 partition range3 values less than(maxvalue) tablespace CCC
    14 );

    --向表testscoe中插入数据

    1 insert into testscore values (1,'tyou','maths',50);
    2 insert into testscore values (2,'zhangsa','maths',90);
    3 insert into testscore values (3,'thm','english',76);
    4 insert into testscore values (4,'tya','maths',98);
    5 insert into testscore values (5,'jionjion','yuwen',32);
    6 insert into testscore values (6,'haha','wuli',66);
    7 commit;

    --查询分区range1的结果如下:

    select * from testscore partition(range1);

    --查询分区range2的结果如下:

    select * from testscore partition(range2);

     

    2、散列分区:通过哈希hash算法均匀分布数据,通过在I/O设备上进行散列分区,可以使得分区的大小一致。使用partition by hash子句。

     1 create table testid(
     2 id      number primary key,
     3 name    varchar2(8),
     4 subject  varchar2(10),
     5 score     number
     6 )
     7 --指定按照id列,进行散列分区
     8 partition by hash(id)
     9 (
    10 partition part1 tablespace AAA,
    11 partition part2 tablespace BBB,
    12 partition part3 tablespace BBB
    13 );

    3、列表分区:适用于分区列的值为非数字或日期数据类型,并且分区列的取值范围较少时,使用partition by list子句。

    --例如,成绩表中的subject科目列取值较少。

     1 create table testsubject(
     2 id      number primary key,
     3 name    varchar2(8),
     4 subject varchar2(10),
     5 score   number
     6 )
     7 --指定按照id列,进行散列分区
     8 partition by list(subject)
     9 (
    10 partition part1 values('maths','yuwen') tablespace AAA,
    11 partition part2 values('english','wuli') tablespace BBB,
    12 partition part3 values('huaxue') tablespace CCC
    13 );

    --向表testsubject中插入数据

    1 insert into testsubject values (1,'tyou','maths',50);
    2 insert into testsubject values (2,'zhangsa','maths',90);
    3 insert into testsubject values (3,'thm','english',76);
    4 insert into testsubject values (4,'tya','maths',98);
    5 insert into testsubject values (5,'jionjion','yuwen',32);
    6 insert into testsubject values (6,'haha','wuli',66);
    7 insert into testsubject values (7,'hehe','huaxue',66);
    8 commit;

    --查询分区part1的结果如下:

    select * from testsubject partition(part1);

    --查询分区part2的结果如下:

    select * from testsubject partition(part2);

    --查询分区part3的结果如下:

    select * from testsubject partition(part3);

     

    4、组合范围散列分区:结合范围分区和散列分区

     1 create table testRanHas(
     2 id      number primary key,
     3 name    varchar2(8),
     4 subject varchar2(10),
     5 score   number
     6 )
     7 --指定按照score列范围分区分成3个分区
     8 partition by range(score)
     9 --然后,再使用subpartition by子句进行散列分区
    10 subpartition by hash(id)
    11 subpartitions 2 store in (AAA,BBB)
    12 (
    13 partition range1 values less than(60),
    14 partition range2 values less than(80),
    15 partition range3 values less than(maxvalue)
    16 );

    5、组合范围列表分区:结合范围分区和列表分区

     1 create table testRanLis(
     2 id      number primary key,
     3 name    varchar2(8),
     4 subject varchar2(10),
     5 score   number
     6 )
     7 partition by range(score)
     8 subpartition by list(subject)
     9 (
    10 partition range1 values less than(60)
    11      (
    12       subpartition part1_1 values('maths','yuwen') tablespace AAA,
    13       subpartition part1_2 values('english','wuli') tablespace BBB
    14       ),
    15 partition range2 values less than(80)
    16       (
    17       subpartition part2_1 values('maths','yuwen') tablespace AAA,
    18       subpartition part2_2 values('huaxue') tablespace CCC
    19       ),
    20 partition range3 values less than(maxvalue)
    21       (
    22        subpartition part3_1 values('maths','yuwen') tablespace AAA,
    23        subpartition part3_2 values('english','wuli') tablespace BBB,
    24        subpartition part3_3 values('huaxue') tablespace CCC
    25        )
    26 );

     

    分区表索引:3种类型,局部分区索引、全局分区索引和全局非分区索引

    局部分区索引:

    为分区表的各个分区单独建立的索引,各个分区索引之间相互独立的。

    --先创建一个范围分区表

     1 create table testscore(
     2 id      number primary key,
     3 name    varchar2(8),
     4 subject varchar2(10),
     5 score   number
     6 )
     7 partition by range(score)
     8 (
     9 partition range1 values less than(60) tablespace AAA,
    10 partition range2 values less than(80) tablespace BBB,
    11 partition range3 values less than(maxvalue) tablespace CCC
    12 );

    --再创建局部分区索引

    1 create index index_testscore
    2 on testscore(name) local
    3 (
    4 partition index1 tablespace AAA,
    5 partition index2 tablespace BBB,
    6 partition index3 tablespace CCC
    7 );

    全局分区索引:

    对整个分区表建立的索引,全局分区索引的各个分区之间不是相互对立的。

    1 create index global_index_testscore
    2 on testscore(score)
    3 Global partition by range(score)
    4 (
    5 partition range1 values less than(60) tablespace AAA,
    6 partition range2 values less than(80) tablespace BBB,
    7 partition range3 values less than(maxvalue) tablespace CCC
    8 );

    注意:使用global建立全局分区索引,只能用于range分区!!!
     

    全局非分区索引:

    对整个分区表建立索引,但未对索引进行分区。

    create index nopart_index_testscore

    on testscore(subject);

     

    分区表管理:

    1、增加分区

    为范围分区表增加分区:

    --先创建一个test范围分区表

    create table test(
    id      number primary key,
    name    varchar2(8),
    subject varchar2(10),
    score   number
    )
    partition by range(score)
    (
    partition range1 values less than(60) tablespace AAA,
    partition range2 values less than(80) tablespace BBB,
    partition range3 values less than(100) tablespace CCC
    );

    --在最后一个分区之后增加分区

    alter table test
    add partition range4 values less than(150)

     

    --在分区中间或开始出增加分区

    --80-100之间,增加一个90分开成两个分区,即range3分成range5和range6

    1 alter table test
    2 split partition range3 at(90)
    3 into(
    4      partition range5 tablespace AAA,
    5      partition range6 tablespace BBB
    6      );

     

    为散列分区表增加分区:

    alter table test2

    add partition range4 tablespace AAA;

     

    为列表分区表增加分区:

    alter table test3

    add partition range4 values('shengwu') tablespace AAA;

     

    2、合并分区:

    --将之前增加的分区合并

    alter table test

    merge partitions range5,range6 into partition range3;

     

    3、删除分区:

    alter table test

    drop partition range4;

     

     

    生命不息,折腾不止;不计后果,不问前程!
  • 相关阅读:
    Jenkins安装部署及使用
    Jenkins详细安装与构建部署使用教程
    线程池使用拒绝策略时需要注意的坑
    线程池的4种拒绝策略
    neo4j allshortestpaths查询路径不准确问题
    程序员必备的网站之Tutorialspoint
    All shortest paths between a set of nodes
    Neo4j/Cypher: All paths between two nodes with a relationship property filter
    12款好看的英文字体下载《可以免费用于商业用途》
    国外经典设计:12个漂亮的移动APP网站案例
  • 原文地址:https://www.cnblogs.com/jionjionyou/p/5548176.html
Copyright © 2020-2023  润新知