索引建议,在PG的原生数据库上,并不提供这个功能,之前介绍过一些通过一些其他的方式来进行 index advisor的使用方式在PG 原生的数据库中使用。下面想阐述的是,其他的不同的POSTGRESQL 的分支或类似产品,在INDEX advisor 上的一些实现,扩充相关的知识,希望POSTGRESQL 原生产品,在未来支持原生的 INDEX ADVISOR 产品。
下面就看看一些其他产品中实现INDEX ADVISOR 的手段和方法
产品1 EDB index advisor
首先EDB 本身支持index advisor 的功能,并且是在 EDB POSTGRESQL 内置的功能,并且支持 WINDOWS 版本的 POSTGRESQL 和 POSTGRESQL 版本的 POSTGRESQL 。
这里EDB 的index advisor 实现是通过 pg_advise_index 的程序来运作通过读取用户输入的SQL 语句产生一个create index 文本文件,这里包含了这个文件中会提供通过工具产生的建议性的索引信息。
这个工具在操作中,使用的是外部的命令,通过加载需要分析的语句,同时将建议添加的索引,写入到 -o 参数后的文件中。
在产生了建议的索引后,可以直接通过执行脚本,将索引建立。
除此以外EDB 的POSTGRESQL 企业版还包含了即时索引建议函数,通过建议的函数,捕捉正在执行的 PID 进程,通过进程中执行的语句得出建议创建的索引。
以上是国外,企业级别的POSTGRESQL 在索引建议和处理方面的提供的功能。
下面是国内的POSTGRESQL 产品,opengauss 提供的索引推荐的工作,opengauss 提供了三种方式的索引提供的模式, 简单语句索引建议, 虚拟索引模拟, 批量模式。
1 简单语句模式
简单语句的模式通过gs_index_advise 函数来针对标定的语句进行操作,如
通过这样的方式给出相关的语句需要建立的索引信息。
2 虚拟索引
虚拟索引的含义在于一些索引是否对语句,有相关的作用,一般来说数据库中只有建立了索引后,才能产出相关的结果,而这样的情况下,会产生索引不正确,但已经建立了索引,还需要在清理在建立的问题,建立索引对于大表也是一个消耗,如何降低消耗,也是需要考虑的问题。所以opengauss提供了一个比较实用的的功能,虚拟索引。
通过虚拟索引来,模拟索引建立后语句执行的情况。这里首先需要针对opengauss 将 enable_hypo_index 开关打开。然后通过语句建立虚拟的索引,在通过explain 命令来执行对应的语句,查看索引是否能产生对应的效果。
同时还可以通过函数来展示,已经创建虚拟索引的列表
3 批量索引推荐
这个方式实际上是单条语句的批量模式,通过log_min_duration_ statement 来收集数据库执行的语句,并通过命令的方式将收集的语句变为索引建议。第一步,分离日志中的SQL 语句。
第二步通过命令对语句进行分析,
最终产生索引建议。
以上是国内的开源opengauss 在索引建议方面给出的方式。
除了以上的方式以外,还有一种简便,立即可以给出的结果的方式,https://pganalyze.com/index-advisor , 通过index advisor 网页方式来满足索引给出的建议。其中可以在页面中选择 load example 选择你想采用的索引的方式,通过不同的方式来给出索引的建议,操作的模式也很简单,主要是将建表的语句 和执行的语句分别放入不同的操作BOX中,然后进行分析即可给出索引的建议。
最后一个方式是阿里云 POSTGRESQL RDS 提供的 index advisor ,也是这些index advisor唯一一个能找到原理图的 index advisor. 从开发者的结构图中可以看出,原理是在语句重写后在plan 前加入了一个钩子,将信息引入到 advisor 程序中,通过自己的planner 来分析需要添加的索引。其中
find indexable column 是通过执行计划来找出可能添加索引的字段,通过重新分析和组合来产生相关的索引建议。
实际我们在操作的过程中,操作的方式还是比较简便的。后续可以针对操作单独写一期相关的部分。下面仅仅简单的对操作进行描述。
阿里云的POSTGRESQL RDS 的 index advisor 是在最近推出的一个功能,其中实现的方式主要有两种
1 通过在阿里云的 POSTGRESQL RDS 中 shared_preload_libraries 中加载 index_advisor 模块
2 通过在session 中动态的加载 index advisor 功能对当前线程中,或正在运行的语句进行分析。
下面简单介绍第二种方式
进入到阿里云的POSTGRESQL RDS 中,目前在POSTGRESQL 13 的RDS 版本中使用过。 通过psql 登陆到 RDS 中,直接运行 load 'index_advisor';
此时系统会在这个SESSION 中自动加载 index advisor 功能,此时直接运行需要进行索引建议的语句,通过explain 的方式。然后直接访问 index_advisory 表,则表中会标注最近你执行的语句建议的索引位置如 attrs,这里红色标记的位置指定的是表中需要添加索引的字段顺序和位置,以及相关索引的大小等。如果是复杂的语句,就需要自己编写一个语句将这个里面的建议变成可以读取的信息。
思路是通过backend_pid + 行顺序 + 表实体的OBJECT 字段转换,最终可以变成一个需要添加的索引的建议。
第二种场景也很简单,直接加载index advisor 然后通过pg_stat_activity 发现执行慢的语句的 PID 然后直接将pid 放入到函数 show_index_advisory中,然后函数就可以给出建立索引的语句了,如果直接写null则会推荐整体目前正在运行的索引语句,需要建立的索引(建议不要这样做,对系统性能有损耗,或容易出现其他问题)
以上就是4 种推荐POSTGRESQL index advisor 的方法,之前也写过普通的POSTGRESQL 如何进行索引推荐的方法,
1 通过插件的方式
2 通过人工分析的方法