目录 1
前言 1
第一部分概述 3
第一章Mlcrosoft SQL Server的演变过程:从1989年到2000年 3
1.1 SQLServer:初期阶段 4
1.2 Ron的故事 6
1.3 Kalen的故事 7
1.4 Microsoft SQLServer的发布 8
1.5开发角色的演变 9
1.6 OS/2和友好的攻击 11
1.7 SQLServer 4.2 13
1.7.1即将发布的OS/22.0 14
1.7.2 4.2版本的发布 14
1.8用于Windows NT的SQL Server 15
1.9成功带来的巨大变化 19
1.10合作开发的结束 20
1.11管理SQL95 22
1.12下一版本 25
1.13 Sphinx的秘密 25
1.14新世纪的软件 27
第二章 介绍SQL Server 31
7.3处理NULL 32
2.1.1 Transact-SQL 33
2.1 SQL Server引擎 33
2.2DBMS强制的数据完整性 37
2.2.1声明数据完整性 38
2.2.2数据类型 39
2.2.3 CHECK约束和规则 40
2.2.4默认值 40
2.2.5触发器 41
2.3事务处理 42
2.3.1 原子性 42
2.3.3孤立性 43
2.3.4持久性 43
2.3.2一致性 43
2.4对称服务器构架 44
2.4.1传统的进程/线程模式 44
2.4.2 SQLServer的进程/线程模式 45
2.4.3多用户性能 46
2.5安全性 46
2.5.1监视和管理安全性 47
2.6较高的可用性 48
2.7分布式数据处理 48
2.8数据复制 50
2.9.1 SQLServer Enterprise Manager 52
2.9系统管理 52
2.9.2 Distributed Management Objects 54
2.9.3 Windows Management Instrumentation 55
2.9.4 SQL-DMO和Visual Basic脚本 55
2.9.5 SQLServer Agent 56
2.10 SQLServer的实用程序和扩展 58
2.10.1 Web Assistant Wizard和Internet启用 58
2.10.2 SQLProfiler 59
2.10.4 System Monitor的集成 60
2.10.3 SQLServer Service Manager 60
2.10.5 Client Network实用程序 61
2.10.6 Server Network实用程序 62
2.10.7 SQLServer的安装 62
2.10.8 OSQL和ISQL 62
2.10.9 SQLQuery Analyzer 63
2.10.10大量复制和数据传输服务 63
2.10.11 SNMP集成 64
2.10.12 SQLServer Books Online 64
2.11.3 ADO 65
2.11.1 ODBC 65
2.11.2 OLE DB 65
2.11客户开发接口 65
2.11.4 DB-Library 66
2.11.5 ESQL/C 66
2.11.6服务器开发接口 66
2.12总结 67
第二部分基本结构概述 71
第三章SQL Server的基本结构 71
3.1 SQL Server引擎 71
3.1.1 Net-Library 71
3.1.2开放式数据服务 75
3.1.3关系引擎和存储引擎 79
3.1.4访问方法管理器 82
3.1.5行操作管理器和索引管理器 83
3.1.6页面管理器和文本管理器 87
3.1.7事务管理器 88
3.1.8锁管理器 91
3.1.9其他管理器 92
3.2管理内存 92
3.2.1缓冲区管理器和内存池 93
3.2.2访问内存内页面 93
3.2.3访问自由页(惰性编写器) 94
3.2.4检查点 96
3.2.5使用缓冲区管理器访问页面 98
3.2.6大量内存问题 99
3.2.7 日志管理器 102
3.3事务的记录和恢复 103
3.3.1锁定和恢复 105
3.3.2页面LSN和恢复 105
3.4 SQL Server内核和与操作系统的交互 107
3.4.1线程化和对称多处理技术 108
3.4.2辅助线程池 109
3.5总结 112
3.4.3 Windows NT/2000中的磁盘I/O 112
第三部分 使用Microsoft SQL Server 115
第四章 规划和安装SQL Server 115
4.1 SQL Server的版本 115
4.1.1嵌入的SQLServer 118
4.2.1使用“Windows硬件兼容列表”中的硬件 119
4.2.2性能=Fn(处理器周期,内存,I/O传输量) 119
4.2硬件指导原则 119
4.2.3在基准程序上的投资 120
4.3硬件组件 121
4.3.1处理器 122
4.3.2内存 123
4.3.3磁盘驱动器、控制器和磁盘阵列 124
4.3.4 RAID解决方案 126
4.3.5有关驱动器和控制器的更多信息 137
4.3.6不间断电源(UPS) 138
4.3.7磁盘子系统 139
4.3.8后备服务器的能力 140
4.3.9其他硬件的考虑因素 141
4.4操作系统 141
4.5文件系统 142
4.6安全性和用户环境 143
4.7许可 145
4.7.1 SQL Server的Processor License . 145
4.7.2 Server License和CAL 145
4.7.3多元化:中间件、事务服务器和多层结构的使用 146
4.7.4多实例 147
4.8网络协议 147
4.9排序规则 150
4.9.1字符集 151
4.9.2排序顺序 152
4.10多个实例 157
4.10.2命名实例的服务器连接 159
4.10.1安装命名实例 159
4.11安装SQL Server 160
4.11.1从以前的版本进行升级安装 161
4.12安装后的基本配置 162
4.12.1启动SQLServer服务 163
4.12.2更改系统管理员的密码 163
4.12.3配置SQLServer的错误日志 164
4.12.4使用多实例 165
4.13远程安装和无人参与安装 167
4.13.1远程安装 167
4.13.2无人参与安装 168
4.13.3更改安装选项 169
4.13.4添加其他组件 170
4.14总结 170
第五章数据库数据库文件 171
5.1.1 master 172
512 model 172
5.1特殊的系统数据库 172
5.1.3 tempdb 173
5.1.4 pubs 173
5.1.5 Northwind 174
5.1.6 madb 174
5.2数据库文件 174
5.3创建数据库 175
5.3.1 CREATE DATABASE示例 178
5.4扩大和收缩数据库 178
5.4.1 自动的文件扩大 178
5.4.3自动的文件收缩 179
5.4.4人工的文件收缩 179
5.4.2人工的文件扩大 179
5.5 日志大小方面的变化 181
5.5.1 日志截断 185
5.6使用数据库文件组 186
5.6.1默认文件组 186
5.6.2 FILEGROUP CREATION示例 188
5.7修改数据库 189
5.7.1 ALTER DATABASE示例 190
5.8数据库内幕 191
5.8.1空间分配 193
5.9设置数据库选项 196
5.9.1状态选项 197
5.9.2游标选项 201
5.9.3自动选项 201
5.9.4 SQL选项 202
5.9.5恢复选项 204
5.10.1数据库与方案 205
5.10数据库的其他考虑因素 205
5.10.2使用可移动媒介 206
5.10.3分离和重新附加数据库 207
5.10.4兼容性级别 208
5.11备份和恢复数据库 209
5.11.1备份的类型 209
5.11.2恢复模式 210
5.11.3选择备份类型 214
5.11.4恢复数据库 215
5.12总结 219
第六章表 221
6.1创建表 222
6.1.1命名表和列 223
6.1.3分隔标识符 224
6.1.2预留的关键字 224
6.1.4命名约定 225
6.1.5数据类型 226
6.1.6关于NULL的更多内容 235
6.2用户定义的数据类型 239
6.3 IDENTITY属性 241
6.4内部存储 244
6.4.1数据页 246
6.4.2介绍数据页 248
6.4.3数据行的结构 251
6.4.4列偏移量数组 253
6.4.5固定长度和可变长度行的存储 254
6.4.6页面链接 258
6.4.7文本和图像数据 260
6.4.8 sql_variant数据类型 265
6.5约束 269
6.5.1 PRIMARY KEY和UNIQUE约束 270
6.5.2 FOREIGN KEY约束 276
6.5.3约束检查的解决方法 284
6.5.4对删除表的限制 286
6.5.5自引用表 286
6.5.6 CHECK约束 288
6.5.7默认约束 292
6.5.8有关约束的更多内容 296
6.6修改表 304
6.6.1更改数据类型 304
6.6.2添加新列 305
6.6.3添加、删除、禁用或启用约束 305
6.6.4删除列 306
6.6.5启用或禁用触发器 307
6.7临时表 307
6.7.1私有临时表(#) 307
6.7.2全局临时表(##) 308
6.7.3直接使用tempdb 308
6.7.4临时表中的约束 309
6.8系统表 309
6.9总结 312
第七章查询数据 313
7.1 SELECT语句 313
7.2联接 315
7.2.1外部联接 319
7.2.2旧式的*=OUTER JOIN操作符 324
7.2.3交叉联接 331
7.3.1现实生活中的NULL 336
7.3.2 IS NULL和=NULL 338
7.4子查询 341
7.4.1相关子查询 346
7.5视图和派生表 353
7.5.1修改视图 357
7.5.2分区视图 358
7.6其他搜索表达式 360
7.6.1 LIKE 361
7.6.2 BETWEEN 366
7.6.3聚合函数 367
7.6.4数据立方——聚合的变化形式 373
7.6.5 TOP 387
7.6.6 UNION 390
7.7总结 395
第八章索引 397
8.1索引结构 398
8.1.1群集索引 399
8.1.2非群集索引 400
8.2创建索引 401
8.2.1约束和索引 403
8.3.1具有唯一标识符的群集索引行 405
8.3索引页的结构 405
8.3.2索引行的格式 409
8.4索引空间的需求 420
8.4.1 B树的大小 420
8.4.2实际大小和估计大小 421
8.5管理索引 423
8.5.1碎片类型 424
8.5.2检测碎片 424
8.5.3删除碎片 427
8.6特殊索引 429
8.6.1前提条件 429
8.6.2对计算得到的列的索引 433
8.6.3索引视图 434
8.7.2联接 437
8.7使用索引 437
8.7.1查找行 437
8.7.3排序 438
8.7.4 分组 439
8.7.5保持唯一性 439
8.8总结 439
第九章修改数据 441
9.1基本的修改操作 441
9.1.1 INSERT 441
9.1.2 UPDATE 453
9.1.3 DELETE 456
9.1.4通过视图修改数据 457
9.2数据修改内幕 466
9.2.1插入行 467
9.2.2拆分页面 467
9.2.3删除行 471
9.2.4更新行 478
9.2.5表级数据修改和索引级数据修改 485
9.2.6记录 486
9.2.7锁定 486
9.3总结 487
第十章 使用Transact-SQL编程 489
10.1 作为编程语言的Transact-SQL 490
10.1.1多级编程 490
10.2 Transact-SQL编程结构 493
10.2.1变量 493
10.2.2控制流工具 499
10.2.3 CASE 500
10.2.4 PRINT 504
10.2.5 RAISERROR 505
10.2.7运算符 508
10.2.6 FORMATMESSAGE 508
10.2.8标量函数 517
10.2.9表值函数 548
10.3 Transact-SQL示例和难题 549
10.3.1生成测试数据 550
10.3.2获取等级 554
10.3.3查找间隔之间的差别 559
10.3.4代替重申的选择 563
10.4全文搜索 565
10.4.1全文索引 566
10.4.2设置全文索引 568
10.4.3维护全文索引 570
10.4.4查询全文索引 574
10.4.5全文索引的性能考虑因素 582
10.5总结 583
11.1批处理文件 585
第十一章批处理文件、存储过程和函数 585
11.2例程 590
11.3存储过程 591
11.3.1嵌套的存储过程 593
11.3.2存储过程中的递归 594
11.3.3存储过程的参数 598
11.4用户定义的函数 602
11.4.1表变量 602
11.4.2标量值函数 604
11.4.3表值函数 607
11.4.4系统表值函数 609
11.4.5管理用户定义的函数 610
11.5将存储过程改写为函数 613
11.6滚动您自己的系统例程 613
11.6.1您自己的系统过程 613
11.6.2您自己的系统函数 615
11.7执行批处理文件或存储过程(和函数)存储的内容 617
11.7.1步骤1:解析命令并创建序列树 617
11.7.2步骤2:编译批处理文件 617
11.7.3步骤3:执行 617
11.7.4步骤4:重新编译执行计划 619
11.7.5例程的存储 621
11.7.6加密例程 621
11.7.7修改例程 624
11.8临时存储过程 624
11.8.1私有临时存储过程 625
11.8.2全局临时存储过程 625
11.8.3通过直接使用tempdb创建的过程 626
11.9自动启动存储过程 626
11.10系统存储过程 628
11.10.1常规系统过程 628
11.10.3 SQL Server Agent存储过程 630
11.10.2编目存储过程 630
11.10.4复制存储过程 631
11.10.5扩展存储过程 631
11.11 EXECUTE(“ANY STRING”) 637
11.12总结 639
第十二章事务和触发器 641
12.1事务 641
12.1.1明确事务和隐含事务 642
12.1.2事务中的错误检查 643
12.1.3事务的孤立级别 649
12.1.4事务的其他特性 659
12.1.5嵌套的事务块 659
12.1.6保存点 663
12.2触发器 664
12.2.1后触发器 665
12.2.2替代触发器 671
12.2.3管理触发器 674
12.2.4使用触发器执行引用动作 675
12.2.5递归触发器 682
12.3总结 683
第十三章 特殊的Transact-SQL操作:使用游标和大对象 685
13.1游标的基础知识 686
13.2游标和ISAM 688
13.2.1使用ISAM类型的应用程序的问题 691
13.3游标模型 692
13.3.1Transact-SQL游标 692
13.3.2 API服务器游标 692
13.3.3客户游标 694
13.3.4默认结果集 695
13.3.5 API服务器游标和Transact-SQL游标 695
13.4游标的适当使用 696
13.4.2查询操作 697
13.4.1逐行操作 697
13.4.3滚动应用程序 698
13.4.4选择游标 699
13.4.5游标成员、滚动和更改敏感度 700
13.5使用Transact-SQL游标 706
13.5.1 DECLARE 706
13.5.2 OPEN 708
13.5.3 FETCH 709
13.5.4 UPDATE 711
13.5.5 DELETE 712
13.5.6 CLOSE 712
13.5.7 DEALLOCATE 713
13.5.8最简单的游标语法 713
13.5.9完全可滚动的Transact-SQL游标 714
13.5.10使用Transact-SQL游标进行并行性控制 716
13.6游标变量 724
13.6.1获得游标信息 725
13.7使用文本和图像数据 731
13.7.1 WRITETEXT 732
13.7.2 READTEXT 735
13.7.3 UPDATETEXT 742
13.8总结 750
第四部分性能和调整 753
第十四章锁定 753
14.1锁管理器 753
14.1.1锁管理器和孤立级别 754
14.1.2原子锁 755
14.1.3死锁 755
14.2用户数据的锁类型 759
14.2.1锁的类型 759
14.2.2锁的粒度 763
14.2.5查看锁 768
14.2.3锁的持续时间 768
14.2.4锁的拥有关系 768
14.3锁的兼容性 776
14.4锁定的内部结构 777
14.4.1锁块 779
14.4.2锁拥有者块 781
14.4.3 syslockinfo表 781
14.5绑定连接 783
14.6行级锁定和页面级锁定 787
14.6.1锁的提升 788
14.7锁定暗示和跟踪标记 788
14.8总结 789
第十五章查询处理器 791
15.1 SQL管理器 791
15.2编译和优化 792
15.2.1编译 793
15.2.2优化 794
15.2.3查询优化器的工作方式 796
15.2.4联接选择 814
15.2.5其他处理策略 819
15.2.6维护统计信息 821
15.3过程缓存 826
15.4使用存储过程和缓存机制 829
15.4.1特殊缓存 830
15.4.2自动参数化 830
15.4.3 sp_executesql过程 831
15.4.4准备和执行方法 831
15.4.5共享缓存计划 832
15.4.6检查计划缓存 832
15.4.7缓存中的多个计划 834
15.4.8使用存储过程和其他缓存机制的时间 835
15.4.9重新编译存储过程 836
15.4.10存储过程的其他好处 837
15.5执行 838
15.6总结 838
第十六章调整查询 839
16.1开发小组 840
16.2应用程序和数据库设计 840
16.2.1规范化数据库 841
16.2.1评估重要事务 842
16.2.3精简表行的长度和键 844
16.3计划高峰使用 845
16.4交互式系统的感知响应时间 846
16.5原型、基准程序和测试 847
16.5.1开发方法学 850
16.6创建有用的索引 851
16.6.1谨慎选择群集索引 852
16.6.2使非群集索引具有较高的选择性 853
16.6.3裁剪对重要事务的索引 854
16.6.4注意列的顺序 856
16.6.5联接中使用的索引列 857
16.6.6根据需要创建或删除索引 857
16.6.7 Index Tuning Wizard 858
16.7监视查询的性能 860
16.7.1 STATISTICS IO 860
16.7.2 STATISTICS TIME 864
16.7.3计划显示 865
16.7.4使用查询暗示 879
16.7.5存储过程的优化 883
16.8并行性和一致性的权衡 885
16.9解决阻塞的问题 886
16.9.1索引和阻塞 888
16.10.1循环死锁示例 890
16.10解决死锁问题 890
16.10.2转换死锁示例 891
16.10.3防止死锁 893
16.10.4处理死锁 893
16.10.5自愿作为死锁的牺牲者 894
16.10.6观察锁定活动 894
16.10.7标识阻塞的原因 895
16.10.8锁暗示 901
16.11 隔离OLTP和DSS应用程序 905
16.12环境因素 905
16.12.1区分大小写 906
16.12.2可控性和ANSI兼容设置 907
16.12.3区域特定的SET选项 911
16.13总结 911
17.1操作系统的配置设置 913
17.1.1任务管理 913
第十七章配置和性能监视 913
17.1.2资源分配 914
17.1.3 PAGEFILE.SYS的位置 915
17.1.4文件系统选择 915
17.1.5不重要的服务 915
17.1.6网络协议 916
17.2 SQL Server的配置设置 916
17.2.1服务器范围的选项 916
17.2.2缓冲区管理器选项 928
17.2.3 SQLSERVER.EXE的启动参数 929
17.3系统维护 930
17.4监视系统行为 931
17.4.1 SQLProfiler 931
17.4.2 Syatem Monitor 946
17.4.3其他性能监视因素 955
17.5总结 955
参考书目 957