全书共15章,分为三部分,第一部分(第1~2章)为概述部分,阐述SQL Server方面的“性能”及相关概念。并给出常规的性能及性能相关的问题侦测的“方法论”,读者可以通过这两章的介绍,对SQL Server性能问题有一个高层次的认识。第二部分(第3~10章)为知识准备部分,这部分介绍了SQL Server性能相关的基础知识。只有了解了性能及影响性能的相关部分,才能准确地、高效地进行优化。第三部分(第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.4T-SQL代码5
- 1.4.5硬件资源6
- 1.4.6SQL 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.1SQL Server查询体系18
- 3.2数据库事务22
- 3.2.1事务特性22
- 3.2.2事务类型22
- 3.3查询的生命周期23
- 3.3.1SQL Server组件23
- 3.3.2缓冲池23
- 3.3.3简单的SELECT查询过程23
- 3.4执行模型28
- 3.5SQLOS30
- 3.6SQL Server 内存30
- 3.6.1物理内存和虚拟内存30
- 3.6.2SQL Server 内存32
- 3.6.3内存问题诊断34
- 3.6.4优化SQL Server内存配置34
- 3.6.5优化Ad-Hoc 工作负载36
- 3.7小结38
- 第4章硬件资源39
- 4.1CPU39
- 4.1.1SQL Server工作负载类型39
- 4.1.2CPU评估40
- 4.1.3CPU配置43
- 4.2存储系统43
- 4.2.1磁盘I/O43
- 4.2.2驱动器类型44
- 4.2.3RAID配置45
- 4.2.4配置存储系统46
- 4.2.5检查读写速率46
- 4.3CPU 性能侦测48
- 4.3.1侦测CPU压力48
- 4.3.2研究CPU相关的等待信息49
- 4.3.3查找CPU消耗高的查询50
- 4.3.4常见高CPU利用率的原因51
- 4.4I/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.1SQL 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缺失索引DMO156
- 6.6.2使用DMO158
- 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.1CXPACKET220
- 7.3.2CXPACKET潜在问题221
- 7.3.3降低CXPACKET等待221
- 7.3.4CXPACKET深度分析222
- 7.3.5CXPACKET建议222
- 7.4多任务等待223
- 7.4.1SOS_SCHEDU-LER_YIELD223
- 7.4.2多任务类型225
- 7.4.3多任务潜在问题226
- 7.4.4降低多任务等待226
- 7.5I/O 等待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.6INSERT/UPDATE/DELETE的执行计划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章TempDB372
- 10.1TempDB简介372
- 10.1.1TempDB是什么372
- 10.1.2什么操作会用到TempDB373
- 10.2TempDB上的常见问题及监控378
- 10.2.1空间问题378
- 10.2.2TempDB的I/O瓶颈382
- 10.2.3过多的DDL操作导致系统表上的瓶颈383
- 10.3优化TempDB383
- 10.3.1配置TempDB384
- 10.3.2优化TempDB385
- 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.1DMO介绍407
- 11.2.2示例407
- 11.3使用Profiler获取性能数据414
- 11.3.1用法及注意事项414
- 11.3.2Profiler示例416
- 11.3.3SQL Trace示例419
- 11.4DBCC命令422
- 11.4.1DBCC SQLPERF422
- 11.4.2DBCC INPUTBUFFER424
- 11.4.3DBCC TRACEON/TRACEOFF425
- 11.4.4DBCC SHOWCONTIG425
- 11.4.5DBCC OPENTRAN426
- 11.5小结427
- 第12章使用新工具定位瓶颈428
- 12.1 PSSDIAG428
- 12.2PowerShell434
- 12.2.1简介434
- 12.2.2打开PowerShell434
- 12.2.3使用PowerShell侦测服务器问题435
- 12.3小结438
- 第13章Extended Events439
- 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.1SQLDiag459
- 14.2数据库性能优化顾问462
- 14.2.1使用DTA进行单查询分析462
- 14.2.2使用DTA进行全库分析466
- 14.3Windows事件日志及
- SQL Server Errorlog470
- 14.3.1Windows事件日志470
- 14.3.2SQL 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