加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle数据量大时候分区索引思路

发布时间:2020-12-12 15:10:42 所属栏目:百科 来源:网络整理
导读:有一个分区表,按list分区,只有一个本地唯一索引,没有外键和触发器 当单个分区数量在2000万以内时,insert效率还可以,每秒2.3-2.5万条 但数据量越大,速度越慢, 目前单个分区数量达到3亿,占用磁盘空间28G,索引占用13G,insert每秒才2000条 做过的尝试

有一个分区表,按list分区,只有一个本地唯一索引,没有外键和触发器
当单个分区数量在2000万以内时,insert效率还可以,每秒2.3-2.5万条
但数据量越大,速度越慢,
目前单个分区数量达到3亿,占用磁盘空间28G,索引占用13G,insert每秒才2000条
做过的尝试:
1、已经将表和索引设置成nologging
2、试过append,没有明显改善

分析应该是维护索引导致的性能问题,有什么方法可以改善?


建议如下:
1.采取批量提交比如2000-5000 行提交一次
2.如果数据都是插入到单个分区的话,可以把该分区上的索引先disable 然后再插入 完成后rebuild 该分区上的索引
alter index ind_t100 unusable;
alter index IND_T100 rebuild;
3.如果日志文件切换很平凡的话,建议增大日志文件大小


很明显是维护索引消耗
alter index xxx unusable;
最后再重建这个索引

有人反映,
唯一索引,UNUSABLE后不能insert
----------------------------------------------------------------61万数据进行测试

失效索引后重建:
alter index ACT_IDX_HI_PROCVAR_TASK_ID unusable;
alter index ACT_HI_VARINSTWITHIDX_INDEX1 unusable;
alter index ACT_IDX_HI_PROCVAR_NAME_TYPE unusable;
alter index ACT_IDX_HI_PROCVAR_PROC_INST unusable;
insert into act_hi_varinstspan select * from act_hi_varinst;
alter index ACT_IDX_HI_PROCVAR_TASK_ID rebuild;
alter index ACT_HI_VARINSTWITHIDX_INDEX1 rebuild;
alter index ACT_IDX_HI_PROCVAR_NAME_TYPE rebuild;
alter index ACT_IDX_HI_PROCVAR_PROC_INST rebuild;

插入612,627 行数据耗费30.7秒
重建耗费10秒

不分区:
无索引
612,627 行已插入。
16.518秒
带索引
612,627 行已插入。
127.492秒

分区: 非索引 612,627 行已插入。 16.518秒 带索引 612,627 行已插入。 108.081秒 ---------------------------------------------------------------相关实验及语句 ---按日期进行分区 select table_name,partition_name from user_tab_partitions where table_name='ACT_HI_VARINSTSPAN'; create table ACT_HI_VARINSTSPAN ( id_ NVARCHAR2(64) not null,proc_inst_id_ NVARCHAR2(64),execution_id_ NVARCHAR2(64),task_id_ NVARCHAR2(64),name_ NVARCHAR2(255) not null,var_type_ NVARCHAR2(100),rev_ INTEGER,bytearray_id_ NVARCHAR2(64),double_ NUMBER(*,10),long_ NUMBER(19),text_ NVARCHAR2(2000),text2_ NVARCHAR2(2000),create_time_ TIMESTAMP(6),last_updated_time_ TIMESTAMP(6) ) partition by range(create_time_) interval (numtodsinterval(1,'day')) ( partition create_time_ values less than (to_date('2016-01-01','yyyy-mm-dd')) ); -- 查看分区表 SELECT * FROM USER_PART_TABLES; -- 查看表分区 select table_name,partition_name from user_tab_partitions where table_name='ACT_HI_VARINSTSPAN'; -- 为分区进行建立索引 CREATE INDEX ACT_HI_VARINSTSPAN_INDEXSPAN1 ON ACT_HI_VARINSTSPAN(ID_) LOCAL; -- 查看分区进行建立索引 select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name='ACT_HI_VARINSTSPAN_INDEXSPAN1'; -- 查看分区进行建立索引 SELECT * FROM USER_PART_INDEXES --重建分区索引 alter index ACT_HI_VARINSTSPAN_INDEXSPAN1 rebuild partition SYS_P718;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读