1,表和字段要有注释,这样方便后期的维护。
2,组合索引要把选择性好的列(重复值少的列)放在第一位,而且要在where后面要使用前导列(第一列),否则索引不会被使用;
3,把<>操作改成 > or < 操作 ( <> 操作不会走索引 )。
比如:把 colum <> 10 可以改成 colum > 10 OR colum < 10
4,where 条件后面做比较的字段类型一定要匹配。如果不匹配要在结果集少的字段上做转换 。
5, 如果有使用变量的,一定要把变量的类型转换成和字段类型一致。
6,不在要where 后面写类似 1=1 的条件。
7,使用 not in 的时候一定要关注一下子查询中是否含有null值的情况,如果含有null值,主查询不会返回任何结果,这种情况可以使用not exists替换。
8,注意下面两个语句的区别
select * fromlixuejun_test t where rownum <=10 order by t.t3 ;--先取出10条记录,然后对这10条件记录再进行排序
select *
from (select *from lixuejun_test t order by t.t3)
where rownum <=10; --先排序,然后取出t3字段值最小的10条记录。
9,关于多表连接去重,要先单个表去重之后再和其它表连接。这样结果集变小了,性能上会更好一些,同时也可以避免笛卡尔积的出现。
10,如果用到两个字段相除的,要注意做除数的字段为0或null值的情况,
如下面语句要注意t2字段为0和null值的情况
select * fromtest t where t.t1/t.t2 < 1
今天给大家分享一下生产库上两个异常SQL等价修改的案例。具体修改请见附件。
原SQL(生产库正在使用的SQL)主要的问题是本来简单的sql语句能达到的目的,使用了太多没有必要的子查询,使用过程复杂化了。最近做SQLREVIEW 这种类似的问题也遇见很多,请大家注意下。
因为调整的是select 语句,所以也在生产库上初步做了一下性能的测试。 结果改之前和改之后的SQL都能在1秒之内运行完,所以性能提高的也不是很明显。由此也推测生产库报这两个sql异常可能是当时的数据库压力比较大,资源不足,再加上这两个sql本身也是有问题的,导致这两个sql运行时间过长。
关于修改后的sql在功能上我初步测试也是一样的。请大家有时间也仔细分析下为什么这么改,这样就可以发现原SQL的问题,对自己也有一个提高。
有什么疑问也欢迎提出,发现修改之后的SQL与原SQL有不等价的地方更好,我们可以一起再做调整,共同进步!