前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >oracle分区两大陷阱

oracle分区两大陷阱

作者头像
用户5166556
发布2019-11-26 17:35:37
8070
发布2019-11-26 17:35:37
举报

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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异常;无论唯一还是普通索引都要通过重建解决。 解决方法:在使用表分区时尽量创建本地索引.( 例如:

代码语言:javascript
复制
create index AUDITS_PK on AUDITS(id) local;

因为id是分区键,所以这样就创建了一个有前缀的本地索引) 这样在删除分区后则索引不会出现失效问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生技术爱好者社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档