新書推薦:
《
唐宋绘画史 全彩插图版
》
售價:HK$
101.2
《
“御容”与真相:近代中国视觉文化转型(1840-1920)
》
售價:HK$
113.9
《
海洋、岛屿和革命:当南方遭遇帝国(文明的另一种声音)
》
售價:HK$
109.3
《
铝合金先进成型技术
》
售價:HK$
273.7
《
英雄之旅:把人生活成一个好故事
》
售價:HK$
89.7
《
分析性一体的涌现:进入精神分析的核心
》
售價:HK$
125.4
《
火枪与账簿:早期经济全球化时代的中国与东亚世界
》
售價:HK$
79.4
《
《全面与进步跨太平洋伙伴关系协定》国有企业条款研究
》
售價:HK$
101.2
編輯推薦:
1. 深入剖析SQL Server的优化与管理机制及核心技术,从“方法论”的角度指导读者定位和解决问题,以独特视角展示SQL Server管理之道。
2.
收录了与SQL Server性能优化相关的各类问题和工作中的“雷区”并给出了解决方法,包含大量技巧和最佳实践。
內容簡介:
本书共15章,分为三部分,第一部分(第1-2章)为概述部分,阐述SQLServer方面的“性能”及相关概念。并给出常规的性能及性能相关的问题侦测的“方法论”,读者可以通过这两章的介绍,对SQLServer性能问题有一个高层次的认识。第二部分(第3-10章)为知识准备部分,这部分介绍了SQLServer性能相关的基础知识。只有了解了性能及影响性能的相关部分,才能准确地、高效地进行优化。第三部分(第11-15章)为工具使用及优化演示,在多服务器、大数据的环境下,不应该再使用原始的故障侦测方法,借用各种工具能更全面、更高效地找到问题并且解决问题。
關於作者:
黄钊吉 数据平台架构师,从事数据库管理、优化及平台搭建工作,获得MCITP 2008 DBA认证、MCSE DATA Platform 认证,CSDN论坛SQL
Server 大版主、博客专家,2013年至2014年连续两年被评为SQL Server
MVP。曾参与服饰类电子商务网站、银行系统的开发管理工作及ERP系统、欧洲信用卡平台系统(基于亚马逊云服务,AWS)的数据库管理及平台架构工作。
目錄 :
目 录
前 言
第一部分 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 磁盘IO 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 IO性能侦测 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.4.2 索引使用建议 135
6.4.3 关于索引的查询建议 137
6.5 索引维护 143
6.5.1 索引碎片 143
6.5.2 索引统计信息维护 155
6.6 索引工具 156
6.6.1 缺失索引DMO 156
6.6.2 使用DMO 158
6.6.3 数据库引擎优化顾问 159
6.6.4 使用DMO侦测索引问题 162
6.7 索引策略 165
6.7.1 堆 165
6.7.2 聚集索引 167
6.7.3 非聚集索引 168
6.7.4 索引存储 182
6.7.5 索引视图 185
6.8 索引分析 187
6.8.1 索引方法论 187
6.8.2 监控 188
6.8.3 分析 199
6.8.4 实施 212
6.8.5 重复 213
6.9 案例 213
6.10 小结 215
第7章 等待 216
7.1 等待简介 217
7.1.1 什么是等待 217
7.1.2 为什么需要等待信息 218
7.1.3 保存等待信息 218
7.2 查询等待 219
7.3 并行执行 219
7.3.1 CXPACKET 220
7.3.2 CXPACKET潜在问题 221
7.3.3 降低CXPACKET等待 221
7.3.4 CXPACKET深度分析 222
7.3.5 CXPACKET建议 222
7.4 多任务等待 223
7.4.1 SOS_SCHEDU-LER_YIELD 223
7.4.2 多任务类型 225
7.4.3 多任务潜在问题 226
7.4.4 降低多任务等待 226
7.5 IO 等待 227
7.6 备份和还原等待 231
7.7 锁定等待 231
7.8 数据库日志等待 233
7.9 外部资源等待 235
7.10 其他常见的等待类型 237
7.11 小结 238
第8章 执行计划 239
8.1 基础知识 239
8.1.1 查询提交 240
8.1.2 预估与实际执行计划 241
8.1.3 执行计划重用 242
8.1.4 清除缓存的执行计划 243
8.1.5 执行计划格式 243
8.1.6 使用DMO获取缓存中的执行计划 243
8.1.7 使用SQL Trace自动获取执行计划 244
8.2 图形化执行计划 244
8.2.1 基础知识 245
8.2.2 单表查询 245
8.2.3 表关联 252
8.2.4 筛选数据 256
8.2.5 常见操作符 258
8.2.6 INSERTUPDATEDELETE的执行计划 261
8.2.7 复杂查询 264
8.3 控制执行计划 280
8.3.1 查询提示 281
8.3.2 联接提示 293
8.3.3 表提示 297
8.4 扩展信息 298
8.4.1 阅读庞大的执行计划 298
8.4.2 并行操作 305
8.4.3 强制参数化 306
8.4.4 使用计划指南 307
8.5 案例 313
8.6 小结 316
第9章 锁、阻塞和死锁 317
9.1 并发和事务 318
9.1.1 悲观并发和乐观并发 319
9.1.2 事务 320
9.1.3 丢失更新 325
9.2 锁的基础 327
9.2.1 锁定概述 327
9.2.2 锁资源锁类型 328
9.2.3 锁模式 329
9.2.4 锁的持续时间 330
9.2.5 锁的所有权 330
9.2.6 锁的元数据 331
9.3 高级锁概念 332
9.3.1 锁兼容性 332
9.3.2 锁模式转换 333
9.3.3 意向锁 335
9.3.4 键范围锁 335
9.3.5 锁升级 336
9.3.6 其他类型的锁 338
9.3.7 非锁定引起的阻塞 339
9.4 控制锁行为 339
9.4.1 通过隔离级别控制并发性和锁定行为 340
9.4.2 设定锁的超时时间 340
9.4.3 锁提示 341
9.5 悲观并发的故障侦测 341
9.5.1 侦测锁定 341
9.5.2 阻塞的故障排查 344
9.6 乐观并发 348
9.6.1 行版本存储 349
9.6.2 行版本存储工作机制 349
9.6.3 基于快照的隔离模式 349
9.6.4 监控和管理版本存储 350
9.6.5 管理版本存储 351
9.6.6 选择并发模式 353
9.7 死锁 354
9.7.1 死锁类型 354
9.7.2 自动死锁侦测 356
9.7.3 捕获死锁 356
9.7.4 读懂死锁图 363
9.7.5 最小化死锁 364
9.8 监控和处理 366
9.8.1 使用DMV捕获阻塞信息 366
9.8.2 使用Extended Events和blocked_process_report事件捕获 368
9.8.3 阻塞问题解决方案 368
9.8.4 建议 369
9.9 小结 371
第10章 TempDB 372
10.1 TempDB简介 372
10.1.1 TempDB是什么 372
10.1.2 什么操作会用到TempDB 373
10.2 TempDB上的常见问题及监控 378
10.2.1 空间问题 378
10.2.2 TempDB的IO瓶颈 382
10.2.3 过多的DDL操作导致系统表上的瓶颈 383
10.3 优化TempDB 383
10.3.1 配置TempDB 384
10.3.2 优化TempDB 385
10.3.3 扩充阅读 386
10.4 小结 386
第三部分 工具使用
第11章 使用传统工具定位瓶颈 388
11.1 使用性能监视器及PAL收集和分析性能 389
11.1.1 性能监视器 389
11.1.2 数据收集器集 392
11.1.3 使用PAL分析 403
11.2 使用DMO获取性能数据 407
11.2.1 DMO介绍 407
11.2.2 示例 407
11.3 使用Profiler获取性能数据 414
11.3.1 用法及注意事项 414
11.3.2 Profiler示例 416
11.3.3 SQL Trace示例 419
11.4 DBCC命令 422
11.4.1 DBCC SQLPERF 422
11.4.2 DBCC INPUTBUFFER 424
11.4.3 DBCC TRACEONTRACEOFF 425
11.4.4 DBCC SHOWCONTIG 425
11.4.5 DBCC OPENTRAN 426
11.5 小结 427
第12章 使用新工具定位瓶颈 428
12.1?PSSDIAG 428
12.2 PowerShell 434
12.2.1 简介 434
12.2.2 打开PowerShell 434
12.2.3 使用PowerShell侦测服务器问题 435
12.3 小结 438
第13章 Extended Events 439
13.1 简介 439
13.2 创建扩展事件 444
13.3 查询收集的数据 449
13.3.1 监视实时数据 449
13.3.2 使用T-SQL查看 451
13.4 案例 452
13.5 小结 458
第14章 其他工具 459
14.1 SQLDiag 459
14.2 数据库性能优化顾问 462
14.2.1 使用DTA进行单查询分析 462
14.2.2 使用DTA进行全库分析 466
14.3 Windows事件日志及
SQL Server Errorlog 470
14.3.1 Windows事件日志 470
14.3.2 SQL Server 错误日志 471
14.4 小结 472
第15章 优化服务器配置 473
15.1 数据库工作负载特点 473
15.1.1 基础知识 473
15.1.2 工作负载配置 474
15.2 工作负载优化步骤 477
15.2.1 数据库设计 477
15.2.2 查询设计 478
15.2.3 数据库服务器配置 478
15.2.4 数据库管理 479
15.2.5 数据库备份 480
15.3 小结 481
內容試閱 :
第一部分
SQL Server 性能优化概述
本部分包含两章,主要介绍何为性能及相关的一些术语,因为只有了解什么是性能,才能开始进一步的学习。如果读者对此已经有了一定的基础和经验,可以跳过这部分,从第3章开始看起。但是基于连贯性,建议读者抽空看看这部分的内容。
第1章
性 能 概 述
在工作、论坛、博客及一些QQ群中,很多人总会问:怎样进行SQL Server性能优化?这个问题很难回答,一个千余人参与、发展了十几年的产品,其所涉及的性能优化并不是三言两语就可以说清楚的。想要熟练掌握该技能,需要系统地了解相关知识,而本书的主要目的就是帮助读者全面深入地把握知识结构。书中会告诉读者从哪里着手,优化的前提有哪些。但是,本书不是写给那些没有任何基础,连一个相对简单的查询语句都不会,或者连SSMS(SQL Server Management Studio)都不知道怎么打开的人看的。如果你是这样的人,建议你先看其他入门书籍。
本章首先会对全书进行一个简单概述,帮助读者了解一些与性能相关的知识。因为在处理性能问题之前,我们首先要知道,什么是性能问题。
1.1 何为性能
想要进行性能优化,首先必须要了解性能问题,也就是说,最起码要对性能问题有一个较为明确的定义。试想,你生病了,去看医生,一到医院,你就对医生说:医生,我很不舒服,赶紧给我开药。医生连你哪里不舒服、怎么不舒服都不知道,凭什么开药呢?所以我们首先要知道面临的是什么问题,才能找到相应的对策。
作为DBA,经常会被程序员、公司管理层问道:为什么数据库运行那么慢?如果你进一步询问他们慢到什么程度,有什么表征时,得到的答案往往又很模糊,可能只有慢或者卡。
所以在处理性能问题时,首先要对其有一个清晰的定义,不然会浪费很多时间去查找问题的所在。但是作为非专业人员,的确很难清晰定义所有的问题。为此,不妨来对性能问题下一个非官方的定义:
在现有资源没有达到最大吞吐量的前提下,若系统(包括操作系统、数据库管理系统、应用程序等)不能满足合理的预期表现,则可以定义为有性能问题。
注意上面的限定词——合理。你不应该对所有的应用和操作都赋予很高的期望,比如,对于OLAP系统,它的某些操作往往需要大量时间和资源(比如ETL),你不要期望它总是能在几秒内完成。当然,如果时间过长,也是可以定义为存在性能问题的。
另外,可以考虑一些非正式的定义,比如资源耗费明显过多、运行速度的下降超过规划速度等。
总之,在处理性能问题之前,尽可能给出清晰准确的定义,可以提高问题的解决效率。要分清什么是性能问题,什么不是性能问题(比如权限、某些硬件故障、某些程序bug),因为不同的问题对应的解决方案往往是不同的,所以首先应该对性能问题给出定义。
1.2 性能指标
定义性能问题时往往可以有很多指标,其中最常见、最重要的指标有3个:响应时间、吞吐量、可扩展性。响应时间这个指标其实很明显,一个查询运行得快,性能问题通常很少,但如果某个查询的运行时间明显过长,那就说明可能有一定的性能问题了,需要引起注意。终端用户基本上只会关心他她的请求是否能足够快地得到响应,所以他们的“性能”汇报往往只是告诉你它很“慢”,而这个“慢”其实指的就是响应时间。吞吐量可以理解为网络、设备、端口、虚电路或其他设备单位时间内成功地传送数据的数量,也可以理解为资源的使用情况。比如磁盘,每秒的吞吐量越大,传输的数据就越多,SQL Server在向磁盘读写数据时延时就越短。可扩展性表示在遇到性能问题时,是否可以通过简单的增加资源的方法来解决问题。
对于性能指标,并没有一个固定值或者建议值,通常在要定义工作负荷(也叫做性能基线,将在后面章节中介绍)之后,通过监控及对比来把握。对于性能问题或者管理问题,常规的做法是先进行监控,然后分析监控数据,再根据分析结果进行处理,最后再次监控,一直如此循环往复,直到满意为止。
1.3 性能目标
打个比方,笔者比较崇尚中医的治疗方法,他们所采用的“望闻问切”诊断方法对准确掌握病人的病情很有帮助。记得有人说过,DBA很多方面就像中医,在面对性能问题的时候,使用这种中医的诊断思维去处理会事半功倍。其实就是通过多方面检测,找到性能问题的根源和一些潜在风险。中医的一个思想是通过调理人体自身机能去抵抗外部的入侵,旨在把人体调整到一个“平衡”状态,而不是像西医那样直接杀死染病细胞或者病毒。个人认为,优化性能的目的也是把系统调整到平衡状态,要把事情做到极致,但是不要极端。比如,不要花几个小时的时间,去尝试优化一个已经在1~5s内能得到结果的查询。
对于SQL Server的优化,一个比较通用的目标就是:尽可能最小化每个SQL语句(或者请求)的响应时间并增加系统的吞吐量,通过减少网络延时、优化磁盘IO吞吐量以及减少CPU的处理时间来最大化整个数据库服务器的伸缩性,使系统能够协调运作。
简而言之,性能优化的目标就是通过一系列的手段,使系统能够协调、平衡地运作,合理地响应外部及内部请求,实现资源利用的最大化。