MyException - 我的异常网
当前位置:我的异常网» SQL » 分辨SQL Server 性能杀手

分辨SQL Server 性能杀手

www.MyException.Cn  网友分享于:2013-08-09  浏览:0次
识别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的正确配置对于查询性能也有较大的影响。

文章评论

那些争议最大的编程观点
那些争议最大的编程观点
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
漫画:程序员的工作
漫画:程序员的工作
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我是如何打败拖延症的
我是如何打败拖延症的
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员应该关注的一些事儿
程序员应该关注的一些事儿
一个程序员的时间管理
一个程序员的时间管理
程序员的鄙视链
程序员的鄙视链
10个调试和排错的小建议
10个调试和排错的小建议
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
 程序员的样子
程序员的样子
程序员都该阅读的书
程序员都该阅读的书
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员和编码员之间的区别
程序员和编码员之间的区别
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
鲜为人知的编程真相
鲜为人知的编程真相
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
如何成为一名黑客
如何成为一名黑客
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
中美印日四国程序员比较
中美印日四国程序员比较
Java程序员必看电影
Java程序员必看电影
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
每天工作4小时的程序员
每天工作4小时的程序员
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员必看的十大电影
程序员必看的十大电影
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有