您的位置:首页 > 数据库 > Oracle

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

2017-03-20 15:02 369 查看
有一个分区表,按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;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: