SQL语句的优化与性能调优
2020-08-04吴凯佳陈少琴李结映
吴凯佳 陈少琴 李结映
摘要:在日常的工作中,或多或少会遇到一些较为复杂的sQL语句,当我们发现这些语句执行得慢时,总是会想办法对其修改,让它变得更快一些。本文探讨研究了sQL SER VER下SQL的语句调优方法。
关键词:sQL;优化;调优
中图分类号:TP311.1 文献标识码:A 文章编号:1007-9416(2020)05-0051-01
1背景
一般在应用中,糟糕的SQL语句是造成系统性能低下的最主要原因,例如大小写的不统一、同样的sQL语句不同的写法等。当业务数据量相对较少时,一些sQL的执行效率对程序运行效率的影响不太明显,随着数据量的增加,SQL的执行效率对程序的运行效率的影响逐渐增大,糟糕的sQL语句会使情况变得越来越严重,此时对sQL的优化就很有必要。
2SQL优化的一些方法
(1)通配符中Like的使用需注意,如select id,name fromusednfo where naille like%name%;或select id,name fromuserinfo where name like%name;該写法由于name前面用了“%”,会造成全表的扫描,效率低下,select id,name from userinfowhere name likename%;这样的的写法执行效率快很多。
(2)避免在Where子句中对字段进行函数操作,where子句‘一左边不要出现函数、算数运算或者其他表达式运算。如select id fromuserinfo where substring(name,l,6)=‘xiaomi;该语句对字段进行了函数处理,会导致查询分析器放弃了索引的使用。正确的写法应为select id from userinfo where name likexiaomi%。
(3)在子查询当中,尽量用exists代替in,如select name fromusennfo a where id in(select id from userinfo b);可以改为select naille from userinfo a where exists(select l from userinfob where id=a.id)。
(4)where子句中尽量不要使用iS null或iS not null对字段进行判断,例如:select id from userinfo where name iS null;尽量在数据库字段中不出现null,如果查询的时候条件为iS null,索引将不会被使用,造成查询效率低,因此数据库在设计的时候,尽可能将某个字段可能为空的时候设置默认值,那么查询的时候可以根据默认值进行查询,比如name字段设置为0,查询语句可以修改为se-lect id from userinfo where name=0。
(5)避免在where子句使用or作为链接条件,如select id fromuserinfo where name=xiaomingor name=xiaowang;可以改写为:select id from usefinfo where name=xiaomingunionall select id from userinfo where name='xiaowang'。
(8)一些没有意义的查询如:select coll,c012 into#t from twhere l=O;这类代码不会返回任何结果集,但是会消耗系统资源,如需要生成一个空表结构,应改成:create table#t(…)。
(9)并不是所有索引对查询都有效,sQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,sQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在seX上建了索引也对查询效率起不了作用。
(10)尽可能使用varchari代替har,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
(u)避免频繁创建和删除临时表,以减少系统表资源的消耗。临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是对于一次性事件,最好使用导出表。
(12)在新建临时表时,如果一次性插入数据量很大,可以使用select into代替create table,避免造成大量log,以提高速度,如果数据量不大,为了缓和系统表的资源,应Ygcreate table,然后insert。
(13)如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。
3结语
要对复杂的sQL进行优化,语句的执行顺序可谓是重中之重,我们只有明确了执行顺序,才能在后续简化sQL的过程中有的放矢的进行。否则,如果方向错了,再努力也是徒劳。所以我们要做到不但会写sQL,还要做到写出性能优良的sQL。