第Ⅰ部分 内核 3
第1章 SQL Server体系结构 3
1.1 简介 3
1.2 数据库事务 4
1.2.1 ACID属性 4
1.2.2 SQLServer事务 5
1.3 一个查询的生命周期 5
1.3.1 关系引擎和存储引擎 6
1.3.2 缓冲池 6
1.3.3 一个基本的Select查询 7
1.3.4 一个简单的更新查询 15
1.3.5 恢复 17
1.4 SQL Server的执行模式和SQLOS 21
1.4.1 执行模式 22
1.4.2 SQLOS 24
1.5 本章小结 25
第2章 硬件揭秘 27
2.1 硬件的重要性 27
2.2 工作负荷如何影响硬件及存储考虑事项 28
2.2.1 工作负荷的类型 28
2.2.2 服务器选型 30
2.2.3 服务器型号的演变 30
2.3 处理器厂商的选择 32
2.3.1 Intel处理器 33
2.3.2 AMD处理器及编号 41
2.4 为冗余选择及配置硬件 43
2.5 硬件比较工具 45
2.5.1 TPC-E基准 45
2.5.2 Geekbench基准测试 47
2.6 本章小结 47
第3章 理解内存 49
3.1 简介 49
3.2 物理内存和虚拟内存 50
3.2.1 物理内存 50
3.2.2 最大支持的物理内存 51
3.2.3 虚拟内存 51
3.2.4 NUMA 55
3.3 SQL Server内存 59
3.3.1 内存节点 60
3.3.2 内存分配员、缓存和缓冲池 60
3.4 优化SQL Server内存配置 66
3.4.1 最小服务器内存和最大服务器内存 66
3.4.2 锁定内存页 68
3.4.3 即席式工作负荷优化 70
3.5 本章小结 72
第4章 存储系统 73
4.1 简介 73
4.2 SQL Server I/O 74
4.3 存储技术 74
4.3.1 SQLServer和Windows I/O子系统 78
4.3.2 选择合适的存储网络 80
4.3.3 共享存储阵列 82
4.3.4 容量优化 82
4.3.5 分层存储 84
4.3.6 数据复制 85
4.3.7 远程数据复制 88
4.3.8 Windows故障转移群集 89
4.3.9 SQL Server AlwaysOn可用性组 90
4.3.1 0风险缓解计划 91
4.4 测量性能 91
4.4.1 存储性能计数器 92
4.4.2 磁盘驱动器性能 93
4.4.3 顺序磁盘访问 96
4.4.4 服务器队列 97
4.4.5 文件布局 97
4.4.6 分区对齐 99
4.4.7 NTFS分配单元大小 99
4.4.8 闪存 100
4.4.9 存储性能测试 101
4.5 本章小结 105
第5章 查询处理和执行 107
5.1 简介 107
5.2 查询处理 108
5.2.1 分析 108
5.2.2 Algebrize 108
5.3 查询优化 109
5.3.1 并行计划 110
5.3.2 Algebrizer树 111
5.3.3 sql_handle和plan_handle 111
5.3.4 理解统计信息 111
5.3.5 计划缓存和重编译 113
5.3.6 影响优化 119
5.4 查询计划 125
5.4.1 查询计划操作符 128
5.4.2 读取查询计划 131
5.5 执行查询 135
5.6 本章小结 143
第6章 锁和并发 145
6.1 简介 145
6.2 事务 146
6.2.1 A是原子性 146
6.2.2 C是一致性 147
6.2.3 I是隔离性 147
6.2.4 D是持久性 147
6.3 数据库事务 147
6.3.1 原子性 147
6.3.2 一致性 147
6.3.3 隔离性 148
6.3.4 持久性 148
6.4 并发的危险 149
6.4.1 丢失更新 149
6.4.2 脏读 151
6.4.3 不可重复读 152
6.4.4 幻影读 154
6.4.5 重复读 157
6.4.6 Halloween效应 158
6.5 锁 159
6.5.1 监视锁 159
6.5.2 锁资源 161
6.5.3 锁模式 163
6.5.4 兼容性表 169
6.6 锁升级 170
6.7 死锁 171
6.8 隔离级别 171
6.8.1 可序列化 172
6.8.2 可重复读 173
6.8.3 已提交读 173
6.8.4 未提交读和NOLOCK 174
6.8.5 快照 174
6.8.6 已提交读快照 174
6.9 本章小结 175
第7章 闩锁和自旋锁 177
7.1 简介 177
7.2 症状 178
7.2.1 识别症状 178
7.2.2 检测闩锁争用 179
7.2.3 检测自旋锁争用 180
7.2.4 争用指示器 181
7.3 易受影响的系统 182
7.4 了解闩锁和自旋锁 182
7.4.1 定义 182
7.4.2 闩锁示例 183
7.5 闩锁类型 190
7.6 闩锁模式 190
7.6.1 NL 191
7.6.2 KP 191
7.6.3 SH 191
7.6.4 UP 191
7.6.5 EX 191
7.6.6 DT 191
7.6.7 闩锁兼容性 192
7.6.8 授权顺序 192
7.6.9 闩锁等待 193
7.7 超闩锁和子闩锁 194
7.8 监控闩锁和自旋锁 195
7.8.1 动态管理视图 195
7.8.2 性能监视器 196
7.8.3 扩展事件 198
7.9 闩锁争用示例 199
7.9.1 当聚集索引键是ID字段时的插入操作 199
7.9.2 队列 200
7.9.3 tempdb中的更新闩锁 203
7.9.4 名称解析中的自旋锁争用 204
7.1 0本章小结 205
第8章 了解tempdb数据库 207
8.1 简介 207
8.2 概述和使用 208
8.2.1 用户临时对象 208
8.2.2 内部临时对象 213
8.2.3 版本存储区 213
8.3 常见故障排除 217
8.3.1 闩锁争用 217
8.3.2 监视tempdb的I/O性能 226
8.3.3 空间问题故障排除 228
8.4 配置最佳实践 229
8.4.1 tempdb的文件布局 229
8.4.2 tempdb的初始大小和自动增长 231
8.4.3 配置多个tempdb数据文件 234
8.5 本章小结 234
第Ⅱ部分 故障排除工具和实战经验 239
第9章 故障排除方法论和实践 239
9.1 简介 239
9.2 处理问题 240
9.2.1 成功排除故障的十个步骤 240
9.2.2 行为和态度 242
9.2.3 成功标准 242
9.2.4 与利益相关者打交道 243
9.2.5 服务水平协议 244
9.2.6 聘请外界帮助 244
9.3 定义问题 245
9.3.1 识别问题的指导方针 245
9.3.2 隔离问题 246
9.3.3 性能瓶颈 247
9.4 数据收集 249
9.4.1 关注数据收集 250
9.4.2 了解数据收集过程 250
9.4.3 工具和实用工具 251
9.5 数据分析 252
9.6 验证和实施解决方案 253
9.6.1 验证变更 253
9.6.2 孤立地测试变更 254
9.6.3 实施解决方案 254
9.7 本章小结 254
第10章 通过PerfMon和PAL工具查看服务器性能 255
10.1 简介 255
10.2 性能监视器概述 256
10.2.1 可靠性和性能监视器 257
10.2.2 SQL Server 2012在PerfMon中新添的计数器 259
10.2.3 PerfMon入门 262
10.3 性能监视器使用进阶 271
10.3.1 瓶颈和SQL Server 272
10.3.2 规范性指南 273
10.3.3 等待统计信息分析 278
10.3.4 获得性能基准 278
10.4 日志性能分析 278
10.5 其他PerfMon日志分析工具 282
10.5.1 通过SQL Server分析PerfMon日志 282
10.5.2 结合PerfMon日志和SQL Profiler跟踪 282
10.5.3 使用Relog 283
10.5.4 使用LogMan 284
10.5.5 使用LogParser 285
10.6 本章小结 285
第11章 通过SQLdiag整合数据收集 287
11.1 数据收集的困境 287
11.2 数据收集的方法 288
11.3 熟悉SQLdiag 289
11.3.1 在快照模式下使用SQLdiag 290
11.3.2 作为一个命令行工具使用SQLdiag 291
11.3.3 作为一个服务使用SQLdiag 294
11.4 使用SQLdiag配置管理器 297
11.4.1 用Diag管理器配置SQLdiag数据收集 298
11.4.2 为SQLdiag配置添加跟踪过滤器 301
11.5 使用最佳实践 310
11.5.1 更好地收集长期数据 310
11.5.2 过滤噪音 311
11.5.3 用SQLdiag进行警报驱动的数据收集 314
11.6 本章小结 314
第12章 通过SQL Nexus整合一切 315
12.1 介绍SQLNexus 315
12.2 熟悉SQLNexus 316
12.2.1 先决条件 316
1 2.2.2 将数据加载到Nexus数据库中 318
12.2.3 分析聚合数据 321
12.3 自定义SQL Nexus 329
12.3.1 使用ReadTrace.exe 330
12.3.2 为SQL Nexus建立自定义报表 331
12.3.3 使用命令提示符运行SQL Nexus 331
12.3.4 在SQL Nexus数据库中创建自己的表格 331
12.3.5 编写自己的查询 333
12.3.6 OSTRESS可执行文件 334
12.4 解决常见问题 335
12.4.1 问题1 335
12.4.2 问题2 335
12.4.3 问题3 336
12.4.4 问题4 336
12.5 本章小结 337
第13章 使用扩展事件诊断SQL Server 2012 339
13.1 介绍扩展事件 339
13.2 熟悉扩展事件 340
13.3 使用扩展事件的原因 340
13.3.1 SQL Server路线图 341
13.3.2 图形工具 341
13.3.3 低影响 341
13.3.4 使用扩展事件的时机 342
13.4 扩展事件的含义 342
13.4.1 扩展事件名称的来源 343
13.4.2 扩展事件术语 343
13.5 在SQL Server 2012中创建扩展事件 352
13.5.1 介绍新会话窗体 352
13.5.2 监控服务器登录 356
13.5.3 用扩展事件监控页拆分 357
13.5.4 计算每个对象获得锁的次数 358
13.5.5 用T-SQL创建会话 360
13.6 查看由扩展事件捕获的数据 360
13.7 本章小结 366
第14章 使用PowerShell增强故障排除工具集 367
14.1 介绍PowerShell 367
14.2 熟悉PowerShell 368
14.2.1 PowerShell环境 369
14.2.2 基础知识—cmdlet、变量、高级函数和模块 371
14.2.3 远程工作 377
14.2.4 SQL Server 2012中的新功能 377
14.3 使用PowerShell来调查服务器问题 380
14.3.1 查询磁盘空间利用率 380
14.3.2 查询当前服务器活动 381
14.3.3 查询警告或者错误信息 383
14.3.4 查询服务器性能 383
14.4 主动使用PowerShell调试SQL Server性能 384
14.4.1 索引维护 384
14.4.2 管理备份的磁盘空间利用率 385
14.4.3 使用SMO提取DLL 385
14.4.4 计划脚本执行 391
14.5 本章小结 391
第15章 提供SQLServer健康检查 393
15.1 SQL Server健康检查的重要性 393
15.2 运行DMV和DMF查询 394
15.3 SQL Server Build 396
15.4 数据库级别的查询 414
15.5 本章小结 430
第16章 提供可管理性和性能 431
16.1 用SQL Server可管理性功能提高效率 431
16.2 SQLServer2012中的可管理性增强功能 432
16.3 基于策略的管理 432
16.4 其他管理SQL Server的微软工具 446
16.4.1 系统中心顾问 446
16.4.2 系统中心操作管理器 448
16.5 本章小结 451
第17章 在虚拟环境中运行SQL Server 453
17.1 向服务器虚拟化转变 453
17.2 虚拟化概述 454
17.2.1 虚拟化的历史 455
17.2.2 虚拟化的广度 455
17.2.3 平台虚拟化 456
17.2.4 云计算 457
17.3 为何要虚拟化服务器 457
17.3.1 商业利益 457
17.3.2 技术利益 458
17.3.3 封装 459
17.3.4 SQL Server 2012和虚拟化 459
17.3.5 虚拟化的局限性 460
17.4 常见的虚拟化产品 461
17.4.1 VMware 461
17.4.2 微软Hyper-V 462
17.4.3 Xen 463
17.4.4 对虚拟化的硬件支持 463
17.5 虚拟化概念 463
17.5.1 主机服务器 464
17.5.2 管理程序 464
1 7.5.3 虚拟服务器(或Guest服务器或者虚拟机) 465
17.6 虚拟化的扩展功能 466
17.6.1 快照 466
17.6.2 高可用性特性 467
17.6.3 在线迁移 467
17.6.4 高可用虚拟服务器 469
17.6.5 主机和Guest群集 470
17.6.6 使用虚拟化的高可用性特性部署SQLServer 470
17.7 管理争用 471
17.7.1 良性争用 471
17.7.2 恶性争用 471
17.7.3 按需分配内存 472
17.7.4 加权 473
17.8 确定虚拟化的候选者 474
17.8.1 指导原则 474
17.8.2 服务器的工作负荷 474
17.8.3 收集规模数据 475
17.8.4 规模工具 476
17.8.5 与性能无关的需求 476
17.9 为成功的虚拟数据库服务器设计架构 477
17.9.1 为虚拟数据库服务器与物理数据库服务器设计架构 477
17.9.2 虚拟数据库服务器设计 478
17.10 监视虚拟数据库服务器 485
17.11 本章小结 490