识别SQL Server 性能杀手

Posted 乔凯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了识别SQL Server 性能杀手相关的知识,希望对你有一定的参考价值。

性能优化的重点在于识别定位问题,预先了解主要的性能杀手,能够更快的定位到问题并将工作集中在可能的原因之上。

 

SQL SERVER性能杀手主要集中在如下几类:

1.1   低质量的索引

低质量的索引通常是SQL SERVER最大的性能杀手,对于一个缺乏索引的查询,SQL SERVER 需要处理大量的读取和计算;这样导致磁盘、内存、CUP上有很大的开销,并且会显著的增加了查询执行时间。

 

1.2   不精确的统计信息

统计信息是谓词引用的列中的数据分布,其存储的方式为柱状图;柱状图是显示数据分布于不同分类中频度的一种统计结构。索引的有效性完全取决于索引列的统计信息,如有没有统计信息,SQL SERVER 内建的查询优化器就不能精确的估计查询影响的行数,此时查询优化器就非常的低效。

 

1.3   过多的阻塞与死锁

SQL SERVER 完全兼用于原子性、一致性、隔离性、永久性,所以数据库引擎会确保并发事务被正确的互相隔离。默认情况下,一个事务所看见的数据是另一个事务修改之前或者修改之后的状态—它不会看到中间状态。

    因为这种隔离性,当多个事务以一种兼容的方法并发访问公用资源时,数据库中会发生阻塞。当两个资源尝试升级或扩展加锁的资源并且与另一个冲突时,就会发生死锁。查询引擎确定回滚开销最低的进程并选择其为死锁牺牲品。牺牲品需要再次提交请求才能正常执行完成。这就导致开销时间较长。

 

1.4   不基于数据集的操作

T-SQL是一种数据集的脚本语言,操作数据是在数据集上进行。这需要我们从数据列上考虑问题而不是从数据行上思考问题。避免在操作中使用游标和循环,而是需要多使用连接于子查询。

 

1.5   低质量的查询设计

索引的有效性取决于编写的SQL 查询语句;如果SQL从一个表中读取了过多的行或者指定的过滤条件返回了超过所需要的大结果集,都将使索引变得无效。为了能更好的使用索引,必须编写高质量的SQL查询语句并做到按需取数。

 

1.6   低质量的数据库设计

    数据库应该合理的规范化以增进数据库检索的性能并减少阻塞。一个不合理的设计会导致数据的重复存储,一个过渡规范化的数据库会导致读取数据所需的连接非常多;一个合理规范化的数据库是高质量查询的基石。

 

1.7   过多的碎片

    数据存储的基本单位是页,由于频繁的页分割使得页中包括了无法存储数据的空白区域称为碎片;碎片会引起读操作次数的增加而影响性能(一次读取的是一个页)。

 

1.8   不可重用的执行计划

为了有效的执行查询,SQL SERVER 会在编译的时候生成一个优化的执行计划,该执行计划会缓存在内存中,因而其可以重用。但是如果该查询设计为不能插入变量值,相同的查询以不同的变量值重新提交时,SQL SERVER会重新生成新的执行计划,这个过程会耗掉一线性能。因此SQL SERVER 缓存或重用执行计划的方式提交SQL查询会对性能有一定的优化。

 

1.9   低质量的执行计划

    一个不好的执行计划有时可能是一个真正的杀手,不好的计划常常是由被称为参数嗅探的进程造成的,这个进程来自于查询优化器用于根据统计确定最佳计划的过程。理解统计信息是很重要的。

 

1.10     频繁重编译计划

存储过程的重新编译会导致执行计划的重复生成,该过程很耗费性能,所以一般情况下不要将存储过程设计为重编译。

 

1.11     游标的错误使用

     游标是一种非集合的操作,会给SQL SERVER 增加大量的开销;尽可能使用基于数据集的操作。

 

1.12     错误配置数据库日志

     为了达到最佳的性能,SQL SERVER 很大程度上依赖于对数据库日志的高效访问。因此合理的日志配置方法也很重要。

 

1.13     过多使用或者错误配置TEMPDB

     每一个SQL SERVER 实例都只有一个tempdb,因为涉及用户对象(如临时表与表变量)、系统对象(如游标或用于连接的hash表)的操作,以及排序和行版本控制等操作都使用tempdb数据库,所以tempdb有时候也可能成为一个瓶颈。所有这些操作和其他可能使用的操作都可能导致tempdb中的空间、I/0和争用问题。因此tempdb的正确配置对于查询性能也有较大的影响。

以上是关于识别SQL Server 性能杀手的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中执行 while 循环

SQL Server 事务与锁

SQL Server中的事务与锁

SQL Server中的事务与锁

SQL Server中的事务与锁

SQL Server中的事务与锁