前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并行创建主键的问题延伸

并行创建主键的问题延伸

作者头像
bisal
发布2019-04-19 11:40:42
5140
发布2019-04-19 11:40:42
举报

这是杂货铺的第452篇文章

《使用并行创建主键约束的“奇葩”过程》这篇文章发到技术讨论群,得到了很多朋友的建议和反馈,更深层次地对问题进行了理解。

老师和朋友的发言摘要。

主键,不只是一个唯一索引,还是一个约束,我被它坑过:一个大表只能通过imp串行导入,我用了indexes=N,但是最后一步还是花了很长很长的时间在建主键索引。实在等不下去了,中止后通过并行创建的主键,很快就完成了。如果要避免这种情况,imp还要加constraints=N。还有,并行创建完索引后,最好是再把并行度属性改成1,不然以后遇到这个索引的fast full scan,就会自动使用并行。并行创建索引,然后alter table增加主键。

可以使用constraints=y,imp一次结构。

那天晚上数据从堆表迁移到分区表后,发现那些数据落到的分区上查询统计信息竟然都是空,因为数据量大,后来就对其中一个分区表收集了统计信息,因为担心影响第二天的业务,参照这个分区表的统计信息然后按照其他分区数量的大小将这个分区表的统计信息拷贝到了其他几个有数据的分区表上。

在测试环境上测试alter table ... add primary key(ID) using index PK_A novalidate;,加了novalidate,这命令是秒级完成,如果不加这个,需要很长时间才执行完。

刘老师特意做了一下实验,刚刚对novalidate分析了一下,并验证了一下。不加novalidate,还要对原表做一次全表扫描。这是因为oracle不知道你用的这个unique index里面是不是还有null值,这只能通过全表扫描来完成。而且这个全表扫描还不是direct path read,而是scattered read,即使表上设置了并行也不能并行,所以,这个novalidate很重要。其实主键的两步操作相当于还是多做了一次全表扫描,但是还是比串行创建快。

这种场景基本就是之前有重复数据,但业务觉得后续不能再这样搞了

正常大表建PK也推荐这种,先并行建unique index,再add constraint使用novalidate选项,效率最高。

确实有些知识,如果没用过,就会可能忽略他们的功能,和潜在的坑,从老师和朋友们的反馈中,能学到很多,积累起来,在碰见各种场景的时候,就能有所取舍,找到合适的方案。

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

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

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

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

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