第1章 Microsoft SQL Server的演变过程: 从1989年到1996年 3
1.1 竞争的背景产生了Microsoft SQL Server 3
第1部分 概述 3
1.2 早期的NDK 5
1.3 Mocrosoft SQL Server的正式发布 6
1.4 开发工作的加强 8
1.5 OS/2和“友好的火力” 9
1.6 4.2 版本 10
1.7 OS/2 2.0的发布延迟了 11
1.7.1 4.2版本发布了 11
1.8 Windows NT上的SQL Server 12
1.10 合作开发的结束 17
1.11 SQL 95 的费用 18
1.12 下一个版本 21
2.1 引言 22
2.2 SQL Server引擎 22
2.2.1 Transact-SQL 22
第2章 游历Microsoft SQL Server 22
2.3 DBMS—强制性的数据完整性 27
2.3.1 说明性参照完整性 27
2.3.2 数据类型 28
2.3.4 默认值 29
2.3.5 触发器 29
2.3.3 CHECK约束和规则 29
2.4 事务处理 30
2.4.3 隔离性 31
2.4.2 一致性 31
2.4.4 耐久性 31
2.4.1 原子性 31
2.5.1 传统的进程/线索模型 32
2.5.2 Microsoft SQL Server的进程/线索模型 32
2.5 对称的服务器结构 32
2.5.3 多用户性能 33
2.6 安全性 33
2.6.1 监测与管理安全性 34
2.7 高度的有效性 35
2.8 分布式的数据处理 35
2.9 数据复制 37
2.10 系统管理 38
2.10.1 SQL Enterprise Manager 38
2.10.2 分布式的管理对象 39
2.10.3 Automation 和Visual Basic脚本 40
2.10.4 SQL Executive 42
2.11.1 SQL Server Web Assistant 和访问Internet 43
2.11.2 SQL Trance 43
2.11 SQL Server工具软件和扩展 43
2.11.4 与Windows NT Performance Monitor集成 44
2.11.5 SQL Security Manager 44
2.11.3 SQL Service Manager 44
2.11.6 SQL Client Configration Utility 45
2.11.7 SQL Server安装程序 45
2.11.9 大批量拷贝工具 46
2.11.10 与SNMP结合 46
2.11.8 ISQL/w和ISQL 46
2.12.1 DB-Library 47
2.12 开发界面 47
2.12.2 ODBC 47
2.11.11 SQL Server的联机阅读文档 47
2.12.3 ESQL for C 48
2.12.4 Open Data Services 48
小结 49
3.2 SQL Server引擎 53
3.1 概述 53
3.2.1 网库 53
第3章SQL Server的结构 53
第2部分 体系结构概述 53
3.2.2 Open Data Services 56
3.2.4 远程存储过程调用的处理器 59
3.2.5 序化器和优化器 59
3.2.3 命令分析器 59
3.2.6 执行器 61
3.2.7 搜索管理器 61
3.2.8 数据库和页管理器 62
3.2.9 事务管理器 62
3.2.10 加锁管理器 65
3.2.11 行操作管理器、索引管理器、文本管理器 66
3.2.12 缓冲区管理器和日志写人器 72
3.3 大内存问题 76
3.3.1 快速访问内存中的页 76
3.3.2 快速访问空闲页(Lazywriter) 77
3.4 事务日志和恢复 78
3.4.1 加锁和恢复 79
3.4.2 时戳和恢复 80
3.5 SQL Server的内核以及SQL Server与Windows NT的相互作用 81
3.5.1 线索和对称多处理 83
3.5.2 工作人员线索池 84
3.5.3 可伸缩性、性能和测试准则 86
小结 89
4.1 安装虽易,但考虑仍需周全 93
第4章 规划和安装SQL Server 93
4.2 SQL Server与SQL工作站 93
第3部分 应用SQL Server 93
4.3.1 使用与Windows硬件兼容的硬件 94
4.3.2 选择好的处理器 94
4.3 选择硬件 94
4.3.3 性能等于处理器周期、内存和I/O吞吐率的综合效果 95
4.3.4 要舍得在测试程序上花钱 96
4.4 硬件指导原则 97
4.4.1 处理器 97
4.4.2 内存 100
4.4.3 磁盘驱动器、控制器和磁盘组 101
4.4.4 RAID方法 102
4.4.5 关于驱动器和控制器的进一步说明 111
4.4.6 使用不间断电源 112
4.4.7 检测磁盘子系统 113
4.4.8 撤退型服务器功能 113
4.4.9 其它硬件方面的考虑 114
4.5 操作系统 114
4.6 文件系统 115
4.7 安全性和用户环境 116
4.8 选择许可证 117
4.8.1 Internet许可证 119
4.8.2 许可证限制 119
4.9 网络协议选择 121
4.10 字符集和排序顺序问题 124
4.10.1 字符集 124
4.10.2 排序顺序 126
1.9 成功带来的巨大变化 126
4.11 运行安装程序 131
4.12 安装后的基本配置 132
4.13 无值守安装和远程安装 134
4.13.1 远程安装 135
4.13.2 无值守安装 135
4.13.3 在最初安装后使用安装程序 137
小结 138
第5章 数据库和设备 139
5.1 什么是数据库? 139
5.2 数据库设备 140
5.2.1 建立数据库设备 140
5.2.2 设备号 142
5.2.3 扩充设备 143
5.2.4 默认设备 143
5.2.5 挂接和脱开设备 144
5.2.6 与设备的建立和安装有关的错误 144
5.2.7 镜象功能 145
5.3 建立数据库 145
5.3.1 分离事务日志 147
5.4 数据库的最大化和分片 148
5.5 扩充和收缩数据库 148
5.6 数据库内幕 149
5.7 数据库选项 151
5.8 改变数据库选项 152
5.9 有关数据库其它方面的考虑 153
5.9.1 FOR LOAD选项 153
5.9.2 数据库与模式有差别 154
5.9.3 可移动介质 154
5.9.4 专门的系统数据库 155
小结 156
6.1 引言 157
6.2 建表 157
第6章 表 157
6.2.1 命名表和列 158
6.2.2 关键字和保留字 158
6.2.3 命名约定 160
6.2.4 数据类型 161
6.3 内部存储细节 166
6.3.1 数据页 167
6.3.2 查看数据页 169
6.3.3 数据行 171
6.3.4 偏移表和调节表 172
6.3.5 定长行和变长行的存储方法 172
6.4 索引 175
6.4.2 非群聚索引 176
6.4.1 群聚索引 176
6.4.3 建立索引 178
6.5 用户定义的数据类型 179
6.6 Identity属性 182
6.7 约束 185
6.7.1 主键和唯一性约束 185
6.7.2 FOREIGN KEY(外键)约束 189
6.7.3 约束检查方法 195
6.7.4 关于删除表的限制 196
6.7.5 自引用表 197
6.7.6 参照动作 198
6.7.7 CHECK约束 199
6.7.8 “默认”约束 202
6.7.9 关于约束的进一步说明 206
6.8 临时表 212
6.8.1 私人临时表(#) 212
6.8.2 共用临时表 212
6.8.3 直接使用tempdb 213
6.8.4 对临时表的约束 213
小结 213
第7章 查询数据 215
7.1 引言 215
7.2 SELECT语句 215
7.3 联结 218
7.3.1 外联结 221
7.3.2 废弃外联结运算符 225
7.4 处理NULL 231
7.4.1 现时世界中的NULL 234
7.4.2 IS NULL和=NULL 236
7.5 子查询 239
7.5.1 相关子查询 243
7.6 视图和导出表 249
7.7 其它搜索表达式 252
7.7.1 LIKE 252
7.7.2 BETWEEN 256
7.7.3 集合函数 257
7.7.4 利用集合函数的计算结果从不同的角度查看数据 262
7.7.5 CUBE 263
7.7.6 ROLLUP 271
7.7.7 UNION 275
小结 280
第8章 修改数据 281
8.1 引言 281
8.2 基本的修改操作 281
8.2.1 INSERT 281
8.2.2 UPDATE 291
8.2.3 DELETE 294
8.2.4 通过视图修改数据 295
8.2.5 WITH CHECK OPTION选项 300
8.3 内部细节和性能方面的考虑 303
8.3.1 行的定位 303
8.3.2 更新策略 304
8.3.3 示例 311
8.3.4 加锁问题 320
小结 321
第9章 利用Transact-SQL编程 322
9.1 引言 322
9.2 作为编程语言的Transact-SQL 322
9.3 Transact-SQL编程结构-基本知识 325
9.3.1 变量 325
9.3.2 流控制工具 327
9.3.3 CASE 327
9.3.4 CASE的变形 331
9.2.5 注解 332
9.2.6 PRINT和RAISERROR 333
9.3.7 运算符 336
9.3.8 标量函数 341
小结 362
第10章 批处理、事务、存储过程和触发器 363
10.1 引言 363
10.2 批处理文件 363
10.3 事务 364
10.3.1 明确的事务和隐含的事务 365
10.3.2 在事务中查错 365
10.3.3 事务隔离等级 370
10.4 存储过程 377
10.3.4 事务的附加特性 377
10.4.1 嵌套的存储过程 379
10.4.2 存储过程中的递归技术 379
10.4.3 嵌套的事务块 383
10.4.4 保存点 387
10.4.5 存储过程的参数 387
10.5 批处理文件的处理和存储过程的存储 388
10.5.1 存储过程的存储 392
10.5.2 将存储过程加密 392
10.5.3 临时的存储过程 394
10.5.4 系统存储过程和专用的“sp-”前缀 396
10.5.5 自动启动存储过程 397
10.5.6 系统存储过程 398
10.5.8 SQL Exective存储过程 399
10.5.7 类目存储过程 399
10.5.9 复制存储过程 400
10.5.10 扩展存储过程 400
10.6 触发器 405
10.6.1 重新执行一个触发器 406
10.7 调试存储过程和触发器 408
10.7.1 构造并执行一个字符串 411
10.8 操作文本和图象数据 411
10.8.1 WRITETEXT 413
10.8.2 READTEXT 415
10.8.3 UPDATETEXT 418
10.9.1 区分大小写 422
10.9 环境方面的注意事项 422
10.9.2 NULL值和ANSI一致性设置 423
10.9.3 针对本地的SET选项 427
小结 427
第11章 光标 428
11.1 引言 428
11.2 光标的基本知识 428
11.3 光标和ISAM 430
11.3.1 ISAM: 过多的命令和网络交通 433
11.3.2 ISAM: 过量地使用服务器资源 433
11.3.3 ISAM: 不必要的长事务 434
11.4 光标模型 434
11.4.1 Transact-SQL光标 434
11.4.3 客户光标 435
11.4.2 API服务器光标 435
11.4.4 默认的结果集 436
11.4.5 API服务器光标和Transact-SQL光标之比较 437
11.5 适度使用光标 438
11.5.1 逐行操作 438
11.5.2 查询操作 439
11.5.3 滚动应用程序 440
11.5.4 选择光标模型 441
11.5.5 光标的成员、滚动和对修改的敏感度 441
11.6 Transact-SQL光标的句法和行为 446
11.6.1 DECLARE 446
11.6.2 OPEN 447
11.6.3 FETCH 448
11.6.6 CLOSE 449
11.6.4 UPDATE 449
11.6.5 DELETE 449
11.6.7 DEALLOCATE 450
11.6.8 Transact-SQL 光标的行为 450
11.6.9 最简单的光标句法 452
11.6.10 完全可滚动的Transact-SQL光标 452
11.6.11 利用Transact-SQL光标控制并发性 453
小结 460
第12章 Transact-SQL示例和编程之谜 461
12.1 引言 461
12.2 用触发器实现参照动作 461
12.3.1 生成测试数据 467
12.3 编程之谜 467
12.3.2 查找前n个值 471
12.3.3 获取排队顺序 474
12.3.4 时间序列问题: 查找不同时间段间的差异 484
12.3.5 累计求和问题 489
12.3.6 隔n行采样问题 490
12.3.7 查找含匹配列的行 490
12.3.8 将数据放到一个Web页上——快速方法 494
12.3.9 扩充层次结构(或称“物料帐单问题”) 495
12.3.10 用选择的方法取代迭代 500
12.3.11 获取表中的行数——最快方法 501
12.3.12 保存计算列 502
12.3.13 数据透视表(或称“交叉表”) 503
12.3.14 将SQL Server与e-mail集成 506
12.3.15 模拟一个分布式查询 511
12.3.16 模拟一个分布式、分区式插入 512
12.3.17 将文本复制到有序的varchar型列中 513
12.3.18 实例化并执行一个自动对象 516
小结 517
第13章 加锁 518
13.1 引言 518
13.2 加锁管理器 518
13.2.1 加锁管理器和隔离等级 518
13.2.2 自旋锁 519
13.2.3 死锁 520
13.3 用户数据的加锁类型 522
13.2.4 加锁和内存 522
13.5 加锁的兼容性 524
13.4 查看加锁 524
13.5.1 约束连接 526
13.5.2 行加锁和页加锁 526
13.5.3 插入行加锁 527
13.6 加锁升级 529
13.7 加锁暗示和应用程序问题 530
小结 530
第四部分 性能与调整 533
第14章 设计和查询性能 533
14.1 引言 533
14.3 提高开发组中各成员的技术水平 534
14.2 关于性能的指导原则 534
14.4 强化应用程序和数据库的设计 535
14.4.1 数据库的规范化 535
14.4.2 评估你的关键事务 536
14.4.3 使表的行长和键值尽可能紧凑 538
14.5 描述峰值时性能需求 539
14.6 交互系统的响应时间问题 539
14.7 贯穿整个开发过程的模型化、测试标准和测试 541
14.7.1 开发过程中的方法论 542
14.8 建立有用的索引 544
14.8.1 创建有用索引的指导原则 544
14.10 明智地使用光标 548
14.9 选择适当的硬件 548
14.12 使网络的往返次数最小化 549
14.11 尽量使用存储过程 549
14.13 并发性与一致性间的权衡 550
14.14 分析并解决加锁(阻塞)问题 551
14.14.1 解决阻塞问题的指导原则 552
14.15 分析并解决死锁问题 553
14.15.1 循环死锁的示例 553
14.15.2 转换死锁的示例 554
14.15.3 页分裂引发的死锁 555
14.15.4 阻止死锁的发生 556
14.15.5 处理死锁现象而不阻止它发生 557
14.15.8 找出故障的原因 559
14.15.6 自愿成为死锁的牺牲者 559
14.15.7 行加锁和死锁 559
14.15.9 监视加锁活动 563
14.6 分裂OLTP和DSS应用程序 569
14.17 监测和调试查询 570
14.17.1 优化器 570
14.18 监测查询性能 585
14.18.1 STATISTICS IO 585
14.18.2 STATISTICS TIME 586
14.18.3 SHOWPLAN ON 586
14.18.4 观察优化器的决策过程 587
14.18.5 使用优化器和加锁暗示 593
小结 596
15.1 引言 597
15.2 检查和调整Windows NT配置设置 597
15.2.1 Windows NT任务管理 597
第15章 配置与性能监测 597
15.2.2 Windows NT Server的资源分配 598
15.2.3 Windows NT服务器PAGEFILE.SYS位置 598
15.2.4 Windows NT文件系统选择 599
15.2.5 次要的Windows NT服务 599
15.2.6 Windows NT网络协议 599
15.3 检查和调整SQL Server配置参数 599
15.3.1 影响整个服务器的选项: sp-configure设置 599
15.3.3 插入行加锁 616
15.3.2 数据库选项 616
15.3.4 缓冲区管理器选项 617
15.3.5 SQLSERVR.EXE的启动参数 618
15.4 维护系统 619
15.5 监测系统性能 619
15.5.1 性能监测器计数器 620
15.5.2 监测性能的其它考虑 624
小结 624
第5部分 附录 627
附录1 SQL Server的内置共用变量 627
附录2 推荐读物 630
参考文献 634