在过去十年里,很多复杂的企业应用都是用Microsoft SQL Server进行开发和部署的。如今,SQL Server已经成为现代业务应用的基石,并且它还是很多大公司业务流程的核心。SQL Server的应用范围很广,包括生产过程中的业务线应用,内部客户关系管理和决策支持系统,以及面向用户的电子商务和网络自服务应用等。因此,SQL Server性能和可伸缩性具有很高的优先级,而且提供最优的SQL Server性能和扩展性也是所有SQL Server DBA们的关键工作之一。

  然而,很多SQL Server系统的性能和扩展性并不理想,这通常是由糟糕的数据库设计,索引设计和SQL Server系统对工作负载的不适当配置造成的。因为任何大型SQL Server工程的开发都以实现功能为主要目的,至于性能和扩展性经常被当做一种事后才处理的东西。

  虽然对SQL Server系统的性能问题进行故障诊断困难重重,但是如果能用相对较少的时间投入,换取显着的性能提升,又何乐而不为呢。

  硬件性能瓶颈

  内存

  内存对SQL Server性能的影响胜过任何其他硬件。因此,对SQL Server系统的内存使用情况进行定期监视以确保内存的可用百分比高于20%是很有必要的。如果用户遭遇性能问题,同时可用内存百分比低于20%,那么此问题一定是内存分配不足导致的。这要求技术人员密切关注显示平均页面预期寿命的性能计数器,并确保平均页面预期寿命总是高于300秒(5分钟)。一旦放生少于此标准的情况,就说明要么是糟糕的索引设计导致了磁盘输入/输出(I/O)的增加,要么就是对内存的利用效率很低,或者是实际的内存不足。技术人员需要监视SQL Server系统上的分页率,并确保它们常规为1000页每秒。检查PerfMon object MSSQL Buffer Manager(性能监视对象MSSQL缓冲管理器)和Memory Performance Counters(内存性能计数器)。

  同样,还要监视计数器,即PerfMon object SQL Server Memory Manager Counters中的Memory Grants Pending.此计数器显示的是每秒钟等待工作负载分配的进程总数。一般来讲,小型OLTP事务不需要大内存分配。对一个OLTP事务来说,任何大于零的内存分配都说明SQL Server系统存在内存不足。

  解决内存瓶颈的途径之一是找出内存高耗进程,这可以确认诸如内存泄漏之类潜在的应用程序问题。你还可以通过检查查询优化性能以消耗更少的内存。另外一种方法就是给SQL Server增加更多的物理内存来扩展升级SQL Server环境。扩展升级通常是解决任何与内存相关的性能瓶颈的济世良方。

  磁盘I/O使用

  对比其他的硬件资源,存储输入/输出通常是SQL Server中最慢的系统资源。因此,监视存储系统以确定存储是否成为一个影响性能的瓶颈是十分重要的。如果是,那么下个步骤就是要调查是否能够优化存储系统的设计和配置以获得扩展性和高性能。检查Average Disk Sec/Read(秒均磁盘读取)和Average Disk Sec/Write (秒均磁盘写入)的PerfMon磁盘计数器。确保OLTP系统和更高决策支持系统的一个读或写的时间在理想情况下少于12毫秒。

  与内存一样,解决磁盘I/O性能瓶颈最简单的方法就是扩展升级SQL Server环境,即用更快的磁盘替换现有磁盘,可以更好地应对I/O负载和分配I/O负载到多个轴上。同时还要定期整理磁盘数据。

  CPU

  CPU性能瓶颈的发生有诸多原因。它们包括非理想的查询计划,应用程序或是数据库的设计缺陷,糟糕的SQL Server配置或是硬件资源的不足。技术人员可以对Processor Queue Length(处理器队列长度)的PerfMon operation system CPU(PerfMon操作系统CPU)和处理器计数器进行检查以验证正在等待CPU周期的线程数在八个以内。如果这一数字大于12,那就意味着CPU产生了性能问题。

  在确认了某个CPU瓶颈之后,便可以使用sys.dm_os_wait_stats动态管理视图(DMV)来确认对CPU来说排前十的性能最差的查询,如下所示。

  SELECT TOP 10 (a.total_worker_time / a.execution_count) AS [Avg_CPU_Time]

  ,Convert(VARCHAR, Last_Execution_Time) AS [Last_Execution_Time]

  ,Total_Physical_Reads

  ,SUBSTRING(b.TEXT, a.statement_start_offset / 2, (

  CASE

  WHEN a.statement_end_offset = - 1

  THEN len(convert(NVARCHAR(max), b.TEXT)) * 2

  ELSE a.statement_end_offset

  END - a.statement_start_offset

  ) / 2) AS [Query_Text]

  ,dbname = Upper(db_name(b.dbid))

  ,b.objectid AS 'Object_ID', B.*

  FROM sys.dm_exec_query_stats a

  CROSS APPLY sys.dm_exec_SQL_text(a.SQL_handle) AS b

  ORDER BY [Avg_CPU_Time] DESC

  接着,你可以对这些查询和底层索引进行调优以解决CPU瓶颈。同时,对你的SQL Server进行配置以使用所有可用的CPU机器。你还可以通过添加额外的CPU或用更快的CPU升级一个新的服务器来扩展你的SQL Server系统。

  数据库设计问题

  高度规范化的数据库

  糟糕的数据库设计会导致数据库性能不足。例如,高度规范化的数据库是与复杂关系连接相关联的。这就造成了长时间执行查询对诸如CPU,内存,和磁盘I/O之类系统资源的浪费。显然,一个高度规范化的数据库会让SQL Server和数据库性能显着降低。编写高效查询的一般规则就是如果一个操作需要五个或者更多的表连接,就要对数据库进行重新设计。

  重复和未使用的索引

  索引是解决很多性能问题的杀手锏,但是在频繁更新的表上拥有过多的索引会招致额外开销,因为SQL Server在执行插入/更新/删除操作期间会执行额外的工作以保持索引处于最新状态。这就意味着在更新基于索引数量和复杂度的表中数据的时候,SQL Server数据库引擎需要更多的时间。同时,索引维护也会增加CPU和I/O使用,这会在一个密集写入的系统中对性能造成损害。因为任何重复和冗余的索引对系统资源来说毫无意义,所以需要将它们移除。

  在SQL Server中,我们可以使用sys.dm_db_index_usage_stats DMV来识别未使用的索引。DMV给出了一个索引是如何用于解析查询的相关统计数据。另外,你还可以执行Database Engine Tuning Advisor(数据库引擎调优顾问DTA)来识别未使用的索引。

