oracle11g分区中的两大陷阱

如何使用Oracle分区功能?

1.个别场景不能从根本上提高查询速度

在Oracle10g时不支持自动生成分区,技术人员都是手动创建一年或者半年的分区或者当超过限制时把数据都load到最大值分区,但是一年半年过后要么出现数据无法插入或者某个分区数据剧增,这个时候出现了Oracle11g的自动分区功能,但是自动分区名称不能人为设置。如果说数据量过大或者出现跨分区查询会出现性能问题。

举个栗子:线上有一个日志储存系统,每天大概存储1000W左右的数据,支持分页排序并且按照日期查询功能(如果不排序,这个数据量对于Oracle是小ks)于是我们采用了分区+覆盖索引(如果想进一步了解.....)查询的的功能,性能稍微提升。但是一段时间后发现还是拖死系统。(因为这就是CAP问题,想从根本上解决问题,请建议公司采用nosql(habase、ELK)实现)。

如果有这样一种这样场景,工资小于等于5000,大于5000并且小于等于12000,大于12000并且小于25000,大于等于25000分别按照这些工资级别创建分区则非常高效,因为可以指定分区进行查询(select * from TBL_OPR_CNT partition(5000_part);),因为指定分区查询,效率直接提升。

由此得知,关系数据库效率高低,在于我们如何发挥它的长处。

2. 手动对表进行move操作,或者删除表分区会导致索引失效

在实际线上环境,常常当发现性能出现问题时,这个时候才采取分区的解决方案,但是分区表一般都是全局索引,然后直接在原表采取分区功能,用了一段时间产生了历史分区数据,然后删除了其中一部分历史分区,发现数据无法插入了。如下错误:

jdbc.exception.UncategorizedSQLException: uncategorized SQLException for SQL [insert into AUDITS(C_ID,N_PERSON_ID,C_NAME,C_CODE,C_DEPT,N_LOG_TIME,C_LOG_TYPE,C_CONTENT,C_RESULT,C_SN,N_DEPT_ID) values(?,?,?,?,?,?,?,?,?,?,?)]; SQL state [72000]; error code [1502]; ORA-01502: index 'AUDITS_PK' or partition of such index is in unusable state
; caused by: ORA-01502: index 'AUDITS_PK' or partition of such index is in unusable state

采取如下方法重建索引解决处理。

select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='AUDITS_PK';

alter session set skip_unusable_indexes=false;

alter index AUDITS_PK rebuild;
commit;

3.其出现这个问题的根本原因和解决方法是什么呢?

移动或者删除表空间或者分区后,基于该table的索引会自动失效UNUSABLE;此时访问或操作该table时,会报ORA-01502异常;无论唯一还是普通索引都要通过重建解决。

解决方法:在使用表分区时尽量创建本地索引.( 例如: create index AUDITS_PK on AUDITS(id) local;--因为id是分区键,所以这样就创建了一个有前缀的本地索引) 这样在删除分区后则索引不会出现失效问题。

转载于:https://my.oschina.net/u/1787735/blog/3051060

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值