实用排坑帖:SQL语句性能优化操作策略大全
副问题[/!--empirenews.page--]
本文会提到52条SQL语句机能优化计策。 1、对查询举办优化,应只管停止全表扫描,起首应思量在where及order by涉及的列上成立索引。 2、应只管停止在where子句中对字段举办null值判定,建设表时NULL是默认值,但大大都时辰应该行使NOT NULL,可能行使一个非凡的值,如0,-1作为默认值。 3、应只管停止在where子句中行使!=或<>操纵符,MySQL只有对以下操纵符才行使索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时辰的LIKE。 4、应只管停止在where子句中行使or来毗连前提,不然将导致引擎放弃行使索引而举办全表扫描,可以行使UNION归并查询:select id from t where num=10 union all select id from t where num=20。 5、in和not in也要慎用,不然会导致全表扫描,对付持续的数值,能用between就不要用in了:Select id from t where num between 1 and 3。 6、下面的查询也将导致全表扫描:select id from t where name like‘%abc%’可能select id from t where name like‘%abc’若要进步服从,可以思量全文检索。而select id from t where name like‘abc%’才用到索引。 7、假如在where子句中行使参数,也会导致全表扫描。 8、应只管停止在where子句中对字段举办表达式操纵,应只管停止在where子句中对字段举办函数操纵。 9、许多时辰用exists取代in是一个好的选择:select num from a where num in(select num from b)。用下面的语句替代:select num from a where exists(select 1 from b where num=a.num)。 10、索引当然可以进步响应的select的服从,但同时也低落了insert及update的服从,由于insert或update时有也许会重建索引,以是奈何建索引必要稳重思量,视详细环境而定。一个表的索引数最好不要高出6个,若太多则应思量一些不常行使到的列上建的索引是否有须要。 11、应尽也许的停止更新clustered索引数据列, 由于clustered索引数据列的次序就是表记录的物理存储次序,一旦该列值改变将导致整个表记录的次序的调解,会淹灭相等大的资源。若应用体系必要频仍更新clustered索引数据列,那么必要思量是否应将该索引建为clustered索引。 12、只管行使数字型字段,若只含数值信息的字段只管不要计划为字符型,这会低落查询和毗连的机能,并会增进存储开销。 13、尽也许的行使varchar/nvarchar取代char/nchar,由于起首变长字段存储空间小,可以节减存储空间,其次对付查询来说,在一个相对较小的字段内搜刮服从显然要高些。 14、最好不要行使”“返回全部:select from t ,用详细的字段列表取代“*”,不要返回用不到的任何字段。 15、只管停止向客户端返回大数据量,若数据量过大,应该思量响应需求是否公道。 16、行使表的别名(Alias):当在SQL语句中毗连多个表时,请行使表的别名并把别名前缀于每个Column上。这样一来,就可以镌汰理会的时刻并镌汰那些由Column歧义引起的语法错误。 17、行使“姑且表”暂存中间功效 : 简化SQL语句的重要要领就是回收姑且表暂存中间功效,可是姑且表的甜头远远不止这些,将姑且功效暂存在姑且表,后头的查询就在tempdb中了,这可以停止措施中多次扫描主表,也大大镌汰了措施执行中“共享锁”阻塞“更新锁”,镌汰了阻塞,进步了并发机能。 18、一些SQL查询语句应加上nolock,读、写是会彼此阻塞的,为了进步并发机能,对付一些查询,可以加上nolock,这样读的时辰可以应承写,但弱点是也许读到未提交的脏数据。 行使nolock有3条原则:
19、常见的简化法则如下: 不要有高出5个以上的表毗连(JOIN),思量行使姑且表或表变量存放中间功效。罕用子查询,视图嵌套不要过深,一样平常视图嵌套不要高出2个为宜。 20、将必要查询的功效预先计较好放在表中,查询的时辰再Select。这在SQL7.0早年是最重要的本领,譬喻医院的住院费计较。 21、用OR的字句可以解析成多个查询,而且通过UNION 毗连多个查询。他们的速率只同是否行使索引有关,假如查询必要用到连系索引,用UNION all执行的服从更高。多个OR的字句没有效到索引,改写成UNION的情势再试图与索引匹配。一个要害的题目是否用到索引。 22、在IN后头值的列表中,将呈现最频仍的值放在最前面,呈现得起码的放在最后头,镌汰判定的次数。 23、只管将数据的处理赏罚事变放在处事器上,镌汰收集的开销,如行使存储进程。 存储进程是编译好、优化过、而且被组织到一个执行筹划里、且存储在数据库中的SQL语句,是节制流说话的荟萃,速率虽然快。重复执行的动态SQL,可以行使姑且存储进程,该进程(姑且表)被放在Tempdb中。 24、当处事器的内存够多时,配制线程数目 = 最大毗连数+5,这样能施展最大的服从;不然行使 配制线程数目<最大毗连数启用SQL SERVER的线程池来办理,假如照旧数目 = 最大毗连数+5,严峻的侵害处事器的机能。 25、查询的关联同写的次序 :
26、只管行使exists取代select count(1)来判定是否存在记录,count函数只有在统计表中全部行数时行使,并且count(1)比count(*)更有服从。 27、只管行使“>=”,不要行使“>”。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |