美文网首页
数据库之分区分表

数据库之分区分表

作者: Josen_Qu | 来源:发表于2016-04-10 22:12 被阅读22次

    分区分表:

    应用场景

    当数据很大时推荐使用,比如大于2G。
    通常使用提取数据的字段来分区。

    首先对几个逻辑存储结构概念有个认识:

    表空间:

    一个最高级的存储结构,创建分区时可指定表空间,默认在同一个表空间。

    数据段segment:

    数据段是与数据库对象相对应,一般一个数据库对象对应一个数据段。
    分表就是使用多个表空间。
    分区表每个分区都会对应一个数据段,可以在表dba_segments查看。

    分区类型:

    range(根据范围分区)

    hash(只需要指定分区数,根据指定散列值分区)

    list(根据具体的value分区),组合分区(前三种类型的组合)

    range date类型可以按照下面方法自动扩展分区

    PARTITION BY RANGE(SUB_DATE)
    根据年: INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))
    根据月: INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
    根据天: INTERVAL(NUMTODSINTERVAL(1,'DAY'))
    根据时分秒: NUMTODSINTERVAL( n, { 'DAY'|'HOUR'|'MINUTE'|'SECOND'})
    

    分区索引:

    global和local

    全局索引(global index):

    即可以分区,也可以不分区。即可以建range分区,也可以建hash分区,即可建于分区表,又可创建于非分区表上,就是说,全局索引是完全独立的,因此它也需要我们更多的维护操作。
    global index:与表分区是独立的,全局索引即可分区也可以不分区,

    1. 不分区global index:
      GLOBAL不分区索引一般不太推荐,因为是用一颗大的索引树来映射一个表,这个过程,这样速度不见得比不分区快。
      与普通索引一样,创建方法:create与普通索引一样,创建方法:create index JOSEN_INDEX2 on JOSEN_TB(USER_name) global ;
    2. 分区global index:
      查找数据若通过要通过索引,是先定位了索引内部的分区,然后在这个分区索引中找到ROWID,然后回表提取数据。
      相当于该索引由多个segment组成,创建方法同表分区:create index JOSEN_INDEX1 on JOSEN_TB(USER_ID) global
      partition by range(USER_ID)(
      partition p1 values less than(100),
      partition pmax values less than(maxvalue)
      );

    局部索引(local index):

    其分区形式与表的分区完全相同,依赖列相同,存储属性也相同。对于本地索引,其索引分区的维护自动进行,就是说你add/drop/split/truncate表的分区时,本地索引会自动维护其索引分区。LOCAL索引是和分区的个数逐个对应的,可以说先定位分区表的分区也可以说先定位索引的分区,因为他们是一一对应的,找到对应分区后,分区内部索引数据集合。
    创建方法:create index index_name on table_name(index_column) local;

    参考一:
    http://www.itpub.net/thread-1837207-1-1.html
    参考二:
    http://www.blogjava.net/rabbit/archive/2013/01/08/393955.html
    表空间等存储结构概念参考:http://blog.itpub.net/17203031/viewspace-682003/

    相关文章

      网友评论

          本文标题:数据库之分区分表

          本文链接:https://www.haomeiwen.com/subject/aezblttx.html