最近在做数据库优化时发现有很多重复执行的SQL。出现这种情况可能是由于在程序中存在着代码大小写不规范,变量值不是绑定(在JDBC中使用“?”传参)而是直接传入的值。Oracle通过对相似并且共享相同 SQL 文本的 SQL 语句进行语法分析, 应用程序会导致数据库占用过多的 CPU。这些应用程序也会在数据库中争用库高速缓存或共享池, 从而导致性能降低。
分析告警平台数据库的重复SQL发现,重复的原因是由于变量值直接传入引起的。
跟踪iBATIS输出的语句
UPDATE $tableTempName$
SET SENDFLAG = 'N',FLICKER ='N'
WHERE ID = #alarmId#
AND SPECIALITY = #speciality#
发现编译后的代码是
UPDATE alarm_power_temp
SET SENDFLAG = 'N',FLICKER ='N'
WHERE ID = :1
AND SPECIALITY = :2
发现在iBATIS中,使用“$”符号引入参数时,是先将变量值替换,组成SQL语句,而“#”符号引入参数时,是按照绑定参数方式传递。分析重复的语句,发现都是由于使用“$”符号引起的。
大家在使用的时候一定要注意这种区别,在条件中传值的时候必须用“#”,在语句中变化的部分可以用“$”(是否可以用“#”没有测试)。