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;
当单个分区数量在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;
相关文章推荐
- Oracle将已有数据的表改为分区表【创建表分区、索引分区】
- oracle 测试 清除分区数据,索引释放空间
- oracle 分区拆分 不能插入数据 01502 索引失效
- Oracle 计算.索引数据大小,表数据大小,以及表分区中某个分区的数据大小
- 创建空间数据分区表及分区索引步骤(oracle 10g 且关键字非字符型)
- Oracle创建数据表空间,用户,授权,表,索引,簇
- oracle表分区:更改分区键值列的数据,导致ORA-14402错误
- [Oracle PL/SQL]当数据表设计成具有父ID的时候,当需要选择所有与父ID同根生的所有节点的时候,使用的SQL语句
- 为什么有时Oracle 数据库不用索引来查找数据?
- Oracle数据表分区的策略
- 【转】深入学习Oracle分区表及分区索引
- Oracle 数据表分区的策略
- Oracle表分区和索引分区汇总
- oracle10G分区的创建与维护Oracle分区表和本地索引
- [请教]SQL2005复制功能同步Oracle数据后,索引丢失?
- oracle存储结构: 表空间/数据文件/段/分区/块
- ORACLE中大数据量下索引效率的测试与分析(一)
- [Oracle PL/SQL]当数据表设计成具有父ID的时候,当需要选择所有与父ID同根生的所有节点的时候,使用的SQL语句
- Oracle 分区索引详解
- ORACLE移动数据文件到新的分区全过程