PawSQL最新版本针对DML和DQL新增了审核和重写优化规则共计33个,整体的规则数目达到了83个,覆盖了正确性,安全性、可维护性、性能四个方面的SQL质量问题,并提供了优化建议,已经形成比较完善的针对数据操作的SQL质量审查体系。本文介绍其中新增的5可维护性规则以及2个安全性规则。
如果在一个查询块存在多个表的引用,建议为每个表起一个简单易认的别名,并为所有的字段添加别名前缀,方便阅读代码以及后续维护。
查询语句中存在别名相同的表引用/子查询,或者是表的别名和其他表名本身相同,会导致代码可读性急剧恶化,且不利于后续维护。
'!=' 是非标准的运算符,'<>' 才是SQL中标准的不等于运算符。为了提升SQL的可移植性和规范程度,建议使用'<>'代替'!='。
通过变量绑定,可以重用SQL的执行计划,降低SQL解析的时间;同时还可以避免SQL注入,提升应用的安全性。
过长的SQL可读性较差,难以维护,且容易引发性能问题;如果SQL的长度超过用户指定的阈值,则触发该规则。具体规则阈值可以根据业务需求调整,默认值:1024。
SQL注入是一种常见的网络攻击技术,它利用不安全的输入验证和构造SQL查询来获取未授权的信息或是数据库注入恶意代码。常见的SQL注入函数包括database(); user(); version(); sleep()等。
SQL的NPE(Null Pointer Exception)问题是指在SQL查询中,当聚合列全为NULL时,SUM、AVG等聚合函数会返回NULL,这可能会导致后续的程序出现空指针异常。譬如对于下面的SQL:
select sum(t.b) from (values row(1,null)) as t(a,b);
可以使用如下方式避免NPE问题:
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();
PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL优化产品包括