2. 执行配置
PawSQL Advisor提供一个项目级的配置页面,供用户进行优化任务输入、输出、数据源以及执行过程的参数配置,
2.1 优化配置
-
输入类型,指定输入待分析SQL的类型,目前支持以下两种格式,
-
SQL 文件,代表待优化的SQL来自原生SQL文件, 支持ANSI标准的SQL语法及多种SQL方言,多个SQL之间通过
;
分割。 -
Mapper 文件,从Mybatis的mapper配置文件里提取SQL, 并通过解析获取所有可能的SQL组合。PawSQL Advisor通过一个智能的引擎,能够对mapper文件中的占位符根据其上下文推断其数据类型并对其赋于一个合法的常量,从而使其能够生产合法的SQL语句,以便进行后续的查询语句结构分析。
Mapper文件作为输入对于应用开发人员非常重要,因为在应用开发初期,开发人员对于前端的输入组合无法完全掌握,所能组合的SQL业务无法确定,此选项可以确保对于所有的组合,都能够合适的索引推荐出来以提升性能。
注意:由于Mapper配置文件可能书写不够规范,导致组合出的某些SQL语句在真实的场景下永远不会出现,进而推荐出无用的索引。所以建议在程序上线后,或是在UAT测试阶段,通过querylog抓取真实的SQL作为输入.
-
-
结果展示,用来设定输出的SQL优化建议的语言,目前支持中文及英文两种。
-
是否启用重写优化,此选项控制是否启用重写优化,在SQL以及上线的情况下,修改SQL可能无法立即实施,在此情况下,可以禁用此选项,来获取索引推荐的建议,快速进行性能优化。
-
是否启用What-If性能验证,此选项控制是否对推荐的优化建议进行性能验证,如果启用此选项,PawSQL在优化详情中会提供SQL优化前后的执行计划及代价信息,从而确保推荐的优化建议(重写优化及索引推荐)能够真实提升数据库性能。
-
性能验证时是否执行SQL,如果启用此选项,则在进行What-If性能验证时获取SQL的真实解析及执行时间,避免了MySQL对中间结果表explain的缺陷,代价估算更加精确。
**注意:**最后两个性能验证的选项应避免在生产库上使用,因为对于没有内置what-if(内置虚拟索引)的数据库(MySQL/Postgres皆是)来说,性能验证是通过创建推荐索引并进行explain分析执行计划,然后删除推荐索引的方式来做的。这个过程在生产库上会消耗一定的资源,且执行时间可能会比较长,可能对生产库上的业务运行产生影响。
2.2 数据库配置
在PawSQL Advisor中,数据库连接信息作用有两个:一用来获取SQL对应的数据库对象,包括数据库表、视图、列、索引信息。二是用来对优化建议进行What-If性能验证,以确保优化建议能够提升SQL的查询性能。
- 数据库类型,指定连接的数据库类型 ,目前支持MySQL,PostgreSQL,Opengauss, Oracle, MariaDB, KingbaseES六种数据库;
- 地址,数据库地址;
- 端口,数据库端口;
- 用户,数据库用户;
- 密码,数据库用户密码;
- 默认数据库,默认数据库名称,链接默认的数据库名称;
- 数据库或是模式列表,数据库列表(MySQL)或是模式列表(PostgreSQL/Opengauss),PawSQL会将列表项下的表、视图、索引及其对应的统计信息作为SQL性能优化的输入。
3.3 索引推荐配置
- 是否和现有索引去重,此选项表示推荐索引时,是否考虑现有索引,并把现有索引能够覆盖的推荐索引排除掉。启用此选项的场景是不考虑删除现有的索引,因为输入的SQL只是并不能代表这个数据库上所有的SQL场景,所以只考虑新增对输入SQL有帮助的索引。如果能够确保输入的SQL包含此数据库所有的查询,那么只保留推荐的索引就可以了,这种情况下可以不选择此选项,并且使用新推荐的索引代替现有的索引。
- 是否推荐覆盖索引,此选项表示推荐索引时是否考虑覆盖索引策略。覆盖索引可以让查询只访问索引而不需要访问数据表(请参考《高效索引的准则》),在一些场景下,覆盖索引能够大幅提示查询性能。但是覆盖索引会包含查询条件中没有使用的列,从而增加索引所占的磁盘空间大小。
- 覆盖索引的最大列数,此项设置表示在进行覆盖索引推荐时,索引的最大列数限制。如以上所述,覆盖索引会包含查询条件中没有使用的列,从而增加索引所占的磁盘空间大小。此选项可以控制覆盖索引所占空间的大小,让PawSQL能够为用户提供一定空间限制的情况下利用覆盖索引的非回表特性。
- 索引的最大列数,此选项限制索引的最大列数,索引会占用一定的磁盘空间,且太多列的索引会让索引树的层级加深,从而增加索引访问的代价。用户可以通过此项设置控制索引的最大列数。
- **单表最大索引数目,**如《高效索引的准则》中所述,索引不是免费的午餐,它会占用磁盘空间,并对对DML操作产生负面影响,因为对于数据库管理器写入表的每一行,它还必须更新任何受影响的索引。因此,PawSQL通过此选项来审查单表的索引数量,并进行警告提示。