内容简介
本书共15章,分为三部分,第一部分(第1-2章)为概述部分,阐述SQLServer方面的“性能”及相关概念。并给出常规的性能及性能相关的问题侦测的“方法论”,读者可以通过这两章的介绍,对SQLServer性能问题有一个高层次的认识。第二部分(第3-10章)为知识准备部分,这部分介绍了SQLServer性能相关的基础知识。只有了解了性能及影响性能的相关部分,才能准确地、地进行优化。第三部分(第11-15章)为工具使用及优化演示,在多服务器、大数据的环境下,不应该再使用原始的故障侦测方法,借用各种工具能更全面、更地找到问题并且解决问题。
目录
目 录
前 言
第一部分 SQL Server性能优化概述
第1章 性能概述 2
1.1 何为性能 2
1.2 性能指标 3
1.3 性能目标 3
1.4 影响性能的常见因素 4
1.4.1 应用程序的体系结构 4
1.4.2 应用程序设计 5
1.4.3 事务和隔离级别 5
1.4.4 T-SQL代码 5
1.4.5 硬件资源 6
1.4.6 SQL Server配置 6
1.5 小结 8
第2章 初探优化 9
2.1 优化论 9
2.2 定义问题 10
2.2.1 使用工具找到性能瓶颈 12
2.2.2 通过性能数据进行分类 12
2.3 根据性能数据分析问题 14
2.4 验证处理手段及部署 14
2.5 问题归档 15
2.6 小结 15
第二部分 SQL Server性能优化理论知识
第3章 体系结构 18
3.1 SQL Server查询体系 18
3.2 数据库事务 22
3.2.1 事务特性 22
3.2.2 事务类型 22
3.3 查询的生命周期 23
3.3.1 SQL Server组件 23
3.3.2 缓冲池 23
3.3.3 简单的SELECT查询过程 23
3.4 执行模型 28
3.5 SQLOS 30
3.6 SQL Server 内存 30
3.6.1 物理内存和虚拟内存 30
3.6.2 SQL Server 内存 32
3.6.3 内存问题诊断 34
3.6.4 优化SQL Server内存配置 34
3.6.5 优化Ad-Hoc 工作负载 36
3.7 小结 38
第4章 硬件资源 39
4.1 CPU 39
4.1.1 SQL Server工作负载类型 39
4.1.2 CPU评估 40
4.1.3 CPU配置 43
4.2 存储系统 43
4.2.1 磁盘I/O 43
4.2.2 驱动器类型 44
4.2.3 RAID配置 45
4.2.4 配置存储系统 46
4.2.5 检查读写速率 46
4.3 CPU 性能侦测 48
4.3.1 侦测CPU压力 48
4.3.2 研究CPU相关的等待信息 49
4.3.3 查找CPU消耗高的查询 50
4.3.4 常见高CPU利用率的原因 51
4.4 I/O性能侦测 59
4.5 小结 59
第5章 查询优化器 60
5.1 查询过程 60
5.2 查询优化器 62
5.2.1 产生执行计划 62
5.2.2 连接 63
5.3 执行引擎 66
5.3.1 数据访问操作 66
5.3.2 聚合操作 70
5.3.3 并行执行 73
5.4 统计信息和开销预估 73
5.4.1 统计信息 73
5.4.2 统计信息维护 77
5.4.3 计算列上的统计信息 78
5.4.4 过滤索引上的统计信息 79
5.4.5 预估数量错误 81
5.4.6 更新统计信息 81
5.5 优化器工作过程 83
5.6 小结 88
第6章 索引及统计信息 89
6.1 索引基础 90
6.1.1 为什么要索引 90
6.1.2 索引的主要类型 91
6.1.3 索引元数据 91
6.2 索引存储基础 92
6.2.1 SQL Server存储基础 92
6.2.2 页的组织 95
6.2.3 检查工具 98
6.2.4 页碎片 110
6.3 索引统计信息 113
6.3.1 索引层级的统计信息 113
6.3.2 索引使用的统计信息 117
6.3.3 索引操作的统计信息 120
6.3.4 索引物理统计信息 126
6.4 索引误区及使用建议 127
6.4.1 常见误区 127
6.
摘要与插图
第一部分SQL Server 性能优化概述
本部分包含两章,主要介绍何为性能及相关的一些术语,因为只有了解什么是性能,才能开始进一步的学习。如果读者对此已经有了一定的基础和经验,可以跳过这部分,从第3章开始看起。但是基于连贯性,建议读者抽空看看这部分的内容。
第1章
性 能 概 述
在工作、论坛、博客及一些QQ群中,很多人总会问:怎样进行SQL Server性能优化?这个问题很难回答,一个千余人参与、发展了十几年的产品,其所涉及的性能优化并不是三言两语就可以说清楚的。想要熟练掌握该技能,需要系统地了解相关知识,而本书的主要目的就是帮助读者全面深入地把握知识结构。书中会告诉读者从哪里着手,优化的前提有哪些。但是,本书不是写给那些没有任何基础,连一个相对简单的查询语句都不会,或者连SSMS(SQL Server Management Studio)都不知道怎么打开的人看的。如果你是这样的人,建议你先看其他入门书籍。
本章先会对全书进行一个简单概述,帮助读者了解一些与性能相关的知识。因为在处理性能问题之前,我们先要知道,什么是性能问题。
1.1 何为性能
想要进行性能优化,先必须要了解性能问题,也就是说,码要对性能问题有一个较为明确的定义。试想,你生病了,去看医生,一到医院,你就对医生说:医生,我很不舒服,赶紧给我开药。医生连你哪里不舒服、怎么不舒服都不知道,凭什么开药呢?所以我们先要知道面临的是什么问题,才能找到相应的对策。
作为DBA,经常会被程序员、公司管理层问道:为什么数据库运行那么慢?如果你进一步询问他们慢到什么程度,有什么表征时,得到的答案往往又很模糊,可能只有慢或者卡。
所以在处理性能问题时,先要对其有一个清晰的定义,不然会浪费很多时间去查找问题的所在。但是作为非专业人员,的确很难清晰定义所有的问题。为此,不妨来对性能问题下一个非官方的定义:
在现有资源没有达到吞吐量的前提下,若系统(包括操作系统、数据库管理系统、应用程序等)不能满足合理的预期表现,则可以定义为有性能问题。
注意上面的限定词——合理。你不应该对所有的应用和操作都赋予很高的期望,比如,对于OLAP系统,它的某些操作往往需要大量时间和资源(比如ETL),你不要期望它总是能在几秒内完成。当然,如果时间过长,也是可以定义为存在性能问题的。
另外,可以考虑一些非正式的定义,比如资源耗费明显过多、运行速度的下降超过规划速度等。
总之,在处理性能问题之前,尽可能给出清晰准确的定义,可以提高问题的解决效率。要分清什么是性能问题,什么不是性能问题(比如权限、某些硬件故障、某些程序bug),因为不同的问题对应的解决方案往往是不同的,所以先应该对性能问题给出定义。
1.2 性能指标
定义性能问题时往往可以有很多指标,其中见、要的指标有3个:响应时间、吞吐量、可扩展性。响应时间这个指标其实很明显,一个查询运行得快,性能问题通常很少,但如果某个查询的运行时间明显过长,那就说明可能有一定的性能问题了,需要引起注意。终端用户基本上只会关心他/她的请求是否能足够快地得到响应,所以他们的“性能”汇报往往只是告诉你它很“慢”,而这个“慢”其实指的就是响应时间。吞吐量可以理解为网络、设备、端口、虚电路或其他设备单位时间内成功地传送数据的数量,也可以理解为资源的使用情况。比如磁盘,每秒的吞吐量越大,传输的数据就越多,SQL Server在向磁盘读写数据时延时就越短。可扩展性表示在遇到性能问题时,是否可以通过简单的增加资源的方法来解决问题。
对于性能指标,并没有一个固定值或者建议值,通常在