概述
PawSQL Advisor是由PawSQL团队开发的,面向数据库应用开发人员的自动化、智能化SQL优化工具, 它融合了业界关于数据库优化的最佳实践, 从正确性和性能两个方面对SQL进行审查和重写优化;并基于SQL查询的结构、数据库对象的定义及统计信息,提供智能索引推荐功能,帮助数据应用开发人员一键提升应用性能。
核心功能
- 基于规则的SQL审查,包括正确性审查和性能优化审查规则。
- 基于规则的重写优化,推荐语义等价、但执行效率更高的SQL。
- 智能索引推荐,满足各种SQL语法组合的场景下,推荐最优的索引组合。
- 基于代价的优化验证,确保基于SQL重写和索引推荐的新方案有着更好的性能。
- 索引分析引擎,对已有的索引进行分析,识别冗余索引。
支持数据库
PawSQL基于自研的SQL解析器,支持多种数据库类型以及SQL方言,当前支持的数据库列表如下,还在不断增加中...
- MySQL 5.6及以上 (official)
- PostgreSQL 9.1及以上 (official)
- openGauss 1.0及以上 (official)
- MariaDB 5.6及以上(β测试)
- Oracle 9i及以上(β测试)
- KingbaseES V8(β测试)
使用手册
1、插件安装
PawSQL Advisor是基于IntelliJ的IDE插件,支持的Jetbrain工具包括IntelliJ IDEA,DataGrip,PyCharm,Android Studio, AppCode, DataSpell, GoLand, PhpStorm, WebStorm等, 可以通过Jetbrain应用市场安装。
2、配置页面
PawSQL Advisor提供一个项目级的配置页面,供用户进行优化任务输入、输出、数据源以及执行过程的参数配置。
(1)优化配置
- 输入类型,指定输入待分析SQL的类型,目前支持以下两种格式,
- SQL 文件,代表待优化的SQL来自原生SQL文件, 支持ANSI标准的SQL语法及多种SQL方言,多个SQL之间通过
;
分割。 - Mapper 文件,从Mybatis的mapper配置文件里提取SQL, 并通过解析获取所有可能的SQL组合。然后对mapper文件中的占位符根据其上下文推断其数据类型并对其赋于一个合法的常量,从而使其能够生产合法的SQL语句,以便进行后续的查询语句结构分析。
注意:Mapper文件作为输入对于应用开发人员非常重要,因为在应用开发初期,开发人员对于前端的输入组合无法完全掌握,所能组合的SQL业务无法确定,此选项可以确保对于所有的组合,都能够合适的索引推荐出来以提升性能。但是由于Mapper配置文件可能书写不够规范,导致组合出的某些SQL语句在真实的场景下永远不会出现,进而推荐出无用的索引。
- 结果展示,用来设定输出的SQL优化建议的语言,目前支持中文及英文两种。
- 是否启用重写优化,此选项控制是否启用重写优化,在SQL以及上线的情况下,修改SQL可能无法立即实施,在此情况下,可以禁用此选项,来获取索引推荐的建议,快速进行性能优化。
- 是否启用What-If性能验证,此选项控制是否对推荐的优化建议进行性能验证,如果启用此选项,PawSQL在优化详情中会提供SQL优化前后的执行计划及代价信息,从而确保推荐的优化建议(重写优化及索引推荐)能够真实提升数据库性能。
- 性能验证时是否执行SQL,如果启用此选项,则在进行What-If性能验证时获取SQL的真实解析及执行时间,避免了MySQL对中间结果表explain的缺陷,代价估算更加精确。
注意:最后两个性能验证的选项应避免在生产库上使用,因为对于没有内置what-if(内置虚拟索引)的数据库(MySQL/Postgres皆是)来说,性能验证是通过创建推荐索引并进行explain分析执行计划,然后删除推荐索引的方式来做的。这个过程在生产库上会消耗一定的资源,且执行时间可能会比较长,可能对生产库上的业务运行产生影响。
(2)数据库配置
在PawSQL Advisor中,数据库连接信息作用有两个:一用来获取SQL对应的数据库对象,包括数据库表、视图、列、索引信息。二是用来对优化建议进行What-If性能验证,以确保优化建议能够提升SQL的查询性能。
- 数据库类型,指定连接的数据库类型,目前支持MySQL,PostgreSQL,Opengauss, Oracle, MariaDB, KingbaseES六种数据库.
- 地址,数据库地址。
- 端口,数据库端口。
- 用户,数据库用户。
- 密码,数据库用户密码。
- 默认数据库,默认数据库名称,链接默认的数据库名称。
- 数据库或是模式列表,数据库列表(MySQL)或是模式列表(PostgreSQL/Opengauss),PawSQL会将列表项下的表、视图、索引及其对应的统计信息作为SQL性能优化的输入。
(3)索引推荐配置
- 是否和现有索引去重,此选项表示推荐索引时,是否考虑现有索引,并把现有索引能够覆盖的推荐索引排除掉。启用此选项的场景是不考虑删除现有的索引,因为输入的SQL只是并不能代表这个数据库上所有的SQL场景,所以只考虑新增对输入SQL有帮助的索引。如果能够确保输入的SQL包含此数据库所有的查询,那么只保留推荐的索引就可以了,这种情况下可以不选择此选项,并且使用新推荐的索引代替现有的索引。
- 是否推荐覆盖索引,此选项表示推荐索引时是否考虑覆盖索引策略。覆盖索引可以让查询只访问索引而不需要访问数据表(请参考《高效索引的准则》),在一些场景下,覆盖索引能够大幅提示查询性能。但是覆盖索引会包含查询条件中没有使用的列,从而增加索引所占的磁盘空间大小。
- 覆盖索引的最大列数,此项设置表示在进行覆盖索引推荐时,索引的最大列数限制。如以上所述,覆盖索引会包含查询条件中没有使用的列,从而增加索引所占的磁盘空间大小。此选项可以控制覆盖索引所占空间的大小,让PawSQL能够为用户提供一定空间限制的情况下利用覆盖索引的非回表特性。
- 索引的最大列数,此选项限制索引的最大列数,索引会占用一定的磁盘空间,且太多列的索引会让索引树的层级加深,从而增加索引访问的代价。用户可以通过此项设置控制索引的最大列数。
- 单表最大索引数目,如《高效索引的准则》中所述,索引不是免费的午餐,它会占用磁盘空间,并对对DML操作产生负面影响,因为对于数据库管理器写入表的每一行,它还必须更新任何受影响的索引。因此,PawSQL通过此选项来审查单表的索引数量,并进行警告提示。
3、执行优化
(1)对文件/文件夹中的SQL进行优化
右键点击需要进行分析的SQL文件或是文件夹,点击PawSQL Advisor->Optimize,启动对此文件或是文件夹中的所有SQL语句的优化。
您也可以点击PawSQL Advisor->Optimize Config...,此按钮将调出参数配置页面,方便您在执行前对执行参数进行配置,并立即进行优化执行。
(2)对选中的SQL文本进行优化
在IDE的文本/代码编辑器中选中待优化的SQL,点击右键,点击PawSQL Advisor->Optimize Selected.
同样的,您也可以点击PawSQL Advisor->Optimize Selected Config...,此按钮将调出参数配置页面,方便您在执行前对执行参数进行配置,并立即进行优化执行。
(3)优化过程日志
查询优化的执行过程可以通过下方的日志终端查看。
4、执行结果解读
当优化完成后,PawSQL会生成一个优化汇总信息文件,并自动打开该文件。此文件是以pawTunningSummary结尾的markdown文件,建议您安装Markdown插件(在应用市场搜索"Markdown"进行安装),以便能够通过超链接查看单SQL的优化详情。
(1)整体优化建议
查看pawTuningSummary文件获取优化的整体信息,主要包括三部分。
- 整体优化概要
- 推荐索引信息
- SQL优化列表
4.2 单SQL优化详情
点击整体优化建议pawTunningSummary中的SQL优化列表中具体的SQL名称,可以进入到单SQL的优化详情文件。此文件中的内容主要包括:
- 原始SQL
- 重写优化
- 重写后的SQL
- 重写所应用的优化策略,
- 重写优化对应的SQL片段
规则审查情况:
- 违反的审查规则
- 违反规则的SQL片段
索引推荐情况:
- 推荐的索引
- 索引推荐的依据
索引分析:
- 各个表上的索引列表
- 索引如何帮助此SQL执行
- 冗余索引分析
- 单表索引个数超过阈值提示
性能验证:
- 性能提升比
- 验证生效的推荐索引
- 优化之前的执行计划
- 优化之后的执行计划
关于PawSQL
PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL优化产品包括
- PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员。
- PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。
- PawSQL Engine, 是PawSQL系列产品的后端优化引擎,可以独立安装部署,并通过http/json的接口提供SQL优化服务。PawSQL Engine以docker镜像的方式提供部署安装。