海量数据库设计思想

分区

 
1.范围分区

A.通常按时间字段划分

CREATE TABLE 
PARTITION BY RANGE()
(
PARTITION partition_1 VALUES LESS THAN (TO_DATE('01/02/2000','DD/MM/YYYY')),
PARTITION partition_2 VALUES LESS THAN (TO_DATE('01/03/2000','DD/MM/YYYY'))
)


B.使用传递表空间的方式导出历史数据入OLAP数据库

     表空间上的对象必须为自包含,表示为:

      a.索引在这个表空间上,它所引用到的表不在其他表空间上
      b.分区表的部分分区不在其他表空间上
      c.完整性约束的参考对象不在其他表空间上
      d.表中包含的LOB对象不在其他表空间上

C.使用分区交换的方法,将分区表(不同分区使用不同表空间)的部分分区转换到某临时建立的表空间,然后使用表空间传递

ALTER TABLE   partition_table  EXCHANGE PARTITION   partition_1  WITH TABLE   tmp_table  INCLUDING INDEXES WITH VALIDATION

tmp_tablepartition_table有相同的表结构定义


2. 哈希分区

A.适合于在各个分区中数据分布要求均匀的情况下,比如分区表空间存放在不同的容量相近的物理介质中,可以提高DML的并行操作(因为平均)

CREATE TABLE
PARTITION BY HASH()
PARTITIONS 8

B.哈希分区是一种基于hash函数的分区方式,不能DROP,SPLIT以及MERGE分区,但是可以TRUNCATE分区,分区索引,分区裁剪可用

C.哈希分区数据均匀分布的前提条件是,hash列重复率比较低

3. 列表分区

提供一种按照字段的值来进行分区的方法,适合有高重复率的字段值的表

CREATE TABLE
PARTITION BY LIST()
(
PARTITION partition_1 VALUES(),
PARTITION partition_2 VALUES(),
PARTITION partition_other VALUES(DEFAULT) --默认分区
)

4. 组合分区

A.范围-哈希组合分区

CREATE  TABLE
PARTITION BY RANGE()
SUBPARTITION BY HASH()
(
PARTITION p1 VALUES LESS THAN()
     (
      SUBPARTITION sp1,
      SUBPARTITION sp2
     )
),
(
PARTITION p2 VALUES LESS THAN()
     (
      SUBPARTITION sp3,
      SUBPARTITION sp4
     )
)



B.范围-列表组合分区

CREATE  TABLE
PARTITION BY RANGE()
SUBPARTITION BY LIST()
(
PARTITION p1 VALUES LESS THAN()
     (
      SUBPARTITION sp1 VALUES () ,
      SUBPARTITION sp2 VALUES () 
     )
),
(
PARTITION p2 VALUES LESS THAN()
     (
      SUBPARTITION sp3 VALUES () ,
      SUBPARTITION sp4 VALUES () 
     )
)

索引


1. B树索引
A.主键或者唯一性约束
主键更强调表的关系性,它可以被其他表的外键所用
唯一性约束则强调字段值的唯一性

即使有上亿条记录的表中,B树索引的性能不被影响多少


B.键值重复率较低的字段


2. 位图索引

每一个位图索引的键值中,都会存放指向很多行的指针,而不是一行,这样,位图索引存放的键值就会比B树索引少得多

位图索引适合对索引的键值进行count这样的操作,也非常适合在索引字段间进行或(“OR”)与(“AND”)这样的逻辑运算操作

位图索引占用的空间要远小于B树索引占用的空间

不适用于有大量“写”操作的数据库,在于更新时会阻塞相应键值的多行记录

3. 全文索引

create index xxx on t(name) indextype is ctxsys.context;

select * from t where contain(name,'XXX') >0

创建了DR$开头的四个全文索引的基表,所有的全文索引的信息都保留在这些基表内。索引建立在基表上。全文索引本身并不包含数据,也不占用空间(无段对象在user_segments)

全文索引占用的空间非常大,会达到原表的几倍或者更多

以context方式创建的全文索引默认不是基于事务的,当提及DML操作,修改的信息不会影响索引,而是存放在DR$PENGING表中,需要同步索引更新

alter index xxx rebuild parameters('sync')



对象属性

OLTP系统以下的对象属性应该受到关注:

PCT_FREE               一个数据块中空闲空间的最小百分比
PCT_USED               一个数据块存储数据的最小百分比
INI_TRANS               一个数据块上最初分配的事务数
MAX_TRANS               一个数据块上最大分配的事务数
INITIAL_EXTENT          第一个extent的大小
NEXT_EXTENT          下一个extent的大小
MIN_EXTENTS          段首次分配的extent的大小
MAX_EXTENTS          最大可分配的extent的大小
PCT_INCREASE          extent扩展时,每次增加的百分数
FREELISTS               段中空闲块列表
CACHE                    是否缓存到内存中

OLAP系统以下的对象属性应该受到关注:

DEGREE

对象并行执行时使用的并行度,并非并行度越高,执行效率就越高,和系统资源,CPU数量,是否RAC架构等因素有关

在对象(表,索引等)上创建并行度

服务器CPU数X每个CPU启用的线程数=默认并行度

select degree from user_tables where table_name=''

使用HINT方式

select /*+ parallel(t1 4) */ from t1;

并行度不能在分区级别设置

COMPRESSION

分区表或者分区索引是可以单独压缩的

alter table t1 modify partition p1 compress;

分区索引的压缩要求先建索引的压缩,然后取消分区索引的压缩

alter index t1_idx rebuild partition p1 nocompress

数据压缩,释放更多的磁盘空间给其他对象使用,前提是数据重复率高有效

提高查询性能,压缩之后,扫描的数据块数量变少,物理I/O减少,一致性读减少。

DML操作涉及数据压缩的有:

alter table move
create table as select
insert /*+ append */
sqlldr+ direct path

普通的insert操作没有数据压缩


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值