`
骑猪逛街666
  • 浏览: 144614 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SQL Server最佳实践:高CPU使用率排查

阅读更多
阅读原文请点击:http://click.aliyun.com/m/23240/
摘要: 在阿里云SQL Server最佳实践系列在线直播中,阿里云数据库专家汪建明总结了7大问题并结合案例为大家分享了阿里云SQL Server高CPU使用率问题排查的实践经验。

摘要:在阿里云SQL Server最佳实践系列在线直播中,阿里云数据库专家汪建明总结了7大问题并结合案例为大家分享了阿里云SQL Server高CPU使用率问题排查的实践经验。


本期直播回顾链接:http://yq.aliyun.com/webinar/play/237  更多系列精彩课程直播,尽在 云数据库经典案例和最佳实践专场,等待你的参与!



以下内容均根据演讲视频以及PPT整理而成。

演讲者简介
汪建明(花名:风移),近10年SQL Server数据库DBA经验。曾就职于新蛋中国6年、新蛋美国3年半。现任阿里云数据库专家,负责SQL Server产品线。

分享议程
本文将按照SQL Server高CPU使用率问题排查的7个方面进行分享:
缺失索引 (Missing Indexes)
索引碎片 (Indexes Fragmentation)
数据类型转换 (Data Conversion)
非SARG查询 (Non-SARG Query)
参数嗅探 (Parameter Sniffing)
统计信息 (Statistics)
TOP CPU查询 (TOP SQL)

一、缺失索引 (Missing Indexes)

690026b766004839d0f2897aaeae6d2bc5722295

为什么索引缺失会降低SQL Server的CPU使用率?
真正排查出的高CPU使用率的第一大因素就是Missing Indexes,那么为什么索引的缺失是SQL Server CPU使用率的第一大杀手呢?要回答这个问题就需要首先回答什么是索引。索引的结构其实是基表的某一列或者某几列数据的投影,并且这些列的数据是按照升序或者降序排列完毕之后的特殊结构,这个特殊结构使得查询的性能会更加高效,特别是对于经常会使用到的查询语句。既然索引特殊的结构已经排序完成了,那么在进行检索的时候效率就会非常高,可以很快地定位到数据所在的位置,这样就能够大大降低SQL Server本身的IO的消耗,IO的消耗降低之后CPU的使用率自然也会下降。

发现缺失索引的方法
如何发现哪些表中又缺失了哪些索引呢?第一种方法就是DTA (Database Tuning Advisor)。第二种方法就是执行计划中存在索引缺失的警告,也就是当执行某一条语句的时候,执行计划会报出一个警告提示这里缺少一个索引,这个时候就可以将缺失的索引找出来并创建它。第三种方法就是访问系统的动态视图,大致有sys.dm_db_missing_index_group_stats、sys.dm_db_missing_index_group_stats以及sys.dm_db_missing_index_details这三个视图,具体怎样去使用大家可以查阅帮助文档。

不要盲目地创建缺失的索引
在创建缺失索引时一定不要盲目,一定要确保创建的缺失索引是有效的,这样做的第一个原因是创建索引会导致一定的存储开销,因为索引的数据结构也会占用数据文件空间。第二个原因是DML操作会导致索引的维护成本增加,因为索引的结构是基于表的某列或者某几列组合出来的数据结构,这个数据结构的一致性一定是随着基表的数据变化而变化的,当我们进行Delete、Insert以及Update操作的时候也需要去维护索引的数据结构,因为需要保证索引结构数据与基表数据的一致性,所以就会带来索引维护成本的上升。

这部分的相关Demo请参考云栖社区的博客:https://yq.aliyun.com/articles/72265

二、索引碎片 (Indexes Fragmentation)
刚才提到了索引缺失会导致CPU使用率的升高,而另外一个问题是:是不是索引创建以后CPU的使用率就一定会降低呢?或者是说在索引不缺失的情况下,CPU的使用率就一定不会上升呢?这两个问题的答案都是否定的。这里涉及的话题就是索引碎片,这里的索引碎片可以理解为索引数据页中的一些空隙,这应该如何理解呢?假如某一个页里面是满的,比如是8K,如果存在25%的空隙,那么真正有效的数据只有75%,举个简单的例子比如某个表格的索引数据有100个页,但是碎片率是25%,所以这100个换页面里面只有75个页面的数据是有效的。所以在索引的碎片率非常高的情况下,索引的效率就会非常低,因为其IO的使用率也会非常低。
a7179ee988ad7b6d00315f273c1ad4f40c1c3dcd
Rebuild Indexes
解决索引碎片的方法其实很简单,也就是进行一个Rebuild Indexes的操作,做完这个操作之后统计信息会被更新,相应的执行计划中的缓存信息也会被清空,当相同的语句再过来的时候,SQL Server就会重新进行执行计划的评估和选择,并获得更好的执行计划。

注意事项
Rebuild Indexes操作的方式能够很容易地解决索引碎片问题,但是还是存在三个地方需要大家注意。因为做Rebuild Indexes操作的时候会导致数据日志文件的增长,那么基于SQL Server日志文件的技术比如Database mirroring、Log shipping以及alwayson等,这些基于日志的技术都会导致进程变得很慢,因为日志文件会在短时间内出现暴涨的情况,所以这里需要提醒大家注意这个问题,在后面也会分享如何解决这些问题。

如何去做Rebuild Indexes
我们所需要基于的原则是一定在100%的需要时才去做Rebuild Indexes,那些使用率比较低的,哪怕是碎片率很高的表也不会太过于关注,比如一些很小的表或者是heap的表,对于很小的表而言,SQL Server在做执行计划的时候发现表格很小则会走Table Scan而不是Index Seek或者Index Scan的操作。第二个原则是在Rebuild Indexes的时候一定要去对每一个索引级别进行索引碎片率的检查,而不要盲目对整个表级Rebuild Index。第三个原则是当发现索引的碎片率处于不同的级别的时候选择的处理方法也是不一样的,如果碎片率在10%以下,那么就不需要去做Rebuild Indexes操作,如果索引碎片率在10%到30%之间,应该选择做reorganize操作,当索引碎片率大于30%,可以做Rebuild Indexes操作。这里还请主要,使用SQL Server的版本,如果是企业版本,请选择ONLINE=ON选项,以较小Rebuild Index对应用程序对影响。

还有一点需要提醒大家的就是在做Rebuild Indexes操作的时候一定要选择在业务的低峰期,因为Rebuild Indexes是一个IO密集型的操作,所以会非常消耗IO。除此之外,当存在Database mirror或者Log shipping以及alwayson的时候,如何做Rebuild Indexes才能够使影响最小呢?这里使用的技术是table partition,可以在大表上面建立table partition,然后逐个partition去做Rebuild Indexes,因为每个partition都会对于数据进行切分,切分之后数据量就会变得更小,这样产生的影响也会变得更小。

这部分的相关Demo请参考云栖社区的博客:https://yq.aliyun.com/articles/72348

三、数据类型隐式转换 (Data Conversion Implicitly)
很多同学不了解数据类型的转换,特别是数据类型的隐式转换。在这里和大家简单分享一下。
阅读原文请点击:http://click.aliyun.com/m/23240/
分享到:
评论

相关推荐

    sqlserver cpu使用率高排查

    SQL Server CPU 使用率高排查 在使用 SQL Server 过程中,可能会出现 CPU 使用率高达 100% 的情况,这种情况可能是由于多种原因导致的。下面将从几个方面对此进行分析和排查。 1. Max degree of Parallelism 设置...

    SQLSERVER排查CPU占用高的情况

    因此,掌握如何有效排查与解决 SQL Server CPU 使用率过高的问题,对于 DBA(数据库管理员)以及开发人员来说非常重要。 #### 硬件环境 在本案例中,我们面对的是一台 Windows 2008 R2 操作系统的服务器,配置为 64...

    Spotlight on SQL Server

    3. **Spotlight on SQL Server特性**:这款工具可能提供了实时性能监控,包括CPU使用率、内存消耗、磁盘I/O等关键指标;可能有报警机制,当数据库出现异常时自动通知管理员;还可能有性能分析工具,帮助找出影响性能...

    sql server健康检查脚本

    SQL Server健康检查脚本通常包含一系列查询,这些查询旨在收集关于服务器状态的关键信息,包括但不限于CPU使用率、内存使用情况、磁盘I/O性能、数据库事务日志的增长、备份状况、索引碎片、锁和阻塞等。通过执行这些...

    sql server数据库查看器

    8. **性能监控**:部分工具会集成性能监视器,实时展示SQL Server的性能指标,如CPU使用率、内存使用、磁盘I/O等,帮助诊断和优化性能问题。 9. **报表生成**:有的数据库查看器能自动生成报表,展示数据库统计信息...

    SQL Server 巡检报告v1.0(word).doc.rar

    在这一部分,我们可以学习如何收集并分析关键性能指标,如CPU使用率、内存占用、磁盘I/O以及数据库的增长趋势等。这些数据对于识别潜在问题和优化数据库性能至关重要。 其次,巡检脚本部分提供了执行具体检查任务的...

    安装 sqlserver com+解决方法

    - 监控系统性能指标,例如CPU使用率、内存占用情况等。 - 调整MSDTC的配置参数以优化事务处理效率。 - 对SQL Server和COM+组件进行性能调优,减少不必要的延迟。 ### 四、最佳实践 - 在部署前进行充分的测试,确保...

    sqlserver2000的辅助工具 sqltools

    8. 性能监控:提供性能监视工具,能够实时监控数据库的CPU使用率、内存占用、I/O活动等,帮助优化数据库性能。 9. 数据对比与同步:SQLTools具备数据对比功能,可以比较两个数据库或表之间的差异,并进行数据同步,...

    [ODBC_SQL_Server_Driver_]超时已过期的解决过程和方法

    2. **优化数据库服务器配置**:检查SQL Server服务器的性能监控指标,如CPU使用率、内存使用情况等,避免因服务器资源紧张导致的响应延迟。 3. **修改ODBC连接配置**: - 使用服务器名称而非IP地址建立ODBC连接,...

    sql server在线管理工具

    6. **性能监控**:监控SQL Server性能是必要的,包括查看CPU使用率、内存使用、磁盘I/O等,这可以通过SQL Server的动态管理视图(DMVs)实现。 7. **安全设置**:管理角色、权限和登录账户是重要的,工具应提供修改...

    SQLserver全局变量

    6. `@@CPU_BUSY`:表示自SQL Server启动以来CPU的忙碌时间(以毫秒为单位),有助于监控系统资源使用。 7. `@@DBTS`(tempdb数据库特有):返回当前数据库的timestamp值,用于确保数据唯一性。 8. `@@IDLE`:返回...

    sql server 全局变量

    ### SQL Server 全局变量详解 #### 概述 在SQL Server中,全局变量是由系统预定义的一类特殊变量,用于返回系统级别的信息。这些变量的名称以双@(@@)开头,用户不能创建或修改这类变量。全局变量提供了一种有效...

    SQLServer巡检报告-模板

    - **CPU使用情况**:CPU使用率低于3%,说明CPU资源较为充足,没有出现过载的情况。 - **其他性能指标**:包括了查询计划的编译和重编译次数等,这些指标均显示正常,表明数据库运行平稳,没有出现性能下降或频繁的...

    Microsoft SQL Server 2005技术内幕:查询、调整和优化

    - **持续监控**:使用工具如SQL Server Profiler或系统视图等,持续监控系统的运行状态。 - **检测与隔离**:当发现性能下降时,使用跟踪和性能分析等工具来定位具体的问题所在。 **四、跟踪和性能分析** - **...

    监控SQL_Server_2005状态

    1. **CPU 使用率**:过高可能导致系统响应变慢。 2. **内存使用**:检查 SQL Server 是否有足够的内存执行查询。 3. **磁盘 I/O**:过高可能指示存储瓶颈。 4. **连接数**:过多连接可能消耗大量资源。 5. **锁和...

    SQL-server作业指导书.doc

    SQL Server作业指导书是针对使用Microsoft SQL Server进行数据库管理和安全维护的一个重要文档,它涵盖了多个关键领域的检查和最佳实践。以下是对指导书中提及的一些主要知识点的详细解释: 1. **数据库系统应用...

    WEB方式的SqlServer企业管理器源代码

    6. **性能监控**:通过Web界面提供数据库性能的实时监控和历史统计,可能包括查询执行时间、CPU使用率、内存使用、磁盘I/O等指标。 7. **备份与恢复**:源代码可能包含了数据库备份和恢复的逻辑,支持计划备份,以...

    SQLServer 性能检测收集工具

    这个工具集合了一系列脚本和实用程序,能够收集系统和数据库层面的全面信息,包括但不限于CPU利用率、内存消耗、I/O活动、查询执行计划、阻塞情况等关键指标。 `sp_code_runner.SQL` 和 `sp_trace80.SQL` 是SQL ...

    SQL Monitor中文版

    1. **实时监控**:SQL Monitor可以实时显示SQL Server的性能指标,如CPU使用率、内存消耗、磁盘I/O等,帮助管理员快速识别性能瓶颈。 2. **健康检查**:工具会定期进行健康检查,评估SQL Server的整体运行状况,...

Global site tag (gtag.js) - Google Analytics