SQLServer数据库性能优化技巧
查询速度慢的原因很多,常见如下⼏种:
1、没有索引或者没有⽤到索引;
2、I/O吞吐量⼩,形成了瓶颈效应;
3、内存不⾜;
4、⽹络速度慢;
5、查询出的数据量过⼤;
6、锁或者死锁;
7、返回了不必要的⾏和列;
8、查询语句不好,没有优化。
可以通过如下⽅法来优化查询:
硬件/⽹络⽅⾯
1、升级硬件。
2、提⾼⽹速。
3、扩⼤服务器的内存。
4、增加服务器CPU个数。
5、把数据、⽇志、索引放到不同的I/O设备上。
6、DB Server和APP Server分离。
7、应⽤分布式分区视图。
索引⽅⾯
8、根据查询条件建⽴索引,优化索引。
9、索引应该尽量⼩,使⽤字节数⼩的列建索引好。
10、不要对有限的⼏个值的字段建单⼀索引(如性别字段)。
11、对于查询字段的值很长的建全⽂索引。
12、要注意索引的维护,周期性重建索引,重新编译存储过程。
13、如果使⽤了IN或者OR等时发现查询没有⾛索引,使⽤显⽰声明指定索引。
14、不要在WHERE⼦句中的“=”左边进⾏函数、算术运算或其他表达式运算,否则系统将可能⽆法正确使⽤索引。
15、在使⽤索引字段作为条件时,如果该索引是联合索引,那么必须使⽤到该索引中的第⼀个字段作为条件时才能保证系统使⽤该索引,否则该索引将不会被使⽤。
16、如果临时表的数据量较⼤,需要建⽴索引,那么应该将创建临时表和建⽴索引的过程放在单独⼀个⼦存储过程中,这样才能保证系统能够很好的使⽤到该临时表的索引。
17、如果某列存在空值,即使对该列建索引也不会提⾼性能。
SQL语句⽅⾯
18、如果是使⽤LIKE进⾏查询的话,简单的使⽤索引是不⾏的,LIKE 'a%' 使⽤索引,LIKE '%a' 不使⽤索引,⽤ LIKE '%a%' 查询时,查询耗时和字段值总长度成正⽐,所以不能⽤CHAR类型,⽽是VARCHAR。
19、查询时不要返回不需要的⾏、列。
20、⼀定要将函数和列名分开。如果必须⽤函数的时候,创建计算列再创建索引来替代。
21、NOT IN会多次扫描表,使⽤EXISTS、NOT EXISTS,IN,LEFT OUTER JOIN来替代,特别是左连接,⽽EXISTS⽐IN更快,最慢的是NOT操作。
22、BETWEEN在某些时候⽐IN速度更快,BETWEEN能够更快地根据索引到范围。
23、⽤OR的⼦句可以分解成多个查询,并且通过UNION连接多个查询。它们的速度只同是否使⽤索引有关。多个OR的⼦句没有⽤到索引,改写成UNION的形式再试图与索引匹配。sql优化的几种方式
24、在IN后⾯值的列表中,将出现最频繁的值放在最前⾯,出现得最少的放在最后⾯,减少判断的次数。
25、⼀般在GROUP BY、HAVING⼦句之前就能剔除多余的⾏,所以尽量不要⽤它们来做剔除⾏的⼯
作。它们的执⾏顺序应该如下最优:WHERE⼦句选择所有合适的⾏,GROUP BY⽤来分组统计⾏,HAVING⼦句⽤来剔除多余的分组。这样GROUP BY、HAVING的开销⼩,查询快。对于⼤的数据⾏进⾏GROUP BY和HAVING⼗分消耗资源。如果GROUP BY的⽬的不包括计算,只是分组,那么⽤DISTINCT更快。
26、尽量使⽤批处理。
27、不要在⼀句话⾥再三的使⽤相同的函数,浪费资源,将结果放在变量⾥再调⽤更快。
28、分析select emp_name form employee where salary > 3000 在此语句中若salary是FLOAT类型的,则优化器对其进⾏优化为CONVERT(float,3000),因为3000是个整数,我们应在编程时使⽤3000.0⽽不要等运⾏时让DBMS进⾏转化。对其它类型也是⼀样。
29、注意WHERE⼦句写法,必须考虑语句顺序,应该根据索引顺序、范围⼤⼩来确定条件⼦句的前后顺序,尽可能的让字段顺序与索引顺序相⼀致,范围从⼤到⼩。
30、尽量使⽤EXISTS代替SELECT COUNT(1)来判断是否存在记录,COUNT函数只有在统计表中所有⾏数时使⽤,⽽COUNT (1)⽐COUNT (*)更有效率。
31、尽量使⽤“>=”,不要使⽤“>”。
32、注意表之间连接的数据类型,避免不同类型数据之间的连接。
33、尽量避免使⽤DISTINCT、ORDER BY、GROUP BY、HAVING、JOIN、CUMPUTE。
34、在海量查询时尽量少⽤格式转换。
35、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移⾄等号右边。
其它⽅⾯
36、纵向、横向分割表,减少表的尺⼨。
37、设置⾃动收缩⽇志。
38、周期性清理⽇志。
39、对于⼤的数据库不要设置数据库⾃动增长,它会降低服务器的性能。
40、避免表扫描。
41、尽可能不使⽤游标。
42、⽤Profiler来跟踪查询,得到查询所需的时间,出SQL的问题所在。⽤索引优化器优化索引。
43、使⽤Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。
44、将计算的结果预先计算好放在表中,查询的时候再SELECT。
45、如果要插⼊⼤的⼆进制值到IMAGE列,使⽤存储过程,千万不要⽤应⽤程序内嵌INSERT来插⼊。因为应⽤程序⾸先将⼆进制值转换成字符串(尺⼨是它的两倍),服务器收到字符后⼜将他转换成⼆进制值。存储过程就没有这些动作。
46、尽量少⽤视图,它的效率低。对视图操作⽐直接对表操作慢。
47、尽量将数据的处理⼯作放在数据库上,减少⽹络的开销,如使⽤存储过程。存储过程是编译好、优化过、并且被组织到⼀个执⾏规划⾥、且存储在数据库中的SQL语句,是控制流语⾔的集合,速度当然快。
48、函数的返回值不要太⼤,这样的开销很⼤。⽤户⾃定义函数像游标⼀样执⾏的消耗⼤量的资源,如果返回⼤的结果采⽤存储过程。
49、尽量避免反复访问同⼀张或⼏张表,尤其是数据量较⼤的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。
50、要尽量避免在游标循环中再进⾏表连接的操作。
51、如果使⽤到了临时表,在存储过程的最后务必将所有的临时表显式删除,先TRUNCATE TABLE,然后DROP TABLE,这样可以避免系统表的较长时间锁定。
52、在某些必须使⽤游标的场合,可考虑将符合条件的数据⾏转⼊临时表中,再对临时表定义游标进⾏操作,这样可使性能得到明显提⾼。
经验显⽰,SQL Server 性能的最⼤改进得益于逻辑的数据库设计、索引设计和查询设计⽅⾯。反过来说,最⼤的性能问题常常是由其中这些相同⽅⾯中的不⾜引起的。其实 SQL 优化的实质就是在结果正确的前提下,⽤优化器可以识别的语句,充份利⽤索引,减少表扫描的I/O 次数,尽量避免表搜索的发⽣。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论