PawSQL最新版本针对DML和DQL新增了审核和重写优化规则共计33个,整体的规则数目达到了83个,覆盖了正确性,安全性、可维护性、性能四个方面的SQL质量问题,并提供了优化建议,已经形成比较完善的针对数据操作的SQL质量审查体系。本文介绍其中新增的5可维护性规则以及2个安全性规则。
可维护性规则
1. 在一个查询块中,多表应该使用别名
规则描述
如果在一个查询块存在多个表的引用,建议为每个表起一个简单易认的别名,并为所有的字段添加别名前缀,方便阅读代码以及后续维护。
默认预警级别
- 提示
触发条件
- 一个查询块中存在多个表引用
2. 避免表引用使用重复的别名
规则描述
查询语句中存在别名相同的表引用/子查询,或者是表的别名和其他表名本身相同,会导致代码可读性急剧恶化,且不利于后续维护。
默认预警级别
- 警告
触发条件
- 存在别名相同的表引用/子查询
- 或表的别名和其他表名本身相同
3. 建议使用'<>'代替'!='
规则描述
'!=' 是非标准的运算符,'<>' 才是SQL中标准的不等于运算符。为了提升SQL的可移植性和规范程度,建议使用'<>'代替'!='。
默认预警级别
- 警告
预警触发条件
- SQL语句中出现'!=' 运算符
4. 对于入参建议使用变量绑定
规则描述
通过变量绑定,可以重用SQL的执行计划,降低SQL解析的时间;同时还可以避免SQL注入,提升应用的安全性。
默认预警级别
- 警告
预警触发条件
- 当用户设定'strict'模式时,在条件及排序的字段中出现任意常量
- 当用户设定'loose'模式时,在条件及排序的字段中不存在变量绑定
5. SQL长度超过阈值
规则描述
过长的SQL可读性较差,难以维护,且容易引发性能问题;如果SQL的长度超过用户指定的阈值,则触发该规则。具体规则阈值可以根据业务需求调整,默认值:1024。
默认预警级别
- 提升
预警触发条件
- SQL文本长度超过阈值
5. 禁止使用常见 SQL 注入函数
规则描述
SQL注入是一种常见的网络攻击技术,它利用不安全的输入验证和构造SQL查询来获取未授权的信息或是数据库注入恶意代码。常见的SQL注入函数包括database(); user(); version(); sleep()等。
默认预警级别
- 禁止
触发条件
- SQL中存在用户配置的函数名
7. NPE重写
规则描述
SQL的NPE(Null Pointer Exception)问题是指在SQL查询中,当聚合列全为NULL时,SUM、AVG等聚合函数会返回NULL,这可能会导致后续的程序出现空指针异常。譬如对于下面的SQL:
代码语言:javascript复制select sum(t.b) from (values row(1,null)) as t(a,b);
可以使用如下方式避免NPE问题:
代码语言:javascript复制SELECT IFNULL(SUM(t.b), 0) from (values row(1,null)) as t(a,b);
这会返回0而不是NULL,避免了空指针异常。
Oracle:NVL(); SQL Server和MS Access:ISNULL(); MySQL:IFNULL()或COALESCE();
默认预警级别
- 警告
触发条件
- SUM或AVG聚集函数
- 聚集函数的参数可能全为NULL, 包括
- 参数是列,列定义可以为空
- 参数是表达式,表达式可以为空
- 列定义不可为空,但是是外连接的内表,结果可能为空
关于PawSQL
PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL优化产品包括
- PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员,
- PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。
- PawSQL Engine, 是PawSQL系列产品的后端优化引擎,可以以docker镜像的方式独立安装部署,并通过http/json的接口提供SQL优化服务。
- PawSQL Ora2pg/PawsQL Ora2op,Oracle语法的SQL应用转换为PostgreSQL和openGauss语法的工具。