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

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. 初涉DSU on tree

    早先以为莫队是个顶有用的东西,不过好像树上莫队(不带修)被dsu碾压? dsu one tree起源 dsu on tree是有人在cf上blog上首发的一种基于轻重链剖分的算法,然后好像由因为这个人 ...

  2. Java开发工具下载

    一.Tomcat下载: http://tomcat.apache.org/ 二.Maven下载: http://maven.apache.org/download.cgi 三.eclipse下载: h ...

  3. Javaweb开发之路

    本文作者:DavidLin 欢迎转载,但请保留文章原始出处→_→ 本文地址:http://www.cnblogs.com/univeryinli/p/programming-skill-yinli.h ...

  4. 解决like '%字符串%'时索引不被使用的方法

    解决like '%字符串%'时索引不被使用的方法   分步阅读 解决like '%字符串%'时索引不被使用的方法,如果like以通配符开头('%abc')时索引会失效会变成全表扫描的操作. 工具/原料 ...

  5. ython——杂货铺

    三目运算: >>> 1 if 5>3 else 0 1 >>> 1 if 5<3 else 0 0 深浅拷贝: 一.数字和字符串 对于 数字 和 字符串 ...

  6. chrome 下载插件包及离线安装 附 Advanced Rest Client 下载

    最近需要测试http rest服务,由于chrome插件的轻便,首先想到了用chrome插件,在google商店找到Advanced Rest Client,用了一阵感觉不错. 于是项目组其他同事也要 ...

  7. i++和++i的区别,及其线程安全问题

    i++和++i都是i=i+1的意思,但是过程有些许区别: i++:先赋值再自加.(例如:i=1:a=1+i++:结果为a=1+1=2,语句执行完后i再进行自加为2) ++i:先自加再赋值.(例如:i= ...

  8. HDU 3879 Base Station

    Base Station Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...

  9. ASP.NET中一般处理程序报的错误:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值

    1.把context.Response.End();代码换成 HttpContext.Current.ApplicationInstance.CompleteRequest(); 2.把context ...

  10. 九度oj 题目1021:统计字符

    题目描述:     统计一个给定字符串中指定的字符出现的次数. 输入:     测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过80的字符串.注 ...