暂无图片
浅谈ITL事务槽-创建智能索引
我来答
分享
💭
2019-09-27
浅谈ITL事务槽-创建智能索引

第一次在墨天轮提问^_^

以下是墨天轮文章:

《频发:浅谈ITL事务槽》中最后给出的解决方式:

索引事务槽的根本原因是并发量过高,导致的索引块的ITL不够用,数据库层面我们需要做的就是打散数据,可以考虑以下几种处理方式:

· 对于ITL事务槽等待,通常的方法是增大initrans,但是该参数的修改只针对新块生效,建议修改后重建索引

· 创建反转索引,反转索引对于单向增长字段效果非常好。缺点是索引会越来越大,可能到最后buffer cache都放不下,访问该索引的时候将会产生大量的IO;而且反向索引无法实现范围查询

· 创建为global hash索引,优点是数据可以进一步打散,缺点是对表进行DDL操作可能会导致索引经常失效

· 智能建索引,一般智能主键的组成是:实例ID-进程号取余-序列号,后面跟上索引字段,这种方式创建的索引可以非常好的打散数据,在不影响性能的情况下实现业务需求

问题:

其中,其他几种是不推荐的做法;只有最后的智能索引是这最优方式,但是有些疑问:

实例ID-进程号取余-序列号,这个取余具体如何操作呢,

在单实例环境中是否还有必要加实例ID部分,

可否举例说明呢



我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
章芋文

序列号跟时间一样都是连续的,所以为了打散数据,可以在序列号前加一些随机内容,不一定是实例ID-进程号取余,比如random一个随机数等等。

单实例就不需要实例ID了,进程号取余(也就是取进程号前几位或者补齐)是为了尽量保证数字的位数。

比如:

实例1上的进程23876,序列的next value为1991,那么这个字段的值为123871991

实例2上的进程88,序列的next value为1992,那么这个字段的值为200881992

原来1991和1992是连续的,而变成123871991和200881992就相差很远了,不会在同一个数据块,也就没有索引分裂和ITL争用问题了。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