zoukankan      html  css  js  c++  java
  • 【学习笔记】分区表和分区索引——概念部分(一)

    上周看了《[三思笔记]全面学习分区表及分区索引.pdf》,按学习顺序记录将学习笔记粘出来如下:

    当 表中的数据量不断增加,查询数据的速度就会变慢,程序性能也会降低,这时候或许可以考虑将表分区。表进行分区后,逻辑上表仍然是一个逻辑表,但是由于进行 了分区,就可以将每个分区分别存放到不同的物理文件里(每个分区对应一个段,一个或多个段可以存放到一个表空间,而一个或多个物理文件又可以存放到一个表 空间里,结果就是可能每个分区存放到不同的物理文件里)

    一、使用分区的优点:

    1、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用

    2、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

    3、可均衡I/O:可以把不同的分区影射到磁盘一平衡I/O,改善整个系统性能

    4、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度

    二、Oracle数据库分区的方法有:

    1、范围分区(Range)

    2HASH分区(Hash

    3、列表分区(List)

    4、复合分区(Composite)

    4.1 范围+HASH(range-hash)

    4.2 范围+列表(range-list)

    三、各种分区的特点:

    1 范围分区是根椐分区键的不同取值范围来划分子集的,关键字RANGEVALUES LESS THAN

    2、列表分区是根椐分区键的一些离散的取值来划分子集的,关键字 listVALUES

    3、哈希分区是应用哈希算法将分区键对应到某个子集中去,关键字 hashPARTITIONS

    4、混合分区只能有两层,第一层是范围分区,第二层可以是列表分区或者哈希分区;

    四、分区表的创建:

    1、创建 range 分区表
    create table t_partition_range(id number,name varchar2(50))
    partition by range(id)
    (
    partition t_range_p1 values less than(10) tablespace test1,
    partition t_range_p2 values less than(20) tablespace test2,
    partition t_range_p3 values less than(30) tablespace test3,
    partition t_range_p4 values less than(maxvalue) tablespace test4
    );
    注意:分区表存储表空间可选,即可以是同一个表空间也可以是不同表空间;可以写也可以不写,如果不显示写分区存储表空间,
    则表空间默认和表所存储表空间一致。

    user_part_tables:记录分区的表信息
    user_tab_partitions:记录表的分区的信息


    对 range 分区表创建 global 或 local 分区索引:
    (1)创建global索引range分区:
    create index idx_parti_range_id on t_partition_range(id)
    global partition by range(id)(
    partition i_range_p1 values less than(10),
    partition i_range_p2 values less than(20),
    partition i_range_p3 values less than(30),
    partition i_range_pmax values less than(maxvalue)
    );

    创建global索引的分区与创建表的分区语句格式完全相同,而且其分区形式与索引所在表的分区形式没有关联关系。
    另外需要说明的是:对于range类型的分区表,不是只能创建range分区的global索引,也可以创建hash分区的global索引或其他。
    user_part_indexes:记录分区的索引信息
    user_ind_partitions:记录索引的分区信息

    注意:创建 global 索引分区和创建分区表语法一样;global 各个索引分区所在表空间可以显示写(任意指定)也可以不写,如果不显示写分区存储表空间,则表空间默认和表所存储表空间一致。

    (2)创建 local 索引:
    drop index idx_parti_range_id;
    create index idx_parti_range_id on t_partition_range(id) local;

    这个 local 没有指定每个分区索引所在表空间,当然也可以自定义。
    create index idx_part_range_id on t_partition_range(id) local(
    partition i_range_p1 tablespace test1,
    partition i_range_p2 tablespace test2,
    partition i_range_p3 tablespace test3,
    partition i_range_pmax tablespace test4
    );

    2、创建 hash 分区
    hash 分区的创建有两种方式:
    (1)直接指定分区名,分区锁在表空间等信息。
    (2)只指定分区数量,和可供使用的表空间。
    创建hash分区表:
    create table t_partition_hash(id number,name varchar2(50))
    partition by hash(id)(
    partition t_hash_p1 tablespace test1,
    partition t_hash_p2 tablespace test2,
    partition t_hash_p3 tablespace test3
    );

    实现上述效果还可以这样:
    create table t_partition_hash3(id number,name varchar2(50))
    partition by hash(id)
    partitions 2 store in (test1,test2,test3);


    注意:分区表个数和存储的表空间个数不是一一对应的,那么这个创建 hash 分区的结果会是什么样的呢?
    SQL> select upt.table_name,upt.partitioning_type,upt.partition_count
    2 from user_part_tables upt where upt.table_name='T_PARTITION_HASH2';

    TABLE_NAME PARTITIONING_TYPE PARTITION_COUNT
    ------------------------------ ----------------- ---------------
    T_PARTITION_HASH2 HASH 5
    SQL> select utp.table_name,utp.partition_name,utp.tablespace_name from user_tab_partitions utp where utp.table_name='T_PARTITION_HASH3';

    TABLE_NAME PARTITION_NAME TABLESPACE_NAME
    ------------------------------ ------------------------------ -----------------------
    T_PARTITION_HASH2 SYS_P128 TEST1
    T_PARTITION_HASH2 SYS_P129 TEST2
    T_PARTITION_HASH2 SYS_P130 TEST3
    T_PARTITION_HASH2 SYS_P131 TEST1
    T_PARTITION_HASH2 SYS_P132 TEST2

    结果:创建了5个分区,即创建的分区个数和指定个数一致。
    创建global索引hash分区
    create index idx_part_hash_id on t_partition_hash2(id)
    global partition by hash(id)
    partitions 8 store in (test1,test2,test3);
    如果创建上面这种 global 索引会出现什么情况呢?当然也是创建8个分区索引。


    3、创建list分区
    create table t_partition_list(id number,name varchar2(50))
    partition by list(id)
    (
    partition t_list_p1 values (1,2,3,4,5,6,7,8,9) tablespace test1,
    partition t_list_p2 values (10,11,12,13,14,15,16,17,18,19) tablespace test2,
    partition t_list_p3 values (20,21,22,23,24,25,26,27,28,29) tablespace test3,
    partition t_list_p4 values (default) tablespace test4
    );

    4、创建range_hash组合分区
    (1)为所有分区各创建4个hash子分区。
    create table t_partition_rh(id number,name varchar2(50))
    partition by range(id) subpartition by hash(name)
    subpartitions 4 store in (test1,test2,test3)
    (
    partition t_r_p1 values less than(10),
    partition t_r_p2 values less than(20),
    partition t_r_p3 values less than(30),
    partition t_r_p4 values less than(maxvalue)
    );
    (2)对某个表创建hash子分区
    create table t_partition_rh(id number,name varchar2(50))
    partition by range(id) subpartition by hash(name)
    (
    partition t_r_p1 values less than (10) tablespace test1,
    partition t_r_p2 values less than (20) tablespace test2,
    partition t_r_p3 values less than (30) tablespace test3
    (
    subpartition t_r_p3_h1 tablespace test1,
    subpartition t_r_p3_h2 tablespace test2,
    subpartition t_r_p3_h3 tablespace test3
    ),
    partition t_r_p4 values less than (40) tablespace test4
    );
    (3)给各个分区指定不同的子分区
    create table t_partition_rh(id number,name varchar2(50))
    partition by range(id) subpartition by hash(name)(
    partition t_r_p1 values less than (10),
    partition t_r_p2 values less than (20)
    (
    subpartition t_r_p2_h1,
    subpartition t_r_p2_h2
    ),
    partition t_r_p3 values less than (30)
    subpartitions 3,
    partition t_r_pd values less than (maxvalue)
    (
    subpartition t_r_p3_h1,
    subpartition t_r_p3_h2,
    subpartition t_r_p3_h3
    )
    );
    select 由上可知:未显示指定子分区的分区,系统会自动创建一个子分区。
    (4)分区模板的应用
    oracle提供的分区模板,在指定子分区信赖列之后,制定子分区的存储模板,各个分区即会按照子分区模式创建子分区,如:
    create table t_partition_rh(id number,name varchar2(50))
    partition by range(id) subpartition by hash(name)
    subpartition template(
    subpartition h1,
    subpartition h2,
    subpartition h3,
    subpartition h4)
    (
    partition t_r_p1 values less than (10),
    partition t_r_p2 values less than (20),
    partition t_r_p3 values less than (30),
    partition t_r_pd values less than (maxvalue)
    );

    创建复合分区 local 索引:
    create index idx_part_r1_id on t_partition_rh(id) local;

    5、创建 range-list 组合分区
    range-list 组合分区的创建和 range-hash 相似,不再举例。

    公共准则:
    1、如果选择的分区不能确保各分区内记录量的平均值,则这种分区方式有可能是不恰当的。
    2、对于分区的表或索引,其所涉及的所有分区,其块大小必须一致。

    原文:http://blog.itpub.net/24496749/viewspace-1037956/

    相关:深入学习Oracle分区表及分区索引

  • 相关阅读:
    Makefile 使用总结(转)
    linux,pthread(转)
    Java中this和super的用法总结
    「转」开发十年,只剩下这套Java开发体系了
    js的function立即执行函数
    什么是回调函数
    算法总结:双指针法的常见应用
    26. Remove Duplicates from Sorted Array
    1. Two Sum
    Spring的依赖注入和控制反转
  • 原文地址:https://www.cnblogs.com/langtianya/p/4997933.html
Copyright © 2011-2022 走看看