前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个索引创建引出的思考

一个索引创建引出的思考

作者头像
bisal
发布2019-09-25 10:05:12
4240
发布2019-09-25 10:05:12
举报

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://cloud.tencent.com/developer/article/1512711

前两天上线,碰见了些问题,还是很值得探讨。

问题1

一张3000万记录的单表中,创建了唯一约束,(A,B,C),其中A的重复值非常多,B的重复值很少,接近于主键效果,但是某个逻辑,用到的是B作为检索条件,而且在开发测试阶段,因为数据量有限,未识别出这个字段需要创建索引,只在实际量级的生产系统下,才会暴露问题。但是,(A,B,C)自带的唯一约束索引,是无法使用的,因为业务不能停,为了避免造成问题数据,所以不能改这个唯一约束。只可以选择再创建个索引,即B的单键值索引。

这个问题暴露的,其实就是在索引创建的选择上,应该多考虑一些不同场景的使用,(A,B,C)和B这两个不同的使用场景,如果提前知道,并且对索引的基本原理有些了解,应该知道(B,A,C)是正确的创建路径,一方面这两个场景的索引使用要求,另一方面降低了存储两个索引的成本消耗。

但往往这种案例,非常常见,如何能从根本解决此类问题?我觉得可能有这几种方式:

  1. 提高开发人员对数据库的了解,尤其是这种和开发直接相关的使用场景。
  2. 提高DBA在此类问题的审核力度。

方法1其实是王道,开发了解业务,同时对数据库的基本原理了解,自然能更容易地识别这类问题,授人以鱼不如授人以渔。方法2是被动的,毕竟DBA或者专业的数据库人员,对数据库了解,但对业务不了解,除非开发告诉他,我有这两种用法,当然有其他方式,或许能找到这类问题,但是消耗不小,投入产出比不高。方法3是技术手段的辅助,例如在非生产环境下,通过工具,即使数据量小,我也能通过执行计划等信息,找出此类问题,结合方法2,对这种问题进行预警提示,一定程度上,还是能接受的。

问题2

因为正常业务在频繁地做增删改操作,所以不能直接创建索引,他会阻塞DML,需要采用online方式,但是问题来了,在PLSQL Developer中,执行如下语句,等了将近30分钟,还未完成,

代码语言:javascript
复制
create index idx_t_01 on t(id) online;

当然这个语句,存在一定的问题,就是没用parallel,没用充分利用数据库服务器的多CPU,一定程度上,影响执行效率,毕竟创建索引,无论在线,还是非在线,尤其对大表,还是很消耗资源,所以正确做法,应该是加上parallel,当然要结合当前数据库的CPU个数以及idle,来确定parallel并行度,

代码语言:javascript
复制
create index idx_t_01 on t(id) online parallel 16;

另外,如果要中断当前创建索引的过程,可能会出现未回收的索引段,导致不能重新创建索引,解决方案是,

  1. 可以尝试利用如下SQL捕获异常的Index Object_id,
代码语言:javascript
复制
select i.obj#, i.flags, u.name, o.name, o.type#
from sys.obj$ o, sys.user$ u, sys.ind_online$ i
where (bitand(i.flags, 256) = 256 or bitand(i.flags, 512) = 512)
and (not ((i.type# = 9) and bitand(i.flags, 8) = 8))
and o.obj# = i.obj#
and o.owner# = u.user#; 
  1. 将异常的object_id带入如下存储过程手工清理,
代码语言:javascript
复制
declare
isclean boolean;
begin
isclean := false;
while isclean = false loop
isclean := DBMS_REPAIR.ONLINE_INDEX_CLEAN(对应OBJECT_ID, dbms_repair.lock_wait);
dbms_lock.sleep(10);
end loop;
end;
/

关于在线online和非online创建索引的方式,各自背后执行的路径、优缺点、成本消耗,以及中断索引创建的案例等,可以参考,如下文章,

《》

读到此处的朋友,如果对上面这两个问题,你有自己的见解,欢迎一起讨论。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年09月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档