Troubleshooting a “Forever” Recovering Database

1.         Step 1 – check the ErrorLog to see the progress, the remaining seconds, and the spid.

2.         Step 2 - estimate the recovering progress by running the script below every several minutes to see if the usages of the diskI/O and CPU have increased (or you can also find similar info from the errorlog). If yes, it is in progress, but just takes a while.

SELECT * FROM sys.sysprocesses
SELECT * FROM sys.dm_exec_requests 

3.         Step 3 – find out the number of VLFs. The larger the VLFs, the longer the recovering
-- If the database is online
DBCC LogInfo (DBName) 
 -- If the database is offline, you can use the Windbg tool to analyze the dump file
http://msdn.microsoft.com/en-us/windows/hardware/hh852365.aspx

4.         Step 4 – If no changes on I/O and CPU for a long time, consider to restart SQL Server. In some case, you may need to install the patches. For details, see

a.         FIX: Slow performance when you recover a database if there are many VLFs inside the transaction log in SQL Server 2005, in SQL Server 2008 or in SQL Server 2008 R2 (https://support.microsoft.com/kb/2455009)

b.         FIX: It takes a long time to restore a database in SQL Server 2008 R2 or in SQL Server 2008 or in SQL 2012 (https://support.microsoft.com/kb/2653893)

c.          Procedures for using the patches above: (1) Stop SQL Server in production, (2) install the patch on test, (3) copy the servervr.exe and SQLOS.dll to production, and (4) restart the SQL Server in production.

5.         Sometime, when you try to kill a spid, but the spid keeps rolling back, you can run the following to see how long it will be done. If it takes days to finish the roll back, you can either wait or restart SQL Server. Remember, after the restart, SQL Server will still be in recovering state (rolling back) for a long time if the VLFs are too large.

 KILL <spid> WITH statusonly

6.         Best practices to prevent a long time ‘recovering’
a.         Log file – auto-growth by 200-300 MB, do not use %
b.         Frequently backup log files to reduce VLFs, or
c.          Shrink the log files
d.         Install the latest updates and patches 

SQL Server Database States and Switch Paths


  • Database States
      A database is always in one specific state. For example, these states include ONLINE, OFFLINE, or SUSPECT. To verify the current state of a database, select the state_desc column in the sys.databases catalog view or the Status property in the DATABASEPROPERTYEX function.
  • Database State Definitions
     The following table defines the database states.    
State
Definition
ONLINE
Database is available for access. The primary filegroup is online, although the undo phase of recovery may not have been completed.
-- Make the Database Online
ALTER DATABASE [myDB] SET ONLINE WITH ROLLBACK IMMEDIATE 
OFFLINE
Database is unavailable. A database becomes offline by explicit user action and remains offline until additional user action is taken. For example, the database may be taken offline in order to move a file to a new disk. The database is then brought back online after the move has been completed.
-- Take the Database Offline
ALTER DATABASE [myDB] SET OFFLINE WITH
ROLLBACK 
IMMEDIATE | ROLLBACK AFTER integer [ SECONDS ] | NO_WAIT
RESTORING
One or more files of the primary filegroup are being restored, or one or more secondary files are being restored offline. The database is unavailable.
RECOVERING
Database is being recovered. The recovering process is a transient state; the database will automatically become online if the recovery succeeds. If the recovery fails, the database will become suspect. The database is unavailable.
RECOVERY PENDING
SQL Server has encountered a resource-related error during recovery. The database is not damaged, but files may be missing or system resource limitations may be preventing it from starting. The database is unavailable. Additional action by the user is required to resolve the error and let the recovery process be completed.
SUSPECT
At least the primary filegroup is suspect and may be damaged. The database cannot be recovered during startup of SQL Server. The database is unavailable. Additional action by the user is required to resolve the problem.
EMERGENCY
User has changed the database and set the status to EMERGENCY. The database is in single-user mode and may be repaired or restored. The database is marked READ_ONLY, logging is disabled, and access is limited to members of the sysadmin fixed server role. EMERGENCY is primarily used for troubleshooting purposes. For example, a database marked as suspect can be set to the EMERGENCY state. This could permit the system administrator read-only access to the database. Only members of the sysadmin fixed server role can set a database to the EMERGENCY state.






























  • Relationships of Database States





《SQL Server 2012实施与管理实战指南》 by 俞榕刚,朱桦等与《Microsoft SQL Server企业级平台管理实践》 by 徐海蔚两书的异同

Legend:

Items in Green are new in SQL Server 2012实施与管理实战指南 (新版), but not in Microsoft SQL Server企业级平台管理实践(老版).
Item in Red was in Microsoft SQL Server企业级平台管理实践(老版), but not in SQL Server 2012实施与管理实战指南(新版)
Items in the green background are in both editions, but revised.


新版
老版
1部分  数据库系统的选型和部署
1  SQL Server的安装和升级 2
1.1  数据库安装过程介绍 3
1.1.1  setup.exe执行过程 3
1.1.2  重要的数据库的安装日志文件 5
1.2  单机版本的数据库安装和打补丁 13
1.2.1  安装注意事项 13
1.2.2  SlipStream方式进行安装 14
1.2.3  Product Update方式进行安装 15
1.2.4  常见安装问题 16
1.3  特殊版本的数据库安装 18
1.4  群集环境下数据库的安装和升级 20
1.5  数据库的升级 27
1.6  小结 30
2  选择必要的高可用性和灾难恢复技术 31
2.1  什么是SQL Server的“高可用性”与“灾难恢复” 31
2.2  SQL Server故障转移群集 33
2.2.1  Windows故障转移群集 33
2.2.2  SQL Server故障转移群集 36
2.2.3  SQL Server群集什么时候会发生“故障转移” 40
2.2.4  SQL Server群集的拓扑结构 43
2.2.5  SQL 2012对故障转移群集的改进 44
2.2.6  故障转移群集的故障排查 55
2.3  日志传送 58
2.3.1  日志传送的结构 59
2.3.2  日志传送的工作机制 60
2.3.3  日志传送作业的执行间隔 64
2.3.4  日志传送的故障转移 65
2.3.5  日志传送的监控和故障排查 68
2.4  数据库镜像 71
2.4.1  数据库镜像的基本概念 71
2.4.2  数据库镜像操作模式 74
2.4.3  客户端连接重定向及超时控制 78
2.4.4  数据库镜像的监控和故障排查 81
2.5  复制 84
2.5.1  复制的基本概念 84
2.5.2  复制的类型 86
2.5.3  灾难恢复和复制 90
2.6  高可用和灾难恢复技术的选择 91
2.6.1  高可用和灾难恢复技术的比较 91
2.6.2  高可用和灾难恢复技术的组合 97
2.7  小结 100
3  新一代的高可用技术AlwaysOn 101
3.1  AlwaysOn的基本架构 102
3.2  AlwaysOn的数据同步原理 106
3.3  AlwaysOn的可用性模式 107
3.4  AlwaysOn的故障转移形式 111
3.5  创建一个AlwaysOn可用性组 118
3.6  可读的辅助数据库 127
3.7  监视AlwaysOn可用性组的运行状态 133
3.8  小结 138
4  数据库连接组件编程机理 140
4.1  数据库应用编程方法概述和组件架构 141
4.1.1  WDAC编程 141
4.1.2  SNAC编程 162
4.1.3  ADO.NET编程 163
4.2  连接字符串 166
4.3  连接池 169
4.4  Connection TimeoutCommand Timeout 173
4.5  使用BID Tracing来跟踪检查应用程序的执行 181
4.6  小结 185
2部分  SQL Server日常管理
5  启动SQL Server服务和数据库 188
3 SQL Server服务或数据库不可访问 
5.1  SQL Server服务启动步骤 189
3.1 SQL Server服务启动顺序 
5.1.1  从注册表读取SQL Server启动信息 190
3.1.1  从注册表读取SQL Server启动信息
5.1.2  检测硬件,配置内存与CPU 193
3.1.2  检测硬件,配置内存与CPU
3.1.3   初始化MS DTC
5.1.3  数据库启动 195
3.1.4  系统数据库启动 
3.1.6  系统msdb数据库和其它用户数据库
5.1.4  准备网络连接 195
3.1.5   准备网络连接
5.2  数据库状态切换 198
3.2 数据库状态切换及Recovery 
5.3  数据库长时间处于RECOVERING状态 201
5.4  数据库不能启动的常见原因和解决办法 206
3.3 系统数据库不能启动的常见原因和解决方法 
5.4.1  master数据库不能启动 206
3.3.1  master数据库不能启动
5.4.2  资源数据库 208
3.3.2  资源数据库
5.4.3  model数据库 210
3.3.3  model数据库
5.4.4  tempdb数据库 212
3.3.4  tempdb数据库
5.4.5  用户数据库 214
3.4 用户数据库常见问题和解决方法 
5.5  群集环境下,数据库资源不能ONLINE的常见原因 220
3.5 实例:修复Recovery失败的数据库 
5.5.1  由于单机原因导致数据库服务无法启动 222
5.5.2  由于SQL Server所依赖的资源失败所导致 223
5.5.3  由于群集服务无法连接导致数据库资源失败 224
5.6  小结 228
6  连接的建立和问题排查 229
5章 连接与认证 
6.1  协议的选择与别名 230
5.1 协议的选择与别名 
6.1.1  服务器网络配置 231
5.1.1  服务器网络配置
6.1.2  SQL Server Browser的作用 233
5.1.2  SQL Server Browser的作用
6.1.3  客户端网络配置 235
5.1.3  客户端网络配置
6.1.4  客户端网络连接选择机制 239
5.1.4  客户端网络连接选择机制
6.2  连接失败检测步骤——命名管道 241
5.2 连接失败检测步骤——命名管道 
6.2.1  SQL Server命名管道工作原理 242
6.2.2  客户端的命名管道配置 243
6.2.3  命名管道连接问题的解决步骤 245
6.2.4  一些常见的连接问题 246
6.3  连接失败检测步骤——TCP/IP 247
5.3 连接失败检测步骤——TCP/IP 
6.3.1  SQL Server监听的TCP/IP端口号 248
6.3.2  客户端的TCP/IP协议配置 249
6.3.3  TCP/IP连接的keepalive机制 251
6.3.4  配置SQL Serverkeepalive配置 252
6.3.5  配置客户端的keepalive配置 253
6.3.6  TCP/IP连接问题的解决步骤 254
6.4  一般性网络错误 258
5.4 一般性网络错误(General Network Error 
6.5  利用Ring Buffer排查连接问题 266
6.6  小结 271
7  身份认证与连接加密 272
7.1  SQL Server的认证方式 273
5.5 认证与代理问题 
7.1.1  SQL Server认证模式和密码管理 273
5.5.1  SQL Server认证模式和密码管理
7.1.2  Windows认证模式 274
5.5.2  Windows认证模式
7.1.3  常见认证问题 286
7.1.4  Delegation的配置要求 288
5.5.3  Delegation的配置要求
7.2  包含数据库认证 295
7.2.1  创建包含数据库 296
7.2.2  使用包含数据库认证 299
7.2.3  包含数据库认证的安全须知 303
7.3  连接加密和证书 305
7.3.1  SQL Server的连接加密 306
7.3.2  使用证书来加密SQL Server连接 313
7.4  小结 319
8  数据库空间管理 320
1章 数据库空间管理 
大同小异
8.1  数据文件的空间使用和管理 321
8.1.1  数据文件存储结构 321
8.1.2  表存储结构 323
8.1.3  比较存储结构对空间使用的影响 332
8.2  日志文件的空间使用和管理 337
8.3  空间使用计算方法 341
8.4  tempdb的空间使用 346
8.5  数据文件的收缩 353
8.6  日志文件不停地增长 362
8.7  文件自动增长和自动收缩 367
8.8  小结 370
9  数据库备份与恢复 371
2章 数据库备份与恢复 
9.1  备份概述 372
2.1 备份概述 
9.2  选择备份策略和恢复模式 375
2.2 选择备份策略和恢复模式 
9.2.1  简单恢复模式下的备份 376
2.2.1  简单恢复模式下的备份
9.2.2  完整恢复模式下的备份 377
2.2.2  完整恢复模式下的备份
9.2.3  文件或文件组备份 381
2.2.3  文件或文件组备份
9.3  选择数据库还原方案 382
2.3 选择数据库还原方案 
9.3.1  数据库完整还原 384
2.3.1  数据库完整还原
9.3.2  文件还原 386
2.3.2  文件还原
9.3.3  页面还原 387
2.3.3  页面还原
9.3.4  段落还原 390
2.3.4  段落还原
9.3.5  还原方案小结 393
2.3.5  还原方案小结
9.3.6  孤立用户故障排除 394
2.3.6  孤立用户故障排除 
9.4  系统数据库备份与恢复 395
2.5 系统数据库备份与恢复 
9.4.1  master数据库 396
2.5.1  master数据库
9.4.2  model数据库 397
2.5.2  model数据库
9.4.3  msdb数据库 397
2.5.3  msdb数据库
9.4.4  tempdb和资源数据库 398
2.5.4  tempdb和资源数据库
9.5  带有FILESTREAM功能的数据库备份和恢复 399
9.6  应对由于备份损坏导致的还原错误 401
2.4 应对由于备份损坏导致的还原错误 
9.7  实例:将数据库系统在一台新服务器上恢复 403
2.6 实例:将数据库系统在一台新服务器上恢复  
9.8  小结 408
10  数据库损坏修复 409
4章 数据库损坏修复 
10.1  常见错误解读 409
4.1 常见错误解读 
10.1.1  823 409
4.1.1 823
10.1.2  824 410
4.1.2 824
10.1.3  605 412
4.1.1 605
10.1.4  其他 413
4.1.1 其他
10.2  DBCC CHECKDB 414
4.2 DBCC CHECKDB 
10.2.1  DBCC CHECKDB在做什么 414
4.2.1  DBCC CHECKDB在做什么
10.2.2  DBCC CHECKDB提供的修复方法 418
4.2.2  DBCC CHECKDB提供的修复方法
10.2.3  如何在超大数据库上运行DBCC CHECKDB 420
4.2.3  如何在超大数据库上运行DBCC CHECKDB 
10.3  不同部位损坏的应对 423
10.3.1  备份文件损坏 424
10.3.2  日志文件损坏 426
10.3.3  用户数据文件损坏 427
10.3.4  系统数据库损坏 431
10.4  如何从损坏的数据库导出数据 432
10.5  如何使用TableDiff工具发现哪些数据有丢失或改变 439
10.6  数据库反复损坏问题应对 440
4.3 数据库反复损坏问题应对 
10.6.1  SQL I/O 管理操作方法 441
4.3.1  SQL I/O 管理操作方法
10.6.2  确保系统I/O正常 443
4.3.2  确保系统I/O正常
10.6.3  SQL层面能够做的设置 448
4.3.3  SQL层面能够做的设置
10.7  Database MirroringAlwaysOn的页面自动修复功能 449
4.3.4  Database Mirroring的页面自动修复功能
10.8  小结 452
3部分  SQL Server资源调度与性能调优
11  SQL Server内存分配理念和常见内存问题 454
6 SQL Server内存分配理念和常见内存问题 
11.1  从操作系统层面看SQL Server内存分配 457
6.1 从操作系统层面看SQL Server内存分配 
11.1.1  Windows的一些内存术语 457
6.1.1  Windows的一些内存术语 
11.1.2  32位下Windows的地址空间及AWE 460
6.1.2  32位下Windows的地址空间及AWE
11.1.3  Windows层面上的内存使用检查 463
6.1.3  Windows层面上的内存使用检查
11.1.4  内存使用和其他系统资源的关系 468
6.1.4  内存使用和其他系统资源的关系
11.1.5  SQL内存使用和Windows之间的关系 470
6.1.5  SQL内存使用和Windows之间的关系
11.1.6  SQL内存使用量陡然下降现象 472
6.1.6  SQL内存使用量陡然下降现象
11.1.7  案例分析 474
6.1.7  案例分析
11.1.8  如何“合理”配置SQL Server内存 476
6.1.8  如何“合理”配置SQL Server内存 
11.2  SQL Server内部独特的内存管理模式 477
6.2 SQL Server内部独特的内存管理模式 
11.2.1  内存使用分类 478
6.2.1  内存使用分类
11.2.2  32位下各部分内存的分布和大小限制 482
6.2.2  各部分内存的分布和大小限制 
11.2.3  SQL Server在不同服务器配置下各部分内存的最高使用上限 484
11.2.4  一些内存使用错误理解 485
6.2.3  一些内存使用错误理解 485
11.3  SQL Server内存使用状况分析方法 487
6.3 SQL Server内存使用状况分析方法 
11.3.1  SQL性能计数器 488
6.3.1  SQL性能计数器 488
11.3.2  内存动态管理视图(DMV 490
6.3.2  内存动态管理视图(DMV 
11.4  数据页缓冲区压力分析 497
6.4 数据页缓冲区压力分析 
11.4.1  表现特征 497
6.4.1  表现特征
11.4.2  确定压力来源和解决办法 500
6.4.2  确定压力来源和解决办法
11.4.3   如何发现内存使用比较多的语句
6.4.3   如何发现内存使用比较多的语句
11.5  Stolen Memory缓存压力分析 508
6.5 Stolen Memory缓存压力分析 
11.5.1  Stolen缓存区与数据页缓存区的相互关系 509
6.5.1  Stolen缓存区与数据页缓存区的相互关系
11.5.2  内部压力与外部压力 510
6.5.2  内部压力与外部压力 
11.5.3  表现特征与解决办法 510
6.5.3  表现特征与解决办法
11.6  Multi-page缓存区压力分析 512
6.6 Multi-page缓存区压力分析 
11.7  常见内存错误与解决办法 515
6.7 常见内存错误与解决办法 
11.7.1  错误701 516
6.7.1  错误701 
11.7.2  错误8645 520
6.7.2  错误8645 
11.7.3  SQL Server无法创建新的线程 524
6.7.3  SQL Server无法创建新的线程 
11.8  SQL Server 2012 内存管理的新变化 525
11.8.1  总体变化 527
11.8.2  AWELockedPages的变化 528
11.8.3  内存相关的诊断工具的变化 530
11.8.4  SQL Server 2012内存相关配置的变化 533
11.8.5  其他改变 535
11.9  小结 535
6.8 小结 
12  SQL Server I/O问题 537
7 SQL Server IO问题 
12.1  SQL ServerI/O操作 537
7.1 SQL ServerI/O操作 
12.2  系统级I/O问题判断 544
7.2 系统级I/O问题判断 
12.3  数据库引擎错误833 548
7.3 数据库引擎错误833 
12.4  I/O问题的SQL Server内部分析 550
7.4 IO问题的SQL Server内部分析 
12.5  硬盘压力测试 558
7.5 硬盘压力测试 
12.6  圣剑——Windows提供的新的底层监测功能 564
12.7  小结 570
7.6 小结 
13  任务调度与CPU问题 572
8章 任务调度与CPU问题 
13.1  SQL Server独特的任务调度算法 573
8.1 SQL Server独特的任务调度算法(SQLOS) 
13.1.1  SQLOS的任务调度算法 575
8.1.1  SQLOS的任务调度算法 
13.1.2  任务调度健康监测及常见问题 580
8.1.2  任务调度健康监测及常见问题 
13.1.3  一个内存转储文件的分析调试过程 583
13.1.4  案例分析 588
8.1.4  案例分析
13.2  SQL Server CPU 100%问题 592
8.2 SQL CPU %问题 
13.3  OLTPData Warehouse系统差别及常用性能阈值 597
8.3 OLTPData Warehouse系统差别及常用性能阀值 
13.3.1  OLTP系统 597
8.3.1  OLTP系统 
13.3.2  Data Warehouse系统 604
8.3.2  Data Warehouse系统 
13.4  小结 609
8.4 小结 
14  阻塞与死锁——知识准备 611
9章 阻塞与死锁——知识准备 
14.1  锁产生的背景 612
9.1 锁产生的背景 
14.2  锁资源模式和兼容性 614
9.2 锁资源模式和兼容性 
14.3  事务隔离级别与锁的申请和释放 618
9.3 事务隔离级别与锁的申请和释放 
14.4  如何监视锁的申请、持有和释放 628
9.4 如何监视锁的申请、持有和释放 
14.4.1  检查一个连接当前锁持有的锁 628
9.4.1  检查一个连接当前锁持有的锁 
14.4.2  监视语句执行过程中SQL对锁的申请和释放行为 629
9.4.2  监视语句执行过程中SQL对锁的申请和释放行为 
14.5  锁的数量和数据库调优的关系 630
9.5 锁的数量和数据库调优的关系 
14.5.1  一个常见的SELECT动作要申请的锁 634
9.5.1  一个常见的SELECT动作要申请的锁 
14.5.2  一个常见的UPDATE动作要申请的锁 639
9.5.2  一个常见的UPDATE动作要申请的锁
14.5.3  一个常见的DELETE动作要申请的锁 641
9.5.3  一个常见的DELETE动作要申请的锁
14.5.4  一个常见的INSERT动作要申请的锁 643
9.5.4  一个常见的INSERT动作要申请的锁 
14.6  小结 645
9.6 结论 
9.7 数据库引擎中基于行版本控制的隔离级别 
15  阻塞与死锁——问题定位与解决 646
10章 阻塞与死锁——问题定位与解决 
15.1  阻塞问题定位方法及实例演示 647
10.1 阻塞问题定位方法及实例演示 
15.2  如何捕捉不定时出现的阻塞信息 655
15.3  常见阻塞原因与解决方法 658
10.2 常见阻塞原因与解决方法 
15.4  案例分析:连接池与阻塞 666
10.3 案例分析:连接池(Connection Pooling)与阻塞 
15.4.1  连接池与SQL Server 666
10.3.1  连接池与SQL Server
15.4.2  正常情况下连接池在SQL Server端的处理方式 667
10.3.2  正常情况下连接池在SQL Server端的处理方式
15.4.3  程序端意外情况下SQL Server端可能导致的问题——应用端超时 671
10.3.3  程序端意外情况下SQL Server端可能导致的问题——应用端超时
15.4.4  程序端意外情况下SQL Server端可能导致的问题——应用层事物未提交 675
10.3.4  程序端意外情况下SQL Server端可能导致的问题——应用层事物未提交
15.5  死锁问题定位及解决方法 680
10.4 死锁问题定位及解决方法 
15.5.1  死锁所在的资源和检测 680
10.4.1  死锁所在的资源和检测 
15.5.2  问题定位 682
10.4.2  问题定位 
15.5.3  解决办法 686
10.4.3  解决办法
15.5.4  动手实验 687 (名称不同而已,内容基本一样)
10.4.4  案例分析
15.6  小结 698
16  从等待状态判断系统资源瓶颈 699
11章 从等待状态判断系统资源瓶颈 
16.1  LCK_xx类型 701
11.1 LCK_xx类型 
16.2  PAGEIOLATCH_xWRITELOG 702
11.2 PAGEIOLATCH_x WRITELOG 
16.3  PAGELATCH_x 704
11.3 PAGELATCH_x 
16.4  tempdb上的PAGELATCH 708
11.4 Tempdb上的PAGELATCH 
16.5  其他资源等待 710
11.5 其他资源等待 
16.6  最后一道瓶颈:许多任务处于RUNNABLE状态 713
11.6 最后一道瓶颈:许多任务处于Runnable状态 
16.7  小结 715
11.7 小结
17  语句调优——知识准备 719
12章 语句调优——知识准备 
17.1  索引与统计信息 723
12.1 索引与统计信息 
17.1.1  索引上的数据检索方法 723
12.1.1  索引上的数据检索方法
17.1.2  统计信息的含义与作用 727
12.1.2  统计信息的含义与作用 
17.1.3  统计信息的维护和更新 732
12.1.3  统计信息的维护和更新
17.2  编译与重编译 736
12.2 编译与重编译 
17.3  读懂执行计划 750
12.3 读懂执行计划 
17.3.1  连接 754
12.3.1  联接(Join
17.3.2  其他常见的运算操作 762
12.3.2  其他常见的运算操作
17.4  读懂语句运行统计信息 765
12.4 读懂语句运行统计信息 
17.4.1  Set statistics time on 766
12.4.1  Set statistics time on
17.4.2  Set statistics io on 768
12.4.2  Set statistics io on
17.4.3  Set statistics profile on 770
12.4.3  Set statistics profile on
17.5  小结 775
18  语句调优——问题定位与解决方法 776
13章 语句调优-问题定位与解决方法 
18.1  是否是因为做了物理I/O而导致的性能不佳 777
13.1 是否是因为做了物理IO而导致的性能不佳 
18.2  是否是因为编译时间长而导致性能不佳 780
13.2 是否是因为编译时间长而导致性能不佳 
18.3  判断执行计划是否合适 784
13.3 判断执行计划是否合适 
18.3.1  预估cost的准确性 784
13.3.1  预估cost的准确性
18.3.2  Index Seek还是Table Scan 790
13.3.2  Index Seek还是Table Scan
18.3.3  Nested Loops还是Hash (Merge) Join 794
13.3.3  Nested Loops还是Hash (Merge) Join 
18.3.4  filter运算的位置 795
13.3.4  filter运算的位置 
18.3.5  确认问题产生的原因 798
13.3.5  确认问题产生的原因 
18.4  Parameter Sniffing 800
13.4 Parameter Sniffing 
18.4.1  什么是“Parameter Sniffing 801
13.4.1  什么是“Parameter Sniffing 
18.4.2  本地变量的影响 802
13.4.2  本地变量的影响
18.4.3  Parameter Sniffing的解决方案 804
13.4.3  Parameter Sniffing的解决方案
18.5  调整数据库设计来优化语句性能 814
13.5 调整数据库设计来优化语句性能 
18.5.1  调整索引 814
13.5.1  调整索引
18.5.2  计划指南 821
13.5.2  计划指南
18.6  调整语句设计提高性能 829
13.6 调整语句设计提高性能 
18.6.1  筛选条件与计算字段 829
13.6.1  筛选条件与计算字段
18.6.2  会在运行前改变值的变量 832
13.6.2  会在运行前改变值的变量
18.6.3  临时表和表变量 834
13.6.3  临时表和表变量
18.6.4  尽可能限定语句的复杂度 836
13.6.4  尽可能限定语句的复杂度
18.7  小结 838
4部分  SQL Server常用日志信息与推荐搜集方法
19  SQL Server常用日志信息与推荐搜集方法 840
14章 常用SQL Server系统信息与搜集方法 
19.1  Windows事件日志 841
14.1 Windows 事件日志(Event Log 
19.2  SQL Server errorlog文件 843
14.2 SQL Server Errorlog文件 
19.3  性能监视器 845
14.3 性能监视器(Performance Monitor 
19.4  SQL Trace文件 851
14.4 SQL Trace文件 
19.4.1  SQL Trace文件的收集方法 851
14.4.1  SQL Trace文件的收集方法
19.4.2  SQL Trace文件的分析方法 860
14.4.2  SQL Trace文件的分析方法
19.4.3  自动化分析SQL Trace 862
14.4.3  自动化分析SQL Trace 
19.5  系统管理视图跟踪 866
14.5 系统管理视图跟踪 
19.6  SQLDIAG工具 868
14.6 自动化信息收集:SQLDiag工具 
19.7  强烈推荐:PSSDIAG工具 873
19.7.1  使用PSSDIAG收集信息 874
19.7.2  自动化分析PSSDIAG收集的信息 876
19.8  系统自动监视工具——Performance Dashboard 879
14.7 系统自动监视工具 - Performance Dashboard
19.9  小结 882

具体差异:

除新版增加了第1 - 4章外,新版和老版还有如下的差异:

1.      P. 189
(1)     添加5. 群集环境下SQL Server资源无法保持正常在线
(2)     添加the last bullet (在群集环境下启动,上线或切换)
2.      PP. 191-192 (检查无法启动SQL Server时,除了原先的Windows System LogApplication Event Log, 又加了Process Monitor
(1)     191页最后一段(当User没权限去读注册表时),老版用Windows System Log查错,新版是用Process Monitor,然后用Access Denied过滤。
(2)     192页最后,加了运行NET HELPMSG 3去进一步了解Operating System Error 3的含义。
3.      P.194 – Error Log 的内容除了老版的,还
(1)     添加了NUMANon-uniform memory accessDynamic Lock Allocation的信息
(2)     添加了CLR版本等信息
4.      PP. 201 – 205
(1)     Recovering State有扩展,增加了一个案例。
5.      PP. 220-226
(1)     添加 5.5 - 群集环境下,数据库资源不能ONLINE的常见原因 220
6.      老版3.1.3 初始化MS DTC被删除(pp. 76-77)
7.      老版3.5 实例:修复Recovery失败的数据库 pp.95 -98
8.      老版第5章的连接与认证 ,在新版中分成了2章:第6 - 连接和第7 - 认证。内容有加强,特别在认证部分,增加了包含数据库认证和加密。
9.      新版第8章与老版第1章内容上大同小异,单在组织上有些调整。
10.   新版第九章增加了9.5 - 带有FILESTREAM功能的数据库备份和恢复。
11.   新版第10章数据库损坏修复 增加了10.3  不同部位损坏的应对,10.4  如何从损坏的数据库导出数据,10.5  如何使用TableDiff工具发现哪些数据有丢失或改变,和10.7  中关于AlwaysOn的页面自动修复功能的那部分。
12.   新版第11章主要增加了11.8 - SQL Server 2012 内存管理的新变化。 
13.   新版第12章增加了12.6  圣剑——Windows提供的新的底层监测功能 
14.   新版第13章增加了一节13.1.3  一个内存转储文件的分析调试过程 
15.   新版第14章增加了不同事务隔离等级下,事务不同表现的例子。见pp.622 – 627中的表14-6, 14-7, 14-8, 14-9, and 14-10
16.   老版的9.7 - 数据库引擎中基于行版本控制的隔离级别在新版中被插入到14.3(包括表14-9)。
17.   新版第15章增加了15.2  如何捕捉不定时出现的阻塞信息 15.6  小结 。至于15.5.4 动手实验 与老版的10.4.4 案例分析只是名称不同而已,内容基本一样。
18.   新版第1818.4.3  Parameter Sniffing的解决方案增加了一个新的解决方法:4. 一个另类的解决方法(pp.812 – 814.
19.   新版第19章增加了19.7  强烈推荐:PSSDIAG工具。