SQL Server数据库性能优化技巧

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 原文:SQL Server数据库性能优化技巧查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引; 2、I/O吞吐量小,形成了瓶颈效应; 3、内存不足; 4、网络速度慢; 5、查询出的数据量过大; 6、锁或者死锁; 7、返回了不必要的行和列; 8、查询语句不好,没有优化。
原文: SQL Server数据库性能优化技巧

查询速度慢的原因很多,常见如下几种:

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的形式再试图与索引匹配。

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 次数,尽量避免表搜索的发生。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
4天前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
17天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
3天前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
33 9
|
14天前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
21天前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
49 11
|
21天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
70 6
|
2月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
95 11
|
21天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
162 0
|
24天前
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
|
2月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。