SQL Server数据库的软硬件性能瓶颈的更多相关文章

  1. Sql Server数据库备份和恢复:原理篇

    本文与您探讨为什么Sql Server有完整备份.差异备份和事务日志备份三种备份方式,以及为什么数据库又有简单模式.完整模式和大容量日志模式这三种恢复模式.本文内容适用于2005以上所有版本的Sql ...

  2. 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

    目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...

  3. SQL Server 数据库索引

    原文:SQL Server 数据库索引 一.什么是索引 减少磁盘I/O和逻辑读次数的最佳方法之一就是使用[索引] 索引允许SQL Server在表中查找数据而不需要扫描整个表. 1.1.索引的好处: ...

  4. SQL Server数据库读写分离提高并发性

    在一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.很多人在这时候,第一个想到的就是一个解决性能问题的利器——负载均衡.遗憾的是,SQL Server 的所有版 ...

  5. SQL SERVER数据库升级手册

    背景 最近接手很多项目都跟数据库升级有关.感触还是颇深,写个心得,供大家参考,如果有疑问欢迎留言.     为什么升级?   你可能会因为各种各样的原因选择升级.我认为原因主要是3个方面 1.旧版本使 ...

  6. 如何选择 SQL Server 数据库跟操作系统版本

    简介: 今天老大提需求, 需要一台 Windows 服务器, 需要安装最新版的 SQL Server 数据库.额, 上次搞 Windows 服务器还是4年前的事. 一.啥也没查, 直接下载操作系统.做 ...

  7. (4.20)SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

    转自:指尖流淌 https://www.cnblogs.com/zhijianliutang/p/4085546.html SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧 ...

  8. SQL Server 数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

    目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...

  9. .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库

    今天微软正式发布了ASP.NET 5 RC1(详见Announcing ASP.NET 5 Release Candidate 1),.NET跨平台迈出了关键一步. 紧跟这次RC1的发布,我们成功地将 ...

随机推荐

  1. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第1节 Scanner类_3-Scanner的使用步骤

    Scanner如何进行键盘输入,引用类型就包含了Scanner,它就是引用类型,所以也有这三个步骤, 导包.创建.使用 先通过api文档找到它.左边输入要查找scanner.双夹scanner右边就会 ...

  2. 测开之路九十九:js函数、事件、window窗体对象

    函数:function 函数名(参数列表) 事件 单击:onclick()表单提交:onsubmit()鼠标经过:onmouseover()值改表时:onchange() window窗体对象转跳:w ...

  3. Ngix 配置与部署(wsgi,uwsgi,uWSGI)

    1. WSGI 是一种协议接口,他是描述web服务器如何与web应用程序(Django ,Flask ) 通讯的规范. 2. uwsgi 与WSGI协议一样,是uWSGI服务器的独占协议,用于定义传输 ...

  4. Where we love is home, home that our feet may leave, but not our hearts.

    parcel.n. 包裹 endurance.n.耐力 rot.v.腐烂 ornament.n.装饰 pinch.v.捏 nationality.n.国家 sunshine.n.阳光 stagger. ...

  5. 实验报告一 &第三周课程总结

    实验报告 1.打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 实验代码: public class wdnmd{ publ ...

  6. 小白学Python(11)——pyecharts,绘制饼图 Pie

    Pie-基本示例 from example.commons import Faker from pyecharts import options as opts from pyecharts.char ...

  7. poj_3179 Corral the Cows (二分+二维前缀和+离散化)

    [题目链接] http://poj.org/problem?id=3179 [参考] http://www.cnblogs.com/evenbao/p/9243183.html [算法] 二分答案+判 ...

  8. 2019 Multi-University Training Contest 4 - 1010 - Minimal Power of Prime

    http://acm.hdu.edu.cn/showproblem.php?pid=6623 题意,给50000个1e18级别的数N,求它质因数分解里面的最小的指数(不算0) 比赛的时候给划了一个1e ...

  9. python 搜索路径顺序查找

    但我们通过 import 或者frome .. import...查找模块的时候,当你导入一个模块,Python 解析器对模块位置的搜索顺序是 1.当前目录 2, 如果不在当前目录,Python 则搜 ...

  10. SpringBoot 集成MyBatis 中的@MapperScan注解

    SpringBoot 集成MyBatis 中的@MapperScan注解 2018年08月17日 11:41:02 文火慢炖 阅读数:398更多 个人分类: 环境搭建 在SpringBoot中集成My ...