第1部分 在问题发生时寻找瓶颈 3
第1章 性能调校 3
1.1 艺术还是科学 3
1.2 性能调校的科学 4
1.2.1 问题陈述 4
1.2.2 处理计划 6
1.2.3 数据收集 6
1.2.4 数据分析 7
1.3 应用性能调校 7
1.3.1 实例1:应用的速度慢 7
1.3.2 实例2:存储过程X的速度慢 8
1.3.3 工具 10
1.3.4 预防措施 13
1.4 小结 14
第2章 使用System Monitor监视服务器资源 15
2.1 为什么可能会需要System Monitor 15
2.2 何时应当使用System Monitor 16
2.3 Performance Monitor概述 16
2.4 开始使用System Monitor 18
2.5 运行System Monitor的影响是什么 22
2.5.1 对监视的影响进行管理 22
2.5.2 在恰当的时间,以恰当的持续时间进行捕获 23
2.6 System Monitor将生成多少数据 23
2.7 资源利用 24
2.8 识别瓶颈 25
2.8.1 定位内存瓶颈 25
2.8.2 发现磁盘瓶颈 26
2.8.3 识别CPU瓶颈 28
2.9 主动使用System Monitor 29
2.10 在64位系统上运行System Monitor 29
2.11 合并System Monitor日志和SQL Profiler跟踪 30
2.12 监视远程服务器 31
2.13 System Monitor的最佳实践 31
2.13.1 获得一个基线 31
2.13.2 保留性能日志 32
2.13.3 模式和趋势 32
2.13.4 经受糟糕性能的服务器 32
2.13.5 调校性能 32
2.13.6 采取主动 32
2.14 System Monitor计数器不见了应当怎么办 33
2.15 内置日志管理工具 34
2.15.1 LogMan 34
2.15.2 Relog 35
2.16 分析日志数据 35
2.16.1 LogParser 35
2.16.2 Performance Analysis of Logs 36
2.17 小结 37
第3章 使用System Monitor监视SQL Server资源 39
3.1 开始 40
3.2 性能问题的类型 40
3.2.1 基于配置的性能问题 40
3.2.2 于模式的性能问题 41
3.3 瓶颈的类型 42
3.4 内存瓶颈 43
3.4.1 内存瓶颈的类型 43
3.4.2 确认内存瓶颈 44
3.4.3 基于配置的内存瓶颈 45
3.4.4 基于模式的内存瓶颈 46
3.5 CPU瓶颈 46
3.5.1 确认CPU瓶颈 46
3.5.2 基于配置的CPU瓶颈 47
3.5.3 基于模式的CPU瓶颈 48
3.6 磁盘瓶颈 49
3.6.1 确认磁盘瓶颈 49
3.6.2 基于配置的磁盘瓶颈 50
3.6.3 基于模式的磁盘瓶颈 53
3.7 监视数据库镜像性能 55
3.8 监视Wait Statistics 55
3.9 典型性能问题 56
3.9.1 典型磁盘问题 56
3.9.2 内存 57
3.9.3 典型CPU问题 57
3.10 使用SQL Server来分析性能日志 59
3.11 联合Performance Monitor日志和SQL ProFiler跟踪 63
3.12 小结 64
第4章 SQL Server等待类型 65
4.1 SQL Server等待 65
4.2 体系结构 66
4.3 常见的或值得注意的资源等待类型 67
4.4 如何追踪等待 68
4.4.1 sys.dm_exec-requests:只提供会话级信息 68
4.4.2 sys.dm_os_waiting_tasks:所有等待任务 69
4.4.3 sys.dm_os_wait_stats:根据等待类型聚集时间 69
4.4.4 DMVStats 70
4.4.5 Performance Dashboard 71
4.4.6 等待统计实战 71
4.5 加锁与阻塞 77
4.5.1 并发性 77
4.5.2 事务 78
4.5.3 隔离级别 79
4.5.4 锁和加锁 80
4.5.5 数据行版本控制 83
4.5.6 对死锁进行监视 84
4.5.7 对阻塞锁进行监视 87
4.6 小结 89
第5章 使用SQL ProFiler寻找问题查询 91
5.1 设置跟踪的准备工作 91
5.1.1 检测“问题”陈述是否完备 91
5.1.2 寻找相关已知问题 92
5.1.3 以SQL Trace的术语进行思考 92
5.1.4 SQL Trace选项及思考 96
5.2 捕获阻塞事件 102
5.3 捕获Showplan XML数据 105
5.4 捕获死锁图 107
5.5 使用SQL Profiler识别长时间运行的查询 112
5.5.1 模拟一个场景及示例数据库 112
5.5.2 分析问题 112
5.5.3 设置 113
5.5.4 进行跟踪 115
5.5.5 分析和调校 116
5.5.6 案例总结 119
5.6 使用Profiler生成服务器端跟踪代码跟踪高成本查询 119
5.6.1 使用Profiler生成服务器端跟踪脚本 119
5.6.2 执行服务器端脚本 123
5.6.3 管理跟踪文件并分析跟踪数据 123
5.6.4 服务器端跟踪代码演示 127
5.6.5 案例总结 133
5.7 将Profiler Trace同System Monitor性能计数器数据关联起来 133
5.8 小结 135
第Ⅱ部分 通过调校去除瓶颈 139
第6章 选择和配置硬件 139
6.1 服务器瓶颈 139
6.1.1 内存 139
6.1.2 I/O 140
6.1.3 CPU 140
6.2 配置服务器 140
6.2.1 内存 142
6.2.2 I/O 149
6.2.3 CPU 158
6.3 小结 166
第7章 调校SQL Server配置 167
7.1 调整服务器级设置之前的考虑 167
7.2 检查当前SQL Server设置 168
7.2.1 使用SQL Server Management Studio检查服务器设置 168
7.2.2 使用脚本检查服务器设置 169
7.2.3 检查Advanced Settings并修改它们的值 170
7.3 重要的服务器设置:CPU.内存和I/O 171
7.3.1 CPU 171
7.3.2 内存 177
7.3.3 网络I/O 178
7.4 小结 181
第8章 调校模式 183
8.1 数据质量 183
8.1.1 规范化 183
8.1.2 反规范化 189
8.1.3 定义列 191
8.1.4 存储过程 205
8.1.5 触发器 209
8.2 数据性能 212
8.2.1 页 212
8.2.2 分区 215
8.2.3 并发性与加锁(以及阻塞) 218
8.2.4 锁 220
8.2.5 索引 222
8.3 小结 227
第9章 调校T-SQL 229
9.1 开局:优化器的策略 229
9.1.1 基于成本的优化 230
9.1.2 读取索引统计 230
9.1.3 Include Actual Execution Plan的误解 232
9.1.4 使用sp_helpindex来检查索引 232
9.2 中局:收集事实 232
9.2.1 查询计划 232
9.2.2 查询计划的实质 234
9.2.3 从计划高速缓存中检索查询计划 250
9.2.4 缓冲池 251
9.3 终局:对T-SQL进行性能调校 257
9.3.1 主要工具 257
9.3.2 实例的必备索引 259
9.4 使用新的方法来调校T-SQL 259
9.4.1 NOTIN和NOTEXISTS重写已经成为过去 259
9.4.2 通过将谓词在计划中推进到更深的位置进行重写 260
9.4.3 为中间结果使用临时表 262
9.4.4 SELECT语句中的用户定义函数 263
9.4.5 改造SELECT 265
9.5 调校T-SQL谓词 269
9.5.1 去除特定隐式转换 269
9.5.2 使用可搜索参数 271
9.6 使用索引调校T-SQL 274
9.6.1 最小化书签查找 274
9.6.2 对结果进行排序 276
9.6.3 处理编入索引的可空列 277
9.6.4 消除重复 278
9.7 调校T-SQL常见模式或惯用语 280
9.7.1 单元素SELECT语句 280
9.7.2 聚集和CTE 283
9.7.3 派生表和相关子查询 286
9.7.4 分页和排序 290
9.8 使用提示调校T-SQL语句 296
9.9 调校死锁和阻塞 299
9.9.1 阻塞 299
9.9.2 死锁 299
9.9.3 预防措施 300
9.10 对查询计划进化进行模拟压力测试 303
9.11 小结 306
第Ⅲ部分 使用工具来采取主动措施并建立性能基线 309
第10章 使用SQL Profiler捕获、测量、重放工作负荷 309
10.1 为了重放对工作负荷进行捕获 309
10.1.1 为了重放对工作负荷进行刻画 309
10.1.2 满足工作负荷重放的要求 311
10.1.3 捕获工作负荷 313
10.1.4 为了特殊需要在跟踪表中修改工作负荷 314
10.2 测量工作负荷性能 317
10.2.1 工作负荷的初步分析 317
10.2.2 用于工作负荷重放的新的性能参考 321
10.3 重放工作负荷 323
10.3.1 为案例场景生成工作负荷 325
10.3.2 场景1:验证性能改进 326
10.3.3 场景2:在不同环境中重放工作负荷并测量总体响应时间 329
10.3.4 场景3:在目标服务器上重放多个工作负荷 332
10.4 小结 337
第11章 调校索引 339
11.1 示例数据库 339
11.2 第1部分:索引回顾 341
11.2.1 B树 341
11.2.2 填充因子 342
11.2.3 聚簇索引 342
11.2.4 堆 344
11.2.5 非聚簇索引 345
11.2.6 统计 346
11.2.7 加索引的视图 350
11.3 第2部分:用DTA进行调校 350
11.3.1 使用DTA调校个别的查询 351
11.3.2 用于更新的索引 360
11.3.3 增加更新索引后重新评定插入 372
11.3.4 索引过多 375
11.3.5 调校工作负荷 378
11.4 第3部分:索引维护 380
11.4.1 监视索引碎片 380
11.4.2 删除碎片 381
11.5 第4部分:分区的表和索引 383
11.5.1 使用分区的表和索引的理由 383
11.5.2 分区的先决条件 384
11.5.3 创建分区的表 384
11.6 小结 394
第12章 存储的速度及健壮性 395
12.1 性能测试、压力测试和实际性能 395
12.1.1 性能测试 395
12.1.2 压力测试 396
12.1.3 实际性能 396
12.1.4 汇总 397
12.2 存储性能 397
12.2.1 存储性能测量工具 397
12.2.2 希望测量什么 398
12.2.3 测量I/O性能 400
12.2.4 使用SQLIO 408
12.3 存储的可靠性 434
12.3.1 SQLIOSim 434
12.3.2 使用SQLIOSim 434
12.3.3 SQLIOSim测试持续时间的最佳实践 437
12.3.4 运行其他测试 438
12.3.5 从命令行运行SQLIOSim 446
12.3.6 解释来自SQLIOSim的结果 446
12.4 小结 449
第13章 SQL Server 2005Performance Dashboard Reports 451
13.1 可支持性 451
13.1.1 目录视图 452
13.1.2 动态管理视图及函数 452
13.1.3 默认跟踪 453
13.1.4 困难 456
13.2 Performance Dashboard Reports 456
13.2.1 必要条件 457
13.2.2 安装Performance Dashboard Reports 457
13.2.3 运行Performance Dashboard Reports 460
13.2.4 架构 463
13.2.5 常见使用场景 465
13.2.6 局限性 469
13.3 相关链接 471
13.4 小结 471
第IV分 服务器性能的路线图 475
第14章 从一开始就为性能进行设计的最佳实践 475
14.1 理解性能需求 475
14.1.1 数据库将支持多少用户 476
14.1.2 用户/角色访问要求的本质 478
14.1.3 业务事务要求的吞吐量 479
14.1.4 软件应用程序的核心架构 481
14.2 为未知的性能评估模式 482
14.2.1 简化模式 483
14.2.2 单一用途表 483
14.2.3 单一用途列 484
14.2.4 消除不明确的空字段 486
14.2.5 基于ID的分区 487
14.2.6 为了性能进行反规范化 487
14.2.7 视图中函数的性能影响 489
14.3 为性能评估索引 490
14.3.1 不加思考/默认索引 490
14.3.2 简单访问模式索引 491
14.3.3 复杂访问模式索引 491
14.4 为评估建立基准 491
14.4.1 创建基准模式 491
14.4.2 从DMV中提取Object_ID级信息 492
14.4.3 捕获表吞吐量 492
14.4.4 监视索引使用 492
14.4.5 TempDB使用 493
14.4.6 捕获阻塞信息 494
14.4.7 监视高CPU使用 495
14.4.8 监视高I/O产生者 496
14.5 沟通性能问题 497
14.6 小结 498
第15章 成功的部署策略 499
15.1 预估 500
15.2 附加特性 501
15.3 高可用性以及灾难恢复 501
15.3.1 备份和恢复 502
15.3.2 集群 502
15.3.3 数据库镜像 503
15.3.4 日志传送 503
15.3.5 复制 503
15.4 负荷测试 504
15.5 管理变动 504
15.6 处理大的表 505
15.6.1 分区函数 506
15.6.2 分区方案 506
15.6.3 对表或索引进行分区 507
15.7 使用SQL Server Profiler进行调校 507
15.8 使用Database Engine Tuning Advisor进行调校 507
15.9 错误预估实际执行环境的后果 507
15.10 实际执行中的模式问题 508
15.11 避免通过修改代码来解决问题 509
15.11.1 查询 509
15.11.2 查询计划 510
15.11.3 Plan Guide 511
15.11.4 创建Plan Guide之后的查询计划 511
15.12 小结 513