搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
SQL Server 2008查询性能优化
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787115230294
  • 作      者:
    (美)Grant Fritchey,Sajal Dam著
  • 出 版 社 :
    人民邮电出版社
  • 出版日期:
    2010
收藏
作者简介
    弗里奇(Grant Fritchey),为FM Global(一家行业领先的工程和保险公司)工作,担任首席DBA。他使用各种语言(如VB、C#和Java等)开发了许多大规模的应用程序,从版本6.0开始使用SQL Server。他曾经为3家失败的.com公司担任财务和咨询工作,还是Dissecting SQL Server Execution Plans一书的作者。<br>    达姆(Sajal Dam),拥有位于印度班加罗尔的印度理工学院的计算机科学技术硕士学位,并且使用微软技术超过16年。他已经在设计数据库应用和管理软件开发方面拥有了很广泛的背景。Saial还在从前端网页到后端数据库的基于微软技术的应用程序上,具备了故障定位和性能优化的大量经验。他有许多为《财富》500强公司设计可伸缩的数据库解决方案和最大化数据库环境性能的经验。
展开
内容介绍
    《SQL Server 2008查询性能优化》通过大量实例,详细介绍了SQL Server数据库系统优化的各种方法和技巧。内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面。最后以一个实际的工作负载将所有技巧联系起来,并且提供了“宝典”式的最佳实践列表。<br>    《SQL Server 2008查询性能优化》适合于关心数据库应用系统性能的开发人员和数据库管理人员阅读。通过阅读《SQL Server 2008查询性能优化》,不仅可以学习到数据库性能管理的许多知识和技巧,还有助于养成良好的编程习惯,为实现高性能的数据库应用系统打下基础。
展开
精彩书摘
    在性能分析期间,一般在不同的数据列(如Duration、CPU和:Reads)上排序以确定相应数字最大的查询。如果脱机排序,就能降低在与SQL Server交互时必须进行的Profiler活动。排序捕捉到的SQL跟踪输出的方法,步骤如下。<br>    (1)捕捉跟踪,不做任何排序(或分组)。<br>    (2)保存跟踪输出到一个跟踪文件。<br>    (3)打开跟踪文件并按照需要在特定的数据列上排序(或分组)跟踪文件输出。<br>    3.45远程运行profiler<br>    直接在生产服务器上运行测试工具一般不是一个好办法。Profiler有一个大型的用户界面,因此,在其他机器上运行它更好。与系统监视器相似,Profiler不应该通过终端服务会话来运行,因为这样工具的主要部分仍然在服务器上运行。在直接将跟踪输出收集到一个文件时,保存在Profiler运行的本地文件上。这仍然是比通过系统存储过程将Profiler作为服务器端跟踪来运行更加资源密集的操作。使用系统存储过程仍然是最好的选择。
展开
目录
第1章 SQL查询性能调整 1<br>1.1 性能调整过程 2<br>1.1.1 核心过程 2<br>1.1.2 迭代过程 4<br>1.2 性能vs.价格 7<br>1.2.1 性能目标 7<br>1.2.2 “足够好”的调整 7<br>1.3 性能基线 8<br>1.4 工作的重点 9<br>1.5 SQL Server性能杀手 10<br>1.5.1 低质量的索引 10<br>1.5.2 不精确的统计 11<br>1.5.3 过多的阻塞和死锁 11<br>1.5.4 不基于数据集的操作 11<br>1.5.5 低质量的查询设计 12<br>1.5.6 低质量的数据库设计 12<br>1.5.7 过多的碎片 12<br>1.5.8 不可重用的执行计划 13<br>1.5.9 低质量的执行计划 13<br>1.5.10 频繁重编译计划 13<br>1.5.11 游标的错误使用 13<br>1.5.12 错误配置数据库日志 14<br>1.5.13 过多使用或者错误配置tempdb 14<br>1.6 小结 14<br><br>第2章 系统性能分析 15<br>2.1 性能监视器工具 15<br>2.2 动态管理视图 17<br>2.3 硬件资源瓶颈 18<br>2.3.1 识别瓶颈 18<br>2.3.2 瓶颈解决方案 19<br>2.4 内存瓶颈分析 19<br>2.4.1 SQL Server内存管理 20<br>2.4.2 Available Bytes 23<br>2.4.3 Pages/sec和Page Faults/sec计数器 23<br>2.4.4 Buffer Cache Hit Ratio 24<br>2.4.5 Page Life Expectancy 24<br>2.4.6 Checkpoint Pages/sec 24<br>2.4.7 Lazy writes/sec 24<br>2.4.8 Memory Grants Pending 25<br>2.4.9 Target Server Memory(KB)和Total Server Memory(KB) 25<br>2.5 内存瓶颈解决方案 25<br>2.5.1 优化应用程序工作负载 26<br>2.5.2 为SQL Server分配更多内存 27<br>2.5.3 增加系统内存 27<br>2.5.4 更换32位处理器为64位处理器 27<br>2.5.5 启用3GB进程空间 28<br>2.5.6 在32位SQL Server中使用4GB以上内存 28<br>2.6 磁盘瓶颈分析 29<br>2.6.1 磁盘计数器 30<br>2.6.2 % Disk Time 30<br>2.6.3 Current Disk Queue Length 31<br>2.6.4 Disk Transfers/sec 31<br>2.6.5 Disk Bytes/sec 32<br>2.6.6 Avg. Disk Sec/Read和Avg. Disk Sec/Write 32<br>2.7 磁盘瓶颈解决方案 32<br>2.7.1 优化应用程序工作负载 33<br>2.7.2 使用更快的磁盘驱动器 33<br>2.7.3 使用一个RAID阵列 33<br>2.7.4 使用SAN系统 35<br>2.7.5 恰当地对齐磁盘 35<br>2.7.6 使用电池后备的控制器缓存 36<br>2.7.7 添加系统内存 36<br>2.7.8 创建多个文件和文件组 36<br>2.7.9 将表和索引放在不同的磁盘上 39<br>2.7.10 将日志文件保存到独立的物理磁盘 39<br>2.7.11 表的分区 40<br>2.8 处理器瓶颈分析 40<br>2.8.1 % Processor Time 41<br>2.8.2 % Privileged Time 41<br>2.8.3 Processor Queue Length 42<br>2.8.4 Context Switches/sec 42<br>2.8.5 Batch Requests/sec 42<br>2.8.6 SQL Compilations/sec 42<br>2.8.7 SQL Recompilations/sec 43<br>2.9 处理器瓶颈解决方案 43<br>2.9.1 优化应用程序工作负载 43<br>2.9.2 消除过多的编译/重编译 43<br>2.9.3 使用更多或更快的处理器 44<br>2.9.4 使用大的二级(L2)/三级(L3)缓存 44<br>2.9.5 运行更高效的控制器/驱动程序 44<br>2.9.6 不运行不必要的软件 45<br>2.10 网络瓶颈分析 45<br>2.10.1 Bytes Total/sec 45<br>2.10.2 % Net Utilization 46<br>2.11 网络瓶颈解决方案 46<br>2.11.1 优化应用程序工作负载 46<br>2.11.2 增加网络适配器 47<br>2.11.3 节制和避免中断 47<br>2.12 SQL Server总体性能 47<br>2.12.1 丢失索引 48<br>2.12.2 数据库阻塞 49<br>2.12.3 不可重用的执行计划 50<br>2.12.4 总体表现 50<br>2.13 创建一个基线 51<br>2.13.1 创建性能计数器的一个可重用列表 51<br>2.13.2 使用性能计数器列表创建一个计数器日志 54<br>2.13.3 最小化性能监视器开销 55<br>2.14 以基线为标准的系统状态分析 56<br>2.15 小结 57<br><br>第3章 SQL查询性能分析 58<br>3.1 SQL Profiler工具 58<br>3.1.1 Profiler跟踪 59<br>3.1.2 事件 60<br>3.1.3 数据列 62<br>3.1.4 过滤器 64<br>3.1.5 跟踪模板 65<br>3.1.6 跟踪数据 65<br>3.2 跟踪的自动化 66<br>3.2.1 使用GUI捕捉跟踪 66<br>3.2.2 使用存储过程捕捉跟踪 67<br>3.3 结合跟踪和性能监视器输出 68<br>3.4 SQL Profiler建议 69<br>3.4.1 限制事件和数据列 69<br>3.4.2 丢弃性能分析所用的启动事件 70<br>3.4.3 限制跟踪输出大小 70<br>3.4.4 避免在线数据列排序 71<br>3.4.5 远程运行Profiler 71<br>3.4.6 限制使用某些事件 71<br>3.5 没有Profiler情况下的查询性能度量 71<br>3.6 开销较大的查询 72<br>3.6.1 识别开销较大的查询 73<br>3.6.2 识别运行缓慢的查询 77<br>3.7 执行计划 78<br>3.7.1 分析查询执行计划 80<br>3.7.2 识别执行计划中开销较大的步骤 82<br>3.7.3 分析索引有效性 83<br>3.7.4 分析连接有效性 84<br>3.7.5 实际执行计划vs.估算执行计划 88<br>3.7.6 计划缓存 89<br>3.8 查询开销 90<br>3.8.1 客户统计 90<br>3.8.2 执行时间 91<br>3.8.3 STATISTICS IO 92<br>3.9 小结 94<br><br>第4章 索引分析 95<br>4.1 什么是索引 95<br>4.1.1 索引的好处 97<br>4.1.2 索引开销 98<br>4.2 索引设计建议 100<br>4.2.1 检查WHERE子句和连接条件列 100<br>4.2.2 使用窄索引 102<br>4.2.3 检查列的唯一性 103<br>4.2.4 检查列数据类型 106<br>4.2.5 考虑列顺序 107<br>4.2.6 考虑索引类型 109<br>4.3 聚簇索引 109<br>4.3.1 堆表 110<br>4.3.2 与非聚簇索引的关系 110<br>4.3.3 聚簇索引建议 112<br>4.4 非聚簇索引 117<br>4.4.1 非聚簇索引维护 117<br>4.4.2 定义书签查找 117<br>4.4.3 非聚簇索引建议 118<br>4.5 聚簇索引vs.非聚簇索引 118<br>4.5.1 聚簇索引相对于非聚簇索引的好处 119<br>4.5.2 非聚簇索引相对于聚簇索引的好处 120<br>4.6 高级索引技术 121<br>4.6.1 覆盖索引 122<br>4.6.2 索引交叉 124<br>4.6.3 索引连接 125<br>4.6.4 过滤索引 126<br>4.6.5 索引视图 128<br>4.6.6 索引压缩 132<br>4.7 特殊索引类型 134<br>4.7.1 全文索引 134<br>4.7.2 空间索引 135<br>4.7.3 XML 135<br>4.8 索引的附加特性 135<br>4.8.1 不同的列排序顺序 135<br>4.8.2 在计算列上的索引 136<br>4.8.3 BIT数据类型列上的索引 136<br>4.8.4 作为一个查询处理的CREATE INDEX语句 136<br>4.8.5 并行索引创建 136<br>4.8.6 在线索引创建 137<br>4.8.7 考虑数据库引擎调整顾问 137<br>4.9 小结 137<br><br>第5章 数据库引擎调整顾问 139<br>5.1 数据库引擎调整顾问机制 139<br>5.2 数据库引擎调整顾问实例 143<br>5.2.1 调整一个查询 143<br>5.2.2 调整一个跟踪工作负载 146<br>5.3 数据库引擎调整顾问的局限性 148<br>5.4 小结 149<br><br>第6章 书签查找分析 150<br>6.1 书签查找的目的 150<br>6.2 书签查找的缺点 152<br>6.3 分析书签查找的起因 153<br>6.4 解决书签查找 155<br>6.4.1 使用一个聚簇索引 155<br>6.4.2 使用一个覆盖索引 155<br>6.4.3 使用索引连接 158<br>6.5 小结 160<br><br>第7章 统计分析 161<br>7.1 统计在查询优化中的角色 161<br>7.2 索引列上的统计 162<br>7.2.1 更新统计的好处 162<br>7.2.2 过时统计的缺点 164<br>7.3 在非索引列上的统计 165<br>7.3.1 在非索引列上统计的好处 166<br>7.3.2 丢失非索引列上的统计的缺点 169<br>7.4 分析统计 172<br>7.4.1 密度 174<br>7.4.2 多列索引上的统计 174<br>7.4.3 过滤索引上的统计 175<br>7.5 统计维护 176<br>7.5.1 自动维护 177<br>7.5.2 人工维护 179<br>7.5.3 统计维护状态 181<br>7.6 为查询分析统计的有效性 182<br>7.6.1 解决丢失统计问题 182<br>7.6.2 解决过时统计问题 184<br>7.7 建议 186<br>7.7.1 统计的向后兼容性 186<br>7.7.2 自动创建统计 186<br>7.7.3 自动更新统计 187<br>7.7.4 自动异步更新统计 189<br>7.7.5 收集统计的采样数量 189<br>7.8 小结 190<br><br>第8章 碎片分析 191<br>8.1 碎片的成因 191<br>8.1.1 UPDATE语句引起的页面分割 193<br>8.1.2 INSERT语句引起的页面分割 196<br>8.2 碎片开销 197<br>8.3 分析碎片数量 200<br>8.4 碎片解决方案 204<br>8.4.1 卸载并重建索引 204<br>8.4.2 使用DROP_EXISTING子句重建索引 205<br>8.4.3 执行ALTER INDEX REBUILD语句 205<br>8.4.4 执行ALTER INDEX REORGANIZE语句 207<br>8.5 填充因子的重要性 209<br>8.6 自动维护 212<br>8.7 小结 217<br><br>第9章 执行计划缓冲分析 218<br>9.1 执行计划生成 218<br>9.1.1 解析器 219<br>9.1.2 代数化器 220<br>9.1.3 优化 221<br>9.2 执行计划缓冲 227<br>9.3 执行计划组件 227<br>9.3.1 查询计划 227<br>9.3.2 执行上下文 227<br>9.4 执行计划的老化 228<br>9.5 分析执行计划缓冲 228<br>9.6 执行计划重用 229<br>9.6.1 即席工作负载 230<br>9.6.2 预定义工作负载 231<br>9.6.3 即席工作负载的计划可重用性 231<br>9.6.4 预定义工作负载的计划可重用性 239<br>9.7 查询计划Hash和查询Hash 248<br>9.8 执行计划缓冲建议 251<br>9.8.1 明确地参数化查询的可变部分 252<br>9.8.2 使用存储过程实现业务功能 252<br>9.8.3 使用sp_executesql编程以避免存储过程维护 252<br>9.8.4 实现准备/执行模式以避免重传查询字符串 253<br>9.8.5 避免即席查询 253<br>9.8.6 对于动态查询sp_executesql优于EXECUTE 253<br>9.8.7 小心地参数化查询的可变部分 254<br>9.8.8 不要允许查询中对象的隐含解析 254<br>9.9 小结 254<br><br>第10章 存储过程重编译 256<br>10.1 重编译的好处和缺点 256<br>10.2 确认导致重编译的语句 258<br>10.3 分析重编译起因 260<br>10.3.1 架构或绑定变化 261<br>10.3.2 统计变化 261<br>10.3.3 延迟对象解析 264<br>10.3.4 SET选项变化 266<br>10.3.5 执行计划老化 266<br>10.3.6 显式调用sp_recompile 267<br>10.3.7 显式使用RECOMPILE子句 268<br>10.4 避免重编译 269<br>10.4.1 不要交替使用DDL和DML语句 270<br>10.4.2 避免统计变化引起的重编译 271<br>10.4.3 使用表变量 273<br>10.4.4 避免在存储过程中修改SET选项 275<br>10.4.5 使用OPTIMIZE FOR查询提示 276<br>10.4.6 使用计划指南 277<br>10.5 小结 281<br><br>第11章 查询设计分析 282<br>11.1 查询设计建议 282<br>11.2 在小结果集上操作 283<br>11.2.1 限制选择列表中的列数 283<br>11.2.2 使用高选择性的WHERE子句 284<br>11.3 有效地使用索引 284<br>11.3.1 避免不可参数化的搜索条件 285<br>11.3.2 避免WHERE子句列上的算术运算符 289<br>11.3.3 避免WHERE子句列上的函数 290<br>11.4 避免优化器提示 292<br>11.4.1 连接提示 293<br>11.4.2 索引提示 295<br>11.5 使用域和参照完整性 296<br>11.5.1 非空约束 297<br>11.5.2 声明参照完整性 299<br>11.6 避免资源密集型查询 301<br>11.6.1 避免数据类型转换 301<br>11.6.2 使用EXISTS代替COUNT(*)验证数据存在 303<br>11.6.3 使用UNION ALL代替UNION 304<br>11.6.4 为聚合和排序操作使用索引 305<br>11.6.5 避免在批查询中的局部变量 306<br>11.6.6 小心地命名存储过程 309<br>11.7 减少网络传输数量 311<br>11.7.1 同时执行多个查询 311<br>11.7.2 使用SET NOCOUNT 311<br>11.8 降低事务开销 312<br>11.8.1 减少日志开销 312<br>11.8.2 减少锁开销 314<br>11.9 小结 315<br><br>第12章 阻塞分析 316<br>12.1 阻塞基础知识 316<br>12.2 理解阻塞 317<br>12.2.1 原子性 317<br>12.2.2 一致性 320<br>12.2.3 隔离性 320<br>12.2.4 持久性 321<br>12.3 数据库锁 321<br>12.3.1 锁粒度 322<br>12.3.2 锁升级 325<br>12.3.3 锁模式 326<br>12.3.4 锁兼容性 332<br>12.4 隔离级别 332<br>12.4.1 未提交读 333<br>12.4.2 已提交读 333<br>12.4.3 可重复读 335<br>12.4.4 可序列化(Serializable) 338<br>12.4.5 快照(Snapshot) 343<br>12.5 索引对锁的作用 343<br>12.5.1 非聚簇索引的作用 344<br>12.5.2 聚簇索引的作用 346<br>12.5.3 索引在可序列化隔离级别上的作用 346<br>12.6 捕捉阻塞信息 347<br>12.6.1 使用SQL捕捉阻塞信息 347<br>12.6.2 Profiler跟踪和被阻塞进程报告事件 349<br>12.7 阻塞解决方案 351<br>12.7.1 优化查询 352<br>12.7.2 降低隔离级别 352<br>12.7.3 分区争用的数据 353<br>12.7.4 争用数据上的覆盖索引 354<br>12.8 减少阻塞的建议 354<br>12.9 自动化侦测和收集阻塞信息 355<br>12.10 小结 359<br><br>第13章 死锁分析 360<br>13.1 死锁基础知识 360<br>13.2 使用错误处理来捕捉死锁 361<br>13.3 死锁分析 362<br>13.3.1 收集死锁信息 362<br>13.3.2 分析死锁 364<br>13.4 避免死锁 368<br>13.4.1 按照相同的时间顺序访问资源 368<br>13.4.2 减少被访问资源的数量 369<br>13.4.3 最小化锁的争用 369<br>13.5 小结 370<br><br>第14章 游标开销分析 372<br>14.1 游标基础知识 372<br>14.1.1 游标位置 373<br>14.1.2 游标并发性 374<br>14.1.3 游标类型 376<br>14.2 游标开销比较 378<br>14.2.1 游标位置的开销比较 378<br>14.2.2 游标并发性上的开销比较 380<br>14.2.3 在游标类型上的开销比较 381<br>14.3 默认结果集 383<br>14.3.1 好处 384<br>14.3.2 缺点 384<br>14.4 分析SQL Server游标开销 386<br>14.5 游标建议 390<br>14.6 小结 392<br><br>第15章 数据库工作负载优化 393<br>15.1 工作负载优化基础知识 393<br>15.2 工作负载优化步骤 394<br>15.3 捕捉工作负载 397<br>15.4 分析工作负载 399<br>15.5 识别开销最大的查询 400<br>15.6 确定开销最大的查询的基线资源使用 402<br>15.6.1 总体资源使用 402<br>15.6.2 详细资源使用 402<br>15.7 分析和优化外部因素 405<br>15.7.1 分析应用程序使用的批级别选项 405<br>15.7.2 分析统计有效性 406<br>15.7.3 分析碎片整理需求 406<br>15.8 分析开销最大的查询的内部行为 410<br>15.8.1 分析查询执行计划 410<br>15.8.2 识别执行计划中开销较大的步骤 412<br>15.8.3 分析处理策略的效率 412<br>15.9 优化代价最大的查询 412<br>15.9.1 修改现有索引 413<br>15.9.2 分析连接提示的应用 415<br>15.9.3 避免聚簇索引扫描操作 417<br>15.9.4 修改过程 418<br>15.10 分析对数据库工作负载的影响 420<br>15.11 迭代各个优化阶段 421<br>15.12 小结 424<br><br>第16章 SQL Server优化检查列表 425<br>16.1 数据库设计 425<br>16.1.1 平衡不足和过多的规范化 426<br>16.1.2 从实体完整性约束中得利 427<br>16.1.3 从域和参照完整性约束中得利 428<br>16.1.4 采用索引设计最佳实践 430<br>16.1.5 避免在存储过程名称中使用sp_前缀 431<br>16.1.6 最小化触发器的使用 431<br>16.2 查询设计 432<br>16.2.1 使用SET NOCOUNT ON命令 432<br>16.2.2 显式定义对象所有者 432<br>16.2.3 避免不可参数化的搜索条件 432<br>16.2.4 避免WHERE子句列上的算术运算符 433<br>16.2.5 避免优化器提示 434<br>16.2.6 远离嵌套视图 434<br>16.2.7 确保没有隐含的数据类型转换 435<br>16.2.8 最小化日志开销 435<br>16.2.9 采用重用执行计划的最佳实践 435<br>16.2.10 采用数据库事务最佳实践 436<br>16.2.11 消除或减少数据库游标开销 437<br>16.3 配置设置 437<br>16.3.1 Affinity Mask 437<br>16.3.2 内存配置选项 437<br>16.3.3 并行性开销阈值 438<br>16.3.4 最大并行度 438<br>16.3.5 优化即席工作负载 438<br>16.3.6 查询调控器开销限制 439<br>16.3.7 填充因子(%) 439<br>16.3.8 被阻塞过程阈值 439<br>16.3.9 数据库文件布局 439<br>16.3.10 数据库压缩 440<br>16.4 数据库管理 440<br>16.4.1 保持统计最新 440<br>16.4.2 保持最小数量的索引碎片数量 441<br>16.4.3 循环使用SQL错误日志文件 441<br>16.4.4 避免像AUTO_CLOSE或AUTO_SHRINK这样的自动化数据库功能 441<br>16.4.5 最小化SQL跟踪开销 442<br>16.5 数据库备份 442<br>16.5.1 增量和事务日志备份频率 442<br>16.5.2 备份分布 443<br>16.5.3 备份压缩 444<br>16.6 小结 444
展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证