第1章 SQL Server 2008架构和配置 1
1.1 SQL Server版本 1
1.2 SQL Server元数据 2
1.2.1 兼容性视图 2
1.2.2 目录视图 3
1.2.3 其他元数据 4
1.3 SQL Server引擎组件 6
1.3.1 观察引擎行为 7
1.3.2 协议 8
1.3.3 关系引擎 9
1.3.4 存储引擎 10
1.4 SQLOS 13
1.5 计划程序 14
1.5.1 SQL Server工作线程 15
1.5.2 将计划程序绑定到CPU中 17
1.5.3 专用管理员连接(DAC) 20
1.6 内存 21
1.6.1 缓冲池与数据缓存 21
1.6.2 访问内存中的数据页 21
1.6.3 管理数据缓存中的页面 22
1.6.4 可用缓冲区列表和惰性编写器 22
1.6.5 检查点 23
1.6.6 管理其他缓存中的内存 24
1.6.7 调节内存大小 25
1.6.8 调节缓冲池大小 26
1.7 服务器资源调控器 30
1.7.1 资源调控器概述 30
1.7.2 资源调控器控制 37
1.7.3 资源调控器元数据 38
1.8 SQL Server 2008配置 39
1.8.1 使用SQL Server配置管理器 39
1.8.2 配置网络协议 39
1.8.3 默认的网络配置 39
1.8.4 管理服务 40
1.9 SQL Server系统配置 41
1.9.1 操作系统配置 41
1.9.2 跟踪标记 43
1.10 服务器配置设置 43
1.11 小结 52
第2章 更改跟踪、跟踪和扩展事件 53
2.1 基础知识:触发器和事件通知 53
2.1.1 运行时触发器行为 53
2.2 更改跟踪 54
2.2.1 更改跟踪配置 54
2.2.2 更改跟踪的运行时行为 57
2.3 跟踪和事件探查 60
2.3.1 SQL跟踪架构和术语 61
2.3.2 安全性和权限 62
2.3.3 Profiler入门 63
2.3.4 服务器端跟踪和收集 70
2.4 扩展事件 78
2.4.1 XE体系结构的组件 79
2.4.2 事件会话 86
2.4.3 扩展事件DDL和查询 88
2.5 小结 91
第3章 数据库和数据库文件 92
3.1 系统数据库 92
3.1.1 master 93
3.1.2 model 93
3.1.3 tempdb 93
3.1.4 资源数据库 93
3.1.5 msdb 94
3.2 样例数据库 94
3.2.1 AdventureWorks 94
3.2.2 pubs 95
3.2.3 Northwind 95
3.3 数据库文件 95
3.4 创建数据库 97
3.4.1 CREATE DATABASE例子 99
3.5 扩展或收缩数据库 99
3.5.1 自动文件扩展 100
3.5.2 手动文件扩展 100
3.5.3 快速文件初始化 100
3.5.4 自动收缩性 100
3.5.5 手动收缩 101
3.6 使用数据库文件组 102
3.6.1 默认文件组 102
3.6.2 FILEGROUP CREATION例子 103
3.6.3 文件流文件组 104
3.7 修改数据库 105
3.7.1 ALTER DATABASE例子 106
3.8 数据库剖析 107
3.8.1 空间分配 107
3.9 设置数据库选项 110
3.9.1 状态选项 112
3.9.2 游标选项 114
3.9.3 自动选项 115
3.9.4 SQL选项 115
3.9.5 数据库恢复选项 116
3.9.6 其他数据库选项 117
3.10 数据库快照 117
3.10.1 创建数据库快照 118
3.10.2 数据库快照使用的空间 119
3.10.3 管理快照 120
3.11 tempdb数据库 121
3.11.1 tempdb中的对象 121
3.11.2 tempdb中的优化 122
3.11.3 最佳实践 123
3.11.4 tempdb空间监视 124
3.12 数据库安全性 124
3.12.1 数据库访问 125
3.12.2 管理数据库安全性 126
3.12.3 数据与架构 127
3.12.4 主体与架构 127
3.12.5 默认架构 128
3.13 移动或复制数据库 128
3.13.1 分离和重新附加数据库 128
3.13.2 备份和还原数据库 130
3.13.3 移动系统数据库 130
3.13.4 移动master数据库 131
3.14 兼容性级别 131
3.15 小结 132
第4章 日志记录和恢复 133
4.1 事务日志基础 133
4.1.1 恢复阶段 134
4.1.2 读日志 137
4.2 更改日志大小 137
4.2.1 虚拟日志文件 137
4.2.2 观察虚拟日志文件 138
4.2.3 自动截断虚拟日志文件 141
4.2.4 维护可恢复日志 142
4.2.5 自动压缩日志 144
4.2.6 日志文件大小 145
4.3 备份和还原数据库 145
4.3.1 备份类型 145
4.3.2 恢复模型 146
4.3.3 选择备份类型 149
4.3.4 还原数据库 150
4.4 小结 154
第5章 表 155
5.1 创建表 155
5.1.1 命名表和列 156
5.1.2 保留关键字 157
5.1.3 分隔标识符 157
5.1.4 命名约定 158
5.1.5 数据类型 158
5.1.6 关于NULL 178
5.2 用户定义数据类型 180
5.3 IDENTITY属性 181
5.4 内部存储 184
5.4.1 sys.indexes目录视图 185
5.4.2 数据存储元数据 186
5.4.3 数据页 189
5.4.4 检查数据页 190
5.4.5 数据行的结构 193
5.4.6 查找一个物理页面 195
5.4.7 固定长度行的存储 197
5.4.8 可变长度行的存储 199
5.4.9 日期和时间数据的存储 204
5.4.10 sql_variant数据的存储 206
5.5 约束 209
5.5.1 约束名称和目录视图信息 210
5.5.2 视图和多行数据修改中出现的约束故障 211
5.6 修改表 212
5.6.1 更改数据类型 212
5.6.2 添加一个新列 213
5.6.3 添加、删除、禁用或启用约束 213
5.6.4 删除列 214
5.6.5 启用或禁用一个触发器 215
5.6.6 修改表的内部 215
5.7 堆修改内部 217
5.7.1 分配结构 217
5.7.2 插入行 218
5.7.3 删除行 219
5.7.4 更新行 221
5.8 小结 224
第6章 索引:内部和管理 225
6.1 概述 225
6.1.1 SQL Server索引B树 226
6.2 分析索引的工具 228
6.2.1 使用dm_db_index_physical_stats动态管理视图 228
6.2.2 使用DBCC ID 231
6.3 理解索引结构 233
6.3.1 聚集键的依赖关系 234
6.3.2 非聚集索引 236
6.3.3 约束和索引 236
6.4 索引创建选项 237
6.4.1 IGNORE_DUP_KEY 238
6.4.2 STATISTICS_NORECOM PUTE 238
6.4.3 MAXDOP 238
6.4.4 索引放置 238
6.4.5 约束和索引 239
6.5 物理索引结构 239
6.5.1 索引行格式 239
6.5.2 聚集索引结构 240
6.5.3 聚集索引的非叶级 241
6.5.4 分析聚集索引结构 241
6.5.5 非聚集索引结构 246
6.6 特殊索引结构 255
6.6.1 计算列上的索引和索引视图 255
6.6.2 全文索引 262
6.6.3 空间索引 262
6.6.4 XML索引 262
6.7 数据修改的内部 263
6.7.1 插入行 263
6.7.2 拆分页 264
6.7.3 删除行 267
6.7.4 更新行 272
6.7.5 表级数据修改与索引级数据修改 275
6.7.6 日志记录 276
6.7.7 锁定 276
6.7.8 碎片 276
6.8 管理索引结构 277
6.8.1 删除索引 277
6.8.2 ALTER INDEX 278
6.8.3 检测碎片 279
6.8.4 删除碎片 280
6.8.5 重建索引 282
6.9 小结 284
第7章 特殊存储 285
7.1 大型对象存储 285
7.1.1 长度受限的大型对象数据(行溢出数据) 285
7.1.2 不限长度大型对象数据 289
7.1.3 最大长度数据的存储 294
7.2 文件流数据 295
7.2.1 为SQL Server启用文件流数据 295
7.2.2 创建一个启用文件流的数据库 296
7.2.3 创建一张表存储文件流数据 297
7.2.4 操纵文件流数据 298
7.2.5 文件流数据的元数据 302
7.2.6 文件流数据性能方面的考虑 304
7.3 稀疏列 305
7.3.1 稀疏列的管理 305
7.3.2 列集和稀疏列操作 307
7.3.3 物理存储 309
7.3.4 元数据 311
7.3.5 利用稀疏列节省存储空间 312
7.4 数据压缩 315
7.4.1 Vardecimal 315
7.4.2 行压缩 315
7.4.3 页压缩 322
7.5 表和索引分区 329
7.5.1 分区函数和分区方案 330
7.5.2 分区的元数据 331
7.5.3 分区的滑动窗口优势 334
7.6 小结 336
第8章 查询优化器 337
8.1 概述 337
8.1.1 树格式 337
8.2 什么是优化 338
8.3 查询优化器如何研究查询计划 339
8.3.1 规则 339
8.3.2 属性 339
8.3.3 替代项的存储——“备注” 341
8.3.4 运算符 341
8.4 优化器架构 346
8.4.1 优化之前 347
8.4.2 简化 347
8.4.3 琐碎计划/自动参数化 347
8.4.4 限制 348
8.4.5 备注——有效地探索多项计划 349
8.5 统计信息、基数估计和开销 350
8.5.1 统计信息设计 351
8.5.2 密度/频度信息 353
8.5.3 筛选的统计信息 355
8.5.4 字符串统计信息 356
8.5.5 基数估计细节 356
8.5.6 限制 359
8.5.7 成本计算 360
8.6 索引选择 361
8.6.1 筛选索引 363
8.6.2 索引视图 365
8.7 分区表 369
8.7.1 分区对齐索引视图 372
8.8 数据仓库 372
8.9 更新 372
8.9.1 Halloween保护 375
8.9.2 拆分/排序/折叠 375
8.9.3 合并 377
8.9.4 大范围更新计划 379
8.9.5 稀疏列更新 381
8.9.6 分区更新 381
8.9.7 锁定 384
8.10 分布式查询 385
8.11 扩展的索引 387
8.11.1 全文索引 387
8.11.2 XML索引 387
8.11.3 空间索引 388
8.12 计划提示 389
8.12.1 调试计划问题 389
8.12.2 {HASH|ORDER}GROUP 391
8.12.3 {MERGE|HASH|CONCAT}UNION 391
8.12.4 FORCE ORDER,{LOOP|MERGE|HASH}JOIN 391
8.12.5 INDEX=<indexname>|<indexid> 392
8.12.6 FORCESEEK 392
8.12.7 FAST<number_rows> 393
8.12.8 MAXDOP<N> 393
8.12.9 OPTIMIZE FOR 393
8.12.10 PARAMETRIZATION{SIMPLE|FORCED} 395
8.12.11 NOEXPAND 395
8.12.12 USE PLAN 395
8.13 小结 397
第9章 计划缓存和重新编译 398
9.1 计划缓存 398
9.1.1 计划缓存元数据 398
9.1.2 清除计划缓存 399
9.2 缓存机制 399
9.2.1 即席查询缓存 400
9.2.2 即席工作负荷优化 402
9.2.3 简单参数化 404
9.2.4 已准备查询 408
9.2.5 已编译对象 410
9.2.6 重新编译的原因 412
9.3 计划缓存内部 420
9.3.1 缓存存储 420
9.3.2 编译计划 421
9.3.3 执行上下文 422
9.3.4 计划缓存元数据 422
9.3.5 句柄 422
9.3.6 sys.dm_exec_sql_text 423
9.3.7 sys.dm_exec_query_plan 424
9.3.8 sys.dm_exec_text_query_plan 424
9.3.9 sys.dm_exec_cached_plans 425
9.3.10 sys.dm_exec_cached_plan_dependent_objects 425
9.3.11 sys.dm_exec_requests 425
9.3.12 sys.dm_exex_query_stats 426
9.3.13 缓存大小管理 426
9.3.14 缓存项的成本 429
9.4 计划缓存中的对象:概况 429
9.5 缓存中的多个计划 431
9.6 何时使用存储过程和其他缓存机制 432
9.7 计划缓存问题故障排除 432
9.7.1 等待统计信息表明存在计划缓存问题 432
9.7.2 其他缓存问题 434
9.7.3 处理编译和重新编译问题 434
9.7.4 计划指南和优化提示 435
9.8 小结 444
第10章 事务和并发性 445
10.1 并发模型 445
10.1.1 悲观并发 445
10.1.2 乐观并发 445
10.2 事务处理 446
10.2.1 ACID属性 446
10.2.2 事务依赖性 447
10.2.3 隔离级别 448
10.3 锁定 451
10.3.1 锁定基础 451
10.3.2 旋转锁 452
10.3.3 用户数据的锁类型 452
10.3.4 锁模式 452
10.3.5 锁粒度 455
10.3.6 锁的持续时间 460
10.3.7 锁的所有权 460
10.3.8 查看锁 461
10.3.9 锁定示例 463
10.4 锁兼容性 468
10.5 锁定内部架构 469
10.5.1 锁分区 470
10.5.2 锁块 471
10.5.3 锁所有者块 472
10.5.4 syslockinfo表 472
10.6 行级别锁与页级别锁 475
10.6.1 锁升级 475
10.6.2 死锁 477
10.7 行版本控制 480
10.7.1 行版本控制概述 480
10.7.2 行版本控制细节 481
10.7.3 基于快照的隔离级别 481
10.7.4 选择并发模型 496
10.8 控制锁定 497
10.8.1 锁提示 497
10.8.2 设置锁超时 499
10.9 小结 500
第11章 DBCC揭秘 501
11.1 获得数据库的一致性视图 502
11.1.1 获得一致性视图 502
11.2 有效地处理数据库 504
11.2.1 事实生成 505
11.2.2 使用查询处理器 506
11.2.3 批处理 508
11.2.4 读取要处理的页 509
11.2.5 并行性 509
11.3 早期的系统目录一致性检查 511
11.4 分配一致性检查 512
11.4.1 收集分配事实 512
11.4.2 检查分配事实 513
11.5 按表进行逻辑一致性检查 514
11.5.1 元数据一致性检查 515
11.5.2 页审核 516
11.5.3 数据和索引页处理 518
11.5.4 列处理 519
11.5.5 文本页处理 522
11.5.6 跨页一致性检查 523
11.6 跨表一致性检查 532
11.6.1 Service Broker一致性检查 532
11.6.2 跨目录一致性检查 533
11.6.3 索引视图一致性检查 533
11.6.4 XML索引一致性检查 534
11.6.5 空间索引一致性检查 534
11.7 DBCC CHECKDB输出 535
11.7.1 标准输出 535
11.7.2 SQL Server错误日志输出 537
11.7.3 应用程序事件日志输出 538
11.7.4 进度报告输出 538
11.8 DBCC CHECKDB选项 539
11.8.1 NOINDEX 540
11.8.2 修复选项 540
11.8.3 ALL_ERRORMSGS 540
11.8.4 EXTENDED_LOGICAL_CHECKS 541
11.8.5 NO_INFOMSGS 541
11.8.6 TABLOCK 541
11.8.7 ESTIMATEONLY 541
11.8.8 PHYSICAL_ONLY 542
11.8.9 DATA_PURITY 542
11.9 数据库修复 542
11.9.1 修复机制 543
11.9.2 紧急模式修复 544
11.9.3 哪些数据可以由修复删除 545
11.10 除DBCC CHECKDB之外的一致性检查命令 545
11.10.1 DBCC CHECKALLOC 546
11.10.2 DBCC CHECKTABLE 547
11.10.3 DBCC CHECKFILEGR OUP 547
11.10.4 DBCC CHECKCATALOG 547
11.10.5 DBCC CHECKIDENT 548
11.10.6 DBCC CHECKCONSTR-AINTS 548
11.11 小结 548