有一个分区表,按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;