加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

实用排坑帖:SQL语句性能优化操作策略大全

发布时间:2019-01-29 01:12:53 所属栏目:编程 来源:SimpleWu
导读:本文会提到52条SQL语句机能优化计策。 1、对查询举办优化,应只管停止全表扫描,起首应思量在where及order by涉及的列上成立索引。 2、应只管停止在where子句中对字段举办null值判定,建设表时NULL是默认值,但大大都时辰应该行使NOT NULL,可能行使一个特
副问题[/!--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。

适用排坑帖:SQL语句机能优化操纵计策大全

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条原则:

  • 查询的功效用于“插、删、改”的不能加nolock;
  • 查询的表属于频仍产生页破碎的,慎用nolock ;
  • 行使姑且表一样可以生涯“数据前影”,起到相同Oracle的undo表空间的成果,能回收姑且表进步并发机能的,不要用nolock。

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、查询的关联同写的次序 :

  1. select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = ‘JCNPRH39681’ (A = B ,B = ‘号码’)  
  2.  
  3. select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = ‘JCNPRH39681’ and b.referenceid = ‘JCNPRH39681’ (A = B ,B = ‘号码’, A = ‘号码’)  
  4.  
  5. select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = ‘JCNPRH39681’ and a.personMemberID = ‘JCNPRH39681’ (B = ‘号码’, A = ‘号码’) 

26、只管行使exists取代select count(1)来判定是否存在记录,count函数只有在统计表中全部行数时行使,并且count(1)比count(*)更有服从。

27、只管行使“>=”,不要行使“>”。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读