数据库之分区分表
2016-04-10 本文已影响22人
Josen_Qu
分区分表:
应用场景
当数据很大时推荐使用,比如大于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:与表分区是独立的,全局索引即可分区也可以不分区,
- 不分区global index:
GLOBAL不分区索引一般不太推荐,因为是用一颗大的索引树来映射一个表,这个过程,这样速度不见得比不分区快。
与普通索引一样,创建方法:create与普通索引一样,创建方法:create index JOSEN_INDEX2 on JOSEN_TB(USER_name) global ; - 分区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/