SQL Server是当前应用最广的大型数据库系统之一,大型数据库系统运行一段时间后就会出现运行缓慢、性能下降、故障增多等问题,为了使系统维持正常运行,必须对系统不断进行“调校”。
本书从SQL系统的运行原理入手,探究其常遇运行问题的形成原因与解决办法。本书作者长期担任大型数据库设计开发和管理的顾问并从事SQL Server系统的教学工作,本书是他丰富的实践与教学经验的结晶。全书内容包括:性能调校概观、SQL Server架构简介、性能调校相关工具程序、数据库设计、T-SQL语法、索引与查询性能、事务与锁管理、前端应用程序设计。
无论是正在从事大型数据库系统的设计、开发、或教学工作的人员或者是在学习大型数据系统知识的学生,掌握“系统调校”知识都是必不可少的。
第1章 性能调校概观
1.1 什么是性能调校 5
1.2 建立性能的基线及相关文件 5
1.3 性能调校的步骤流程 – DETECT 8
1.3.1 各阶段重点说明 9
1.3.2 练习 DETECT 方法 13
1.4 定义瓶颈 16
1.5 结论 17
第2章 SQL Server架构简介
2.1 SQL Server 运行架构 21
2.1.1 SQL Server 的存取架构 24
2.1.2 SQL Server 的核心引擎 27
2.1.3 动态自我管理 31
2.2 各项硬件使用剖析 33
2.2.1 内存管理 33
2.2.2 中央处理器 48
2.2.3 硬盘子系统 54
2.3 仿真系统运作 61
2.4 本章参考资源 63
第3章 性能调校相关工具程序
3.1 综观的工具 69
3.1.1 SQLDiag 概观 69
3.1.2 观察影响效率的属性 74
3.1.3 性能监视器 78
3.2 进一步的分析工具 84
3.2.1 SQL Server Enterprise Manager及 T-SQL Script 84
3.2.2 SQL Profiler 概观 87
3.2.3 相关的系统对象 99
3.3 针对特定对象的工具 100
3.3.1 Query Analyzer 100
3.3.2 网络监视器 103
3.3.3 DBCC 106
3.3.4 跟踪标记 109
3.4 压力测试工具程序 110
3.4.1 Microsoft Application Center Test 111
3.4.2 自行撰写压力测试程序 114
3.5 本章参考资料 117
第4章 数据库设计
4.1 数据库设计 121
4.1.1 硬盘子系统之设计 126
4.1.2 分割 & 并行运作 130
4.2 备份与还原 134
4.2.1 Logical Log Marks 134
4.2.2 恢复模型 137
4.3 大量数据加载 139
4.4 结语 140
第5章 T-SQL 语法
5.1 有效的查询参数 143
5.1.1 不要对数据字段做运算 144
5.1.2 不要用负向查询 146
5.1.3 不要对数据字段使用函数 146
5.1.4 使用 OR 运算符要小心 147
5.2 使用 T-SQL 的注意事项 148
5.3 自行撰写管理用的辅助存储过程 150
5.3.1 当做工具的 T-SQL 程序 150
5.3.2 将存储过程建立在 tempdb 系统数据库 156
5.4 SQL Server提供的公共变量 157
5.5 结语 165
第6章 索引与查询性能
6.1 索引概观 169
6.1.1 建立索引与相关的属性配置 170
6.1.2 聚集索引(Clustered Index)与非聚集索引 175
6.1.3 排序 179
6.1.4 并行建立索引 184
6.1.5 sysindexes 系统数据表 184
6.1.6 是否值得建索引 188
6.2 建立最优化执行计划的各阶段 191
6.3 统计 193
6.3.1 更新统计 200
6.4 联结与查询效率 204
6.4.1 联结 204
6.4.2 Join 语法 205
6.4.3 巢状循环联结 208
6.4.4 合并联结 209
6.4.5 哈希联结 210
6.4.6 联结与子查询 211
6.5 覆盖索引 213
6.6 在视图与计算字段上建立索引 217
6.6.1 如何有效地建立 Indexed View 219
6.6.2 Indexed View 的适用范围 224
6.7 查询提示 225
6.8 单一查询使用多个索引 230
6.9 数据不连续(Fragmentation) 231
6.10 结语 234
第7章 事务与锁管理
7.1 锁 237
7.1.1 锁的种类及范围 237
7.1.2 锁的兼容性 240
7.1.3 可锁定的资源 241
7.1.4 锁与事务隔离等级 243
7.1.5 动态的锁定管理 248
7.1.6 锁定超时 249
7.2 事务 252
7.2.1 批处理与事务 252
7.2.2 巢状事务 255
7.2.3 储存点 259
7.2.4 锁定提示 261
7.3 死锁 264
7.3.1 分布式死锁(Distributed Deadlock) 266
7.3.2 SQL Server 无法侦测到的死锁实例 268
7.4 观察与分析系统的锁定状况 273
7.4.1 观察 SQL Server 当前执行的状况 274
7.4.2 观察与分析系统的锁定状况 281
7.4.3 死锁状况分析 283
7.5 一般产生阻塞的原因 289
7.5.1 费时的查询或事务 289
7.5.2 不正确的事务或事务隔离级别配置 290
7.5.3 事务未正确处理 290
7.5.4 未侦测到的分布式死锁 291
7.5.5 Lock Granularity 太高或太低 291
7.5.6 Compile Blocking 291
7.5.7 防止锁住他人的技巧 292
7.5.8 防止与处理死锁的技巧 293
第8章 前端应用程序设计
8.1 处理 SQL 语法时用户端与服务器的互动情形 297
8.1.1 用户端存取 SQL Server 的模式 299
8.1.2 准备再执行的模式 303
8.1.3 通过 Master.dbo.Syscacheobjects 系统数据表观察在缓存中的对象 307
8.1.4 测试各种执行 SQL 语法方式的性能 312
8.1.5 Connection Pooling 313
8.2 游标 322
8.2.1 游标综述 322
8.2.2 默认结果集 324
8.2.3 服务器端游标 326
8.2.4 使用游标的 T-SQL 语法 331
8.2.5 与游标相关的系统存储过程 340
8.2.6 通过前端程序存取四种类型的游标 342
8.2.7 异步使用游标 346
8.2.8 使用游标时,应注意的事项 348
8.3 应用程序错误处理 350
附录A 性能调校计划 353
附录B 压力测试计划 359
附录C 参考资源 377
附录D Wintel 的 64位架构 383
QL Server 2000 上市至今,已经成为企业通用的数据库软件,大概所有企业都会使用到SQL Server,因此对于SQL Server数据库系统的管理与数据库程序的编写(T-SQL),相信已经有很多人熟悉。然而在熟悉SQL Server 的管理与程序设计之后,数据库将会有一个最终极的问题,那就是性能调校,如果你不熟悉数据库管理,对数据库程序设计也没有概念,那性能调校对于你而言无须考虑;但若是该做的你都做了,接下来想了解该怎么办时,你就得要好好研究性能调校了。数据库本身也有生命周期,它并不是一构建好就可以放在旁边永远不用再去理它的,若是你对性能的要求更高,那你很可能得在数据库还没开始构建之前就必须考虑将来可能会出现性能“瓶颈”的问题,性能这个问题是全面性的问题,其所涵盖的范围非常广,不单单是懂得数据库管理与设计就可以解决的。
若是性能问题一直在困扰着你,那么本书便可以为你解惑。本书作者胡百敬先生拥有多年的实际大型数据库顾问经验,且本身经常担任SQL Server的技术讲师,技术功底深厚,凭借他多年的经验与研究心得,撰写出这本针对性能调校议题的书籍,相信能对顾虑SQL Server性能问题的读者有所贡献。