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

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 性能杀手的更多相关文章

  1. 如何识别SQL Server中的CPU瓶颈

    原文:如何识别SQL Server中的CPU瓶颈 原文出自: http://www.mssqltips.com/sqlservertip/2316/how-to-identify-sql-server ...

  2. 如何识别SQL Server中的IO瓶颈

    原文:如何识别SQL Server中的IO瓶颈 原文出自: http://www.mssqltips.com/sqlservertip/2329/how-to-identify-io-bottlene ...

  3. 影响Sql server性能的因素

    目前本人在看<SQL Server性能调优实战> ,以下内容是本人看书笔记 数据库性能取决于各方面综合因素: 硬件,操作系统,软件 硬件:内存,CPU,磁盘 当服务器的物理内存不足时,会产 ...

  4. SQL Server 性能优化详解

    故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...

  5. 【SQL Server性能优化】运用SQL Server的全文检索来提高模糊匹配的效率

    原文:[SQL Server性能优化]运用SQL Server的全文检索来提高模糊匹配的效率 今天去面试,这个公司的业务需要模糊查询数据,之前他们通过mongodb来存储数据,但他们说会有丢数据的问题 ...

  6. 初涉SQL Server性能问题(4/4):列出最耗资源的会话

    在上3篇文章里,我们讨论了列出反映服务器当前状态的不同查询. 初涉SQL Server性能问题(1/4):服务器概况 初涉SQL Server性能问题(2/4):列出等待资源的会话 初涉SQL Ser ...

  7. 初涉SQL Server性能问题(3/4):列出阻塞的会话

    在 初涉SQL Server性能问题(2/4)里,我们讨论了列出等待资源或正运行的会话脚本.这篇文章我们会看看如何列出包含具体信息的话阻塞会话清单. /************************ ...

  8. 初涉SQL Server性能问题(2/4):列出等待资源的会话

    在初涉SQL Server性能问题(1/4)里,我们知道了如何快速检查服务器实例上正运行的任务数和IO等待的任务数.这个是轻量级的脚本,不会给服务器造成任何压力,即使服务器在高负荷下,也可以正常获得结 ...

  9. SQL Server 性能调优培训引言

    原文:SQL Server 性能调优培训引言 大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤 ...

随机推荐

  1. sass --watch 失败bug

    NameError: uninitialized constant Sass::Plugin::Compiler::SassListen 网上说法是sass v3.2.10有bug 但是我版本3.5. ...

  2. MySql中引擎

    1. InnoDB 引擎 MySQL 5.5 及以后版本中的默认存储引擎,它的优点如下:灾难恢复性好,支持事务,使用行级锁,支持外键关联,支持热备份. InnoDB引擎中的表,其数据的物理组织形式是簇 ...

  3. xadmin下设置“use_bootswatch = True”无效的解决办法

    环境: python 2.7 django 1.9 xadmin采用源代码的方式引入到项目中 问题: 在xadmin使用的过程中,设置“use_bootswatch = True”,企图调出主题菜单, ...

  4. Git学习——从远程库克隆

    克隆一个本地库 首先准备好一个远程库.再用命令克隆一个本地库. git clone git@github.com:<github账户>/<远程库名>.git 克隆一个仓库,首先 ...

  5. 【SaltStack】SaltStack研究心得

    基础篇 ------------------------------------------------------------------------------------------------ ...

  6. 推荐SQL Server Management Studio以及Visual Studio下的免费的插件 ApexSQL Complete

    SQL Server 并没有代码格式化的工具,对于处理他人编写的长SQL需要手工的格式化是一件麻烦的事情. 推荐SQL Server Management Studio以及Visual Studio下 ...

  7. Palindromic Paths(DP)

    描述 Given an N×N grid of fields (1≤N≤500), each labeled with a letter in the alphabet. For example: A ...

  8. mysql通过mysqldump实现备份,脚本编写

    每日三点同步mysql备份任务 crontab -e 0 3 * * * sh /home/shell/mysql_bakup.sh >> /dev/null 2>&1 my ...

  9. 利用ps,grep,kill联合杀掉相关进程

    #!/bin/sh . "./set-server-env.sh" 这里是输出ps -ef |grep java 结果的第二列的内容然后通过xargs传递给kill -9,其实第二 ...

  10. PIL:Python Imaging Library(图像处理标准库)和Qrcode:二维码生成

    安装PIL Mac或Linux安装命令:sudo easy_install PIL 如果报错:fatal error: 'freetype/fterrors.h' file not found Mac ...