求助:OLTP系统,一个大数据量、复杂业务表的分区与索引难题

[复制链接]
查看11 | 回复9 | 2012-7-12 18:47:29 | 显示全部楼层 |阅读模式
本帖最后由 todsong 于 2012-9-26 02:07 编辑
一个OLTP系统中,有这么一张xxx表
create table xxx
(
id varchar2(20) primary key,
name varchar2(50),
type varchar2(15),
code varchar2(50),
time date,
status varchar2(2)
其他字段...
);
表里有3亿数据量,峰值每秒1000次insert,1000次select
insert时提供name、type、code、time的内容,主键id是系统生成的UUID;
select条件可为单独time,name+time组合,type+time组合,tpye+code组合,各占三分之一。也有其他5个字段会单独统计查询,量比较少。
没有delete和update
name有少量重复,大部分都唯一,但要保证全局name和status联合全局唯一,status有几十种值;
type、code重复较多,各有大约1000多种值;
time平均分布
运行环境是RAC集群,节点可以多个,存储只有一套
查询大约允许1分钟内的数据不一致
疑问:
1.怎么做分区呢?很难想出一个完美的分区方案
2.如何建索引?因为RAC,索引过多的话,导致插入时集群等待时间很长
3.有没有必要做读写分离?只有一套存储设备。如果用物化视图,每秒1000次的insert会不会导致更新物化视图太慢?


回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
范围分区+HASH分区+压缩,按其他5个字段的情况,建MV,也就是,当使用其他5个字段时,查MV。
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
本帖最后由 xb0307052 于 2012-9-26 09:32 编辑
1、修改表结构,增加inst_id字段,按实例分区插入。减少insert时索引热块.存储过程中添加:
Select sys_context(‘USERENV’,’INSTANCE’)into v_inst FROM DUAL;
2、采用分区和子分区,分区粒度按‘天’分区
partition by range (time)
subpartition by list (inst_id)
3、local索引+复合索引(time+其它查询字段)
4、数据定期归档,exchange方式交换。保证数据量在一定的数据级别就不需要读写分离了。
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
1 time 为Insert 时的sysdate 吗?
2 select条件可为单独time,name+time组合,type+time组合,tpye+code组合, 各占三分之一。
这是4种组合啊?time 是 =查询还是 > 查询 还是 between 查询?
RAC 在OLTP 下面索引热点块从容易出现问题的是1基于sequence 的 pk,2 基于sysdate的time。 情况1 你已经不存在了, 情况2 关键看你的time 是什么类型的? time 是否必须放在index 的leading column. 是的话, 就必须采取3# 的建议了。
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
xb0307052 发表于 2012-9-26 09:02
1、修改表结构,增加inst_id字段,按实例分区插入。减少insert时索引快热.存储过程中添加:
Select sys ...

请教,第一条中 添加了字段后如何就减少了索引热块?难道是联合索引,把inst_id放在最前面?
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
ZALBB 发表于 2012-9-26 08:54
范围分区+HASH分区+压缩,按其他5个字段的情况,建MV,也就是,当使用其他5个字段时,查MV。

一个OLTP,压缩目的是啥?多消耗点CPU?
人家都说了time平均分布,HASH分区为了啥?
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
xb0307052 发表于 2012-9-26 09:02
1、修改表结构,增加inst_id字段,按实例分区插入。减少insert时索引热块.存储过程中添加:
Select sys ...

1、修改表结构,增加inst_id字段,按实例分区插入。减少insert时索引热块.存储过程中添加:
Select sys_context(‘USERENV’,’INSTANCE’)into v_inst FROM DUAL;
目的是啥?就为了区分不同实例?
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
不知道lZ的具体业务,听上去TIME是个很好的范围分区列。
至于读写分离,而去创建MV,那MV的采用全部刷新?还是快速刷新?不管是那种方式,都是死路。为啥不考虑加个备用数据库?
至于索引,time组合的全部LOCAL,tpye+code可以考虑创建全局,但还是要评估下插入和该查询的得失。

回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
outdo 发表于 2012-9-26 10:32
一个OLTP,压缩目的是啥?多消耗点CPU?
人家都说了time平均分布,HASH分区为了啥?

没有D、U,也就是,数据库插入后只用来读,压缩可省查询时间,
TIME 用来作范围分区,剩下的用HASH打散,避免热块读。
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
ZALBB 发表于 2012-9-26 10:37
没有D、U,也就是,数据库插入后只用来读,压缩可省查询时间,
TIME 用来作范围分区,剩下的用HASH打散, ...

我猜你也是因为没有DU,但做为一个大表,基本上不会考虑全部扫描或者分区扫描。如果是压缩索引,那插入就。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行