数据库设计方面:
1:数据库块大小选择(db_block_size)
默认是8k,块越大,装的行记录就越多,所需的块就越少,读取记录产生的io就越少
OLAP(数据仓库)特点是一般用户不多,并发不大,查询方式最多是使用全表扫描,返回大量的数据,
OLTP 特点是用户很多,并发很大,查询方式最多是使用索引,返回极少的数据
因此OLAP中block尽量大,块设置越大性能越会有提升
oltp系统倾向于索引读返回少量记录,块的大小对性能影响不大。如果块设置太大,容易导致
大量并发查询及更新操作都指向同一个数据块,从而产生热块
2:创建数据文件时extent的扩展
对oracle来说,表空间扩展是要格式化操作系统文件成为oracle可以识别的数据库文件,需要很大开销
因此在创建表空间时,一般会多预先分配大点的空间
3:表的pctfree设置
pctfree控制着block块中的free空间,可以根据数据库对表更新的频繁程度,对表的pctfree做设置,免得产生行迁移,影响性能
pctfree设置大一些,可避免行迁移
alter table xx pctfree 20
其实消除行迁移的一个简单方法,就是数据重建
分区表的一些基础
分区表
三种类型:范围分区、列表分区、hash分区、组合分区
范围分区使用最广,列表分区次之
不同分区,在不同segment中,可以将分区指定到不同的表空间里
1:范围分区
最常见的是按时间列进行分区
create table xxx(id number,deal_date date,area_code number)
partition by range(deal_date)
(
partition p1 values less tha(to_date('2012-02-01','YYYY-MM-DD')),
...................
partition p11 values less tha(to_date('2012-12-01','YYYY-MM-DD')),
partition p12 values less tha(to_date('2013-01-01','YYYY-MM-DD')),
partition p_max values less tha(maxvalue)
);
2:列表分区
最常见的是按地区列进行分区
create table xxx(id number,deal_time date,area_code number)
partition by list(area_code)
(
partition p51 values(51),
partition p52 values(52),
..................
partition p59 values(59),
partition p_other values(default)
);
分区表的原理
将一个大的对象分成了多个小对象
分区表作用
1:分区消除,将大对象划分为更小的对象
2:分区truncate更快捷
很多历史表、日志表都被设计为分区表,正是由于这个特性使得清理数据极其方便
3: 分区数据转移备份
可以将分区表的某个分区数据通过分区交换的方式交换出来备份
普通表和分区表的字段必须完全一样
将分区表t_range的p8分区的数据备份到普通表t_normal中
alter table t_range exchange partition p8 with table t_normal
然后可以看到p8分区的数据不见了,直接跑到t_normal表里了
4:分区切割(split)
5: 分区合并
分区索引
1:全局索引
可以理解为普通索引,整个分区的一个大索引
create index idx_range_date on t_range(deal_date);
2:局部索引
其实就是针对各分区所建的索引
create index idx_range_areacode on t_range(area_code) local
select index_name,status from user_indexes where index_name in('IDX_RANGE_DATE','IDX_RANGE_AREACODE')
查询出status状态为N/A的表示局部索引,需要到user_ind_partitions中分析索引状态
select index_name,partition_name,status from user_ind_partitions where index_name='IDX_RANGE_AREACODE'
分区索引失效
1: 一般在对分区表的分区操作时,对局部索引一般都没有影响,但是对全局索引影响比较大,一般都会重建全局索引
alter index idx_range_date rebuild
也可以在执行分区操作时直接加update global indexes参数,如:
alter table t_range truncate partition p2 update global indexes
2:有索引效率更低
很有可能是遍历了整个分区表
3:无法应用分区条件