作者:empty 页数:462 出版社:empty |
本书通过大量实例, 详细介绍了SQLServer数据库系统优化的各种方法和技巧。内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面、最后以一个实际的工作负载将所有技巧联系起来,并且提供了“宝典”式的最佳实践列表。本书适合于关心数据库应用系统性能的开发人员和数据库管理人员阅读,通过阅读本书,不仅可以学习到数据库性能管理的许多知识和技巧,还有助于养成良好的编程习惯,为实现高性能的数据库应用系统打下基础,本书中文体字版由A press L.P.授权人民邮电出版社独家出版。未经出版者书面许可, 不得以任何方SQLServer 2008查询性能优化[美] Grant F ritchey Saja lD am姚军著作权合同记号图字:01-2009-2889号著译责任编辑刘映欣+人民部电出版社出版发行邮编100061网址http//wwwptprastcomn北京艺辉印刷有限公司印制+开本:800x10001/16印张:2*.75字数:627千字甲数:1-3000册北京市崇文区少慧寺街14号2010年8月第1版2010年8月北京第1次印刷电子函件315@ptpress.comenISBN 978-7-115-23029-4定价:69.00元反盗版热线:(010)67171154干关读者服务热线:(010)67132705印装质量热线:(010)67129223内容提要
关于作者关于技术审校人致谢
Grant F ritchey为FM Global(一家行业领先的工程和保险公司) 工作, 担任首席DBA。他使用各种语言(如VB、C#和Java等) 开发了许多大规模的应用程序, 从版本6.0开始使用SQLServer.他曾经为3家失败的.com公司担任财务和咨询工作, 还是Dissecting SQLServerExecution Plans一书的作者。Saja lD am拥有位于印度班加罗尔的印度理工学院的计算机科学技术硕士学位, 并且使用微软技术超过16年。他已经在设计数据库应用和管理软件开发方面拥有了很广泛的背景。Saj al还在从前端网页到后端数据库的基于微软技术的应用程序上, 具备了故障定位和性能优化的大量经验。他有许多为《财富》500强公司设计可伸缩的数据库解决方案和最大化数据库环境性能的经验。Joseph Sack为微软公司工作, 担任主要领域工程团队的专有支持工程师。从1997年起,他就一直为金融服务、IT咨询、制造业、零售业和房地产业的客户开发并且支持SQLServer环境。他是SQLServer 2008 Transact-SOL Recipes、SQLServer 2005T-SQL Recipes和SOLServer 2000Fast Answers for DBAs and Developers等书籍的作者。写一本书真的很难。但幸运的是,写这些东西时我能有这么好的支持团队。感谢来自A press的人们:Jonathan Gen nick, 感谢你给我的机会和支持; Richard Dal Porto, 感谢你的组织:感谢Douglas Pun dick完美的编辑工作, 很抱歉为你添了这么多麻烦:同样感谢KimWimps ett和Kelly Win q ust, 对我的技术编辑, 我唯一能说的是, “我配不上你们“; 我衷心地感谢Joseph Sack对本书所做的杰出的工作。你们完成了令人惊奇的工作, 如果本书中尚有遗留的错误那都是我的责任,而不是你们的。我还必须感谢所有SQLServer中心论坛的人们。Steve Jones和Andy Warren在这里创建了一个社区, Steve、Gail、Je fT、Jack、Barry、Lynn和所有其他没有特别提到的人们, 感谢你们多年来的帮助。我和一群了不起的人们在一家出色的公司中工作,在这里我有了学习和成长的机会。感谢我的经理Jack Dewar和他的老板Bill Hawkins。还要感谢DBA团队Peter、Ted、Basem、AJ、DaveM.、DaveH.、Chris K.、ChrisP.、Yu ting、Ray、Raj和Det, 你们教给我很多。感谢RedGate的人们制作的了不起的工具, 包括SQL Prompt, 我用它编写和格式化了本书的T-SQL代码。最后,在人们开始演奏音乐,将我赶下舞台之前,我希望感谢我的家人——我的妻子和孩子,这是你们让我写的第二本书,感谢你们对我的宽容,
前言
性能常常是开发系统时最后想到的事情之一,很不幸,这意味着它将在系统投产之后成为最大的问题,不能简单地依靠一个电话,告诉你运行于服务器Z的数据库Y上的过程x运行很慢,而必须有一个机制来查找这些信息。也不能用“慢”来说明工作的状态。慢是和什么相比?上一周?还是上一个月?和开发时相比?一旦你认定某些部件运行缓慢,必须要指出原因。它是否需要一个索引?它是否有一个未用的索引?是由于CPU、磁盘、内存、用户数,还是数据量?已经认定了慢的部件和原因后,还必须做一些事情。如何优化?重写查询?修改Where子句?当开始性能调整时, 这些问题会没完没了。本书将有条理地介绍进行这些工作和回答这些问题的工具,从面消除当前在性能优化中本书适合于任何负责系统性能的读者。这无疑包括数据库管理员,因为他们负责建立系本书将提供回答这些问题所需要的工具。将会说明,如何建立一个收集服务器上运行的SQLServer实例及其中的数据库性能数据的机制还将介绍收集单个T-SQL调用数据的巧妙方法。过程中, 将讨论索引结构、选择和维护, 编写T-SQL代码的最佳方法, 以及许多其他的主题。编写本书的目标之一,是使用类似于在真实世界中所能看到的查询类型的实例来说明这些主题。所介绍的工具和方法大部分都可以用于SQLServer标准版, 但是有些只可用于SQLServer企业版——到时会有相关提示。常见的精测工作。性能问题不是什么可怕的事情,使用正确的工具,可以从容而可靠地解决性能问题,并赢得同伴和客户的尊敬以及直接帮助他们成功。本书的读者统,创建基础架构,并且随时对其进行监控。开发人员也被包括在内,因为除了他们,还有谁需要生成结构良好和高性能的T-SQL代码?数据库开发人员比任何人都更是目标读者, 因为数据库开发正是我的工作。任何有能力编写T-SQL、设计表、实现索引或者在SQLServer系统上操纵服务器设置的人都在一定程度上需要这些信息。本书的结构本书的目的是尽量使用真实的查询。为此,需要一个“真实”的数据库。我本可以创建一个第1章“SQL查询性能调整”介绍性能调整的迭代过程。你将得到发布性能基线、识别瓶颈、解决问题以及量化改进的第一印象。第2章“系统性能分析”从监控运行SQLServer的Windows系统开始, 说明作为数据收集机制的性能监视器和用户自定义函数。第3章“SQL查询性能分析”定义了查看“隐藏的秘密”以及了解系统上运行何种查询的最佳方法, 它提供了Profiler和跟踪工具的细节。本章中第一次介绍了多种用于监控查询的动态管理视图和功能。第4章“索引分析”说明了索引和索引架构,它定义了聚族索引和非聚簇索引之间的差别,说明了在不同类型的查询中哪种索引工作得最好,还介绍了基本的索引维护。第5章“数据库引擎调整顾问”介绍了微软的工具——数据库引擎调整顾问。本章详细介绍了数据引擎调整顺问的使用方法:介绍了各种调用工具的机制井说明在真实负载下的使用方法。第6章“书签查找分析”针对典型的性能问题——关键字查找,这也被称为书签查找。本章研究各种书签查找操作的解决方案。第7章“统计分析”介绍了统计的概念。优化器使用统计做出关于查询执行的计划。本章的主题是维护统计,理解它们的存储方式,学习其工作方式,并学习其对查询的影响,第8章“碎片分析”说明如何随时索引碎片。将给出识别索引碎片的方法,索引出现碎片时查询发生了什么问题,以及消除索引碎片的机制。第9章“执行计划缓冲分析”介绍SQLServer用于存储执行计划的机制。计划重用是SQLServer中的一个重要概念。将给出识别计划是否被重用的方法, 以及用于查看缓冲的各种机制,本章还介绍了新的动态管理视图,允许比以前更多的缓冲访问。●第10章“存储过程重编译”显示SQLServer如何及何时重新编译存储在缓冲中的计划。将给出计划重新编译可能伤害或者帮助系统性能的方法,以及强制或者避免重新编译的机制。错误并提供解决方案,以及给出多种避免常见瓶颈的最佳实践。●第12章“阻塞分析”讲述发现服务器上有多个对话争夺资源的最佳方法。将给出如何监控阻塞以及避免阻塞的会话的方法和技术。前言并强迫大家去下载, 但是这里我选择使用一个Microsoft创建的样板数据库AdventureWorks 2008来代替——这可以通过Code Plex得到(http//www.codeplex.com/MSFTDBProdSamples) 。建议保持一份便于恢复的拷贝, 并且在阅读本书的两个主题之后复位样板数据库。Microsoft随时会更新这些数据库,所以可能看到和本书中所列出的不同的数据组或不同的查询表现。在一定程度上,本书基于前面章节所介绍的知识来构建。但是,许多章节介绍该主题中的独特信息,所以可以挑选特定的章节阅读,从第1章到第16章顺序阅读可以获得最大的好处。●第11章“查询设计分析”展现编写系统中执行良好的查询的方法。本章研究常见的第13章“死锁分析”说明系统上发生死锁的情况,并给出识别涉及死锁的会话的方法。本章还介绍避免死锁或发生死锁后修复代码的最佳实践。第14章“游标开销分析”解析在面向数据集的T-SQL代码中出现的游标的固有开销。但是,当游标不可避免时,需要理解它们的工作方法、它们所做的工作,以及直接消灭它们不是一个选择时调整它们的最佳方法。第15章“数据库负载优化”示范了取得前面所有章节中出现的信息并将它们用在真实数据库负载中的方法。将识别性能最差的过程并通过多种调整方法使其达到更优的性能,第16章“SQLServer优化检查列表 总结了前面各章, 得到一组检查列表和最佳实践。本章的目标是快速回顾所有已经学习到的知识。可以从A press网站(http:/wwwapress.com) 的SourceCode(源代码) 部分下载本书使
第1章SQL查询性能调整精查询性能调整是当代数据库应用程序的重要部分,使用正确的查询性能调整,常常可●识别有问题的SQL查询:分析查询执行计划:分析和避免存储过程重编译;分析游标使用有效性:●应用性能调整过程, 工具和优化技术以优化SQL工作负荷。在进入这些主题之前, 首先研究进行性能调整的原因。本章中将讨论SQLserver数据以大大节省时间和金钱。硬件性能不断增强,这可能导致一种看法,即认为其他性能调整方法不再重要了。升级到SQLServer—特别是优化器(Optimizer) , 能帮助你确定查询如何执行,查询引擎能执行查询——它们都能够提供更好的性能。查询性能优化之美是,在许多情况下, 对索引或SQL查询所做的一个小的改动可能以很小的代价使应用程序高效得多。但是,粗心会造成很多缺陷。因此,需要一个经过证明的过程来确保正确地识别和解决性能瓶颈。为了引起你对查询优化技巧这一重要主题的兴趣,以下对本书中覆盖的查询优化各个方面做一个简短的介绍:库系统性能调整的基本概念,还将详述主要的性能瓶颈并说明设计数据库友好的应用程序的重要性,这种应用程序是数据的消费者,还要说明优化数据库的方法。特别要介绍以下主题:
Evaluation Wam ning:The dPDF for NET.第1章SQL查询性能调整性能调整过程;性能vs.价格;性能基线;查询中所应关注的地方;SQLServer的11个最大的性能杀手。1.1性能调整过程性能调整过程由识别性能瓶颈,解决瓶颈原因,应用不同的解决方案,然后量化性能改进组成。这必须要有一点创造性,因为大部分时候没有唯一的高招。缩小可能原因的列表和评估不同解决方案都富有挑战性,甚至可能在重复调整过程时撤销修改。1.1.1核心过程素。你应该在性能分析中问自己以下的问题。在调整过程中, 必须检查各种可能影响基于SQLServer的应用程序性能的硬件和软件因数据库设置是否支持最快的数据检索(对于可更新的数据库还有修改)?如果这些因素中有的没有被正确地配置,那么总体系统性能会受到影响。下面简单地检查一下这些因素。在相同的服务器上有另一个资源密集型的应用程序可能限制SQLServer可用的资源。即使一个应用程序作为服务器运行, 也可能消费相当一部分系统资源并限制SQLServer可用的资源。例如, 不建议在服务器上连续运行Windows任务管理器。任务管理器也是一个应用程序-―—task mgr.exe, 它运行在比SQLServer进程更高的优先级。优先级是给予一个资源的权重,使处理器在运行时给它更多的优先权。确定进程优先级的步骤如下。相同服务器上有没有运行其他的资源密集型应用?硬件子系统是否能承受最大的工作负荷?SQLServer是否被正确配置?SQLServer和数据库应用之间的数据库连接是否有效?由SQL查询组成的用户工作负载是否优化以减低SQLServer上的负载?在各种等待状态的测量中反映出哪个进程导致系统减慢?工作负载是否支持最大的并发性?(1) 启动Windows任务管理器。(2) 选择View(视图) →Select Columns(选择列) 。2a lua ion Warning:The document was created with Spire.PDF for NET(3) 选择BasePriority(基本优先级) 检查框。(4)单击OK(确定)按钮。1.1性能调整过程这些步骤将添加Base Prio ty《基本优先级) 列到进程列表中。随后, 可以确定SOL Server进程(sq serv.exe) 默认运行在Normal(正常) 优先级, 而Windows任务管理器进程(tak mgr exe) 运行在High(高) 优先级。因此, 为了允许SQLServer最大化可用资源的使用, 应该查找运行在SOLS ever机器上的所有不重要的应用/服务, 并且确定它们不会成为资源消耗者。错误地配置硬件可能使SQL Ser er不能从可用资源中获得最大利益。应该考虑的主要的硬件是处理器、内存、硬盘和网络。例如,在超过4GB内存的服务器中,一个错误的内存配置可能使SQLServer使用4GB以外的内存。而且, 如果一个特定的资源容量很小, 那么它可能很快成为SOL Server的性能瓶颈。第2章中将详细地介绍这些硬件瓶颈。还应该关注SQLServer的配置, 因为正确的配置对于一个已经优化的应用程序来说很重要。定义SQLServer安装一般表现的SQLServer配置列表很长, 可以使用系统存储过程sp confi ure来查看和修改这些配置。许多配置可以通过SQLServer Enter is eMa ager(企业管理器)来交互式地管理。因为SQLServer配置可应用到整个SQLServer安装, 所以一般首选标准的配置。好在,一般不需要修改这些配置,默认配置对大部分情况来说都是最优的。实际上,一般的建议是保持SOL Server配置的默认值。本书中将会详细地讨论这些配置参数。SQLServer和数据库应用之间精糕的连接性可能伤害应用程序性能。问题之一是, 数据库连接的质量如何?例如,应用程序执行的查询可能被很大程度地优化了,但是用于提交这个查询的数据库连接可能为查询性能增加了相当的开销。根据应用程序和数据库的分布情况,应该使用不同的网络协议来降低网络开销。而且,在网络连接上的管理
1.1.1核心过程…
1.1.2代过程-0.2.4.1 SQLServer内存管理..-20
1.2.1性能日标…..
1.2.2“足够好”的调整…7Faults/sec计数器….--23
1.5 SQLServer性能杀.-.102.4.6 Checkpoint Pages/see i..--24
1.5.1低质量的索引…102.4.7Lazy writes /sec. 24
1.5.5低质量的查询设计…12
1.5.6低质量的数据库设计…12
1.5.7过多的碎片…
1.5.8不可重用的执行计划…13
1.5.9低质量的执行计划…-13
1.5.10频繁重编译计划..13
1.5.11游标的错误使用..------13
1.5.12错误配置数据库日志…14
1.5.13过多使用或者错误
1.6小结.
2.2动态管理视图..17
用的代码实例, 大部分代码是保存在.sql文件中的普通T-SQL, 可以在任何SQLServer T-SQL
编辑工具中打开和使用。有一个Power Shell脚本必须通过Power Shell命令行运行。
联系作者
可以通过granedd@googl.om联系作者Grant Frc hey, 还可以在htp//s cay dba.wordpress.com
访问他的博客。
第1章SQL查询性能调整…
1.1性能调整过程…
1.2性能vs.价格…2.4.2 Available Bytes .. 23
1.3性能基线…2.4.4 Buffer Cache Hit Ratio…24
1.4工作的重点……
第2章系统性能分析…
2.1性能监视器工具….--
2.3.1识别瓶颈……
2.3.2瓶颈解决方案…..19
2.4内存瓶颈分析-.--.19
2.4.3 Pages/sec和Page
2.4.5 Page Life Expectancy…24
2.4.8 Memory Grant sPending -25
2.5.3增加系统内存…..27
2.6.3 Current Disk Queue
不精确的统计……
过多的阻塞和死镇….11
不基于数据集的操作…11
配置tempdb..14
2.4.9 Target Server Memory
2.5内存瓶颈解决方案…..
2.5.1优化应用程序工作负载-26
2.5.2为SQLServer分配更多
2.5.4
2.5.6在32位SQLServer中
2.6磁盘瓶颈分析…..29
2.6.1磁盘计数器..30
2.6.2%Disk Time.30
(KB) 和Total Server
Memory(KB) . 25
内存…..27
更换32位处理器为64位
处理器…27
启用3GB进程空间.28
使用4GB以上内存……28
三级(L3)缓存…..44
驱动程序.44
负载…..46
丢失索引……..48
数据库阻塞…..49
不可重用的执行计划…50
创建性能计数器的
一个可重用列表…51
创建一个计数器日志…54
开销….55
索引的好处…
索引的好处…
2.6.4Disk Transfers/sec….---.31
2.6.5Disk Bytes/sec.32
2.6.6Avg.Disk Sec/Read和
2.7.4使用SAN系统…..35
2.8.1%Processor Time….-41
2.8.2%Privileged Time . 41
2.8.3 Processor Queue Length --42
2.8.4 Context Switches /sec. 42
2.9.5运行更高效的控制器/
2.9.6不运行不必要的软件…45
2.10网络瓶颈分析…45
2.11网络瓶颈解决方案….46
Avg.Disk Sec/Write….32
缓存…36
磁盘上…39
独立的物理硅盘…39
重编译….
处理器…
启动事件…
较大的步骤…
执行计划..
2.7磁盘瓶颈解决方案…..-32
2.7.1优化应用程序工作负载一33
2.7.2使用更快的磁盘驱动器…33
2.7.3使用一个RAID阵列-..---33
2.7.5恰当地对齐磁盘….---35
2.7.6使用电池后备的控制器
2.7.7添加系统内存…36
2.7.8创建多个文件和文件组一36
2.7.9将表和索引放在不同的
2.7.10将日志文件保存到
2.7.11表的分区…..40
2.8处理器瓶颈分析…..40
2.8.5Batch Requests/sec..42
2.8.6SQL Compilations/sec…42
2.8.7SQLRe compilations/sec…43
2.9处理器瓶颈解决方案…
2.9.1优化应用程序工作负载…43
2.9.2消除过多的编译/
2.9.3使用更多或更快的
2.9.4使用大的二级(L2)/
3.1.6跟踪数据…..65
3.2跟踪的自动化…
3.2.1使用GUI捕提跟踪…66
3.2.2使用存储过程捕捉跟踪…67
3.3结合跟踪和性能监视器输出…68
3.4SQL Profiler建议……
3.4.1限制事件和数据列…69
3.4.2丢弃性能分析所用的
性能度量…..
3.8.1客户统计.-.
3.8.2执行时间…..
4.1什么是索引….
2.10.1 Bytes Total /sec. 45
2.10.2%Net Utilization…..-46
2.11.1优化应用程序工作
2.11.2增加网络适配器…..47
2.11.3节制和避免中断……47
2.12 SQLServer总体性能.…..47
2.12.4总体表现…50
2.13创建一个基线….51
2.13.2使用性能计数器列表
2.13.3最小化性能监视器
2.14以基线为标准的系统
3.1SQL Profiler工具.
4.2.6考虑索引类型.…..109
4.4.2
定义书签查找….117
4.6.3索引连接…
2.12.1
2.12.2
2.12.3
2.13.1
状态分析…
2.15小结…
第3章SQL查询性能分析….
…824.5.2非聚蘘索引相对于聚簇
.884.6.2索引交叉…
3.1.1 Profiler跟踪……..
3.1.2事件…60
3.1.3数据列……..62
3.1.4过滤器……..-64
3.1.5跟踪模板….65
4.1.1索引的好处…..97
4.1.2索引开销…
4.2索引设计建议…
4.2.1检查WHERE子句和
4.2.2使用窄索引…
4.2.3检查列的唯一性…103
4.2.4检查列数据类型…….106
4.3聚族索引…
连接条件列…
考虑列顺序….
4.3.1堆表…110
4.3.2与非聚簇索引的关系…110
4.3.3聚簇索引建议..112
4.4非聚簇索引…aniwa m*……117
4.4.1非聚簇索引维护….117
4.4.3非聚簇索引建议…118
4.5聚簇索引vs,非聚族索引……118
4.5.1聚簇索引相对于非聚簇
4.6高级索引技术…..121
4.6.1覆盖索引…122
4.6.4过滤索引….126
4.6.5索引视图…128
4.6.6索引压缩….132
4.7特殊索引类型…134
4.7.1全文索引…134
4.7.2空间索引…135
4.7.3XML…..135
4.8索引的附加特性…….135
3.4.3限制跟踪输出大小..70
3.4.4避免在线数据列排序…..71
3.4.5远程运行Profiler.71
3.4.6限制使用某些事件……71
3.5没有Profiler情况下的查询
3.6开销较大的查询..72
3.6.1识别开销较大的查询…-73
3.6.2识别运行缓慢的查询…77
3.7执行计划…78
3.7.1分析查询执行计划….80
3.7.2识别执行计划中开销
3.7.3分析索引有效性….83
3.7.4分析连接有效性…..--84
3.7.5实际执行计划vs.估算
3.7.6计划缓存………89
3.8查询开销….90
3.8.3STATISTICS1O…-..92
3.9小结…..94
第4章索引分析..95
4.8.1不同的列排序顺序….135
4.8.2在计算列上的索引…136
4.8.3BIT数据类型列上的
4.8.4作为一个查询处理的
4.8.5并行索引创建…136
4.8.6在线索引创建…
4.8.7
4.9小结……
第5章数据库引擎调整顾问…..139
5.1数据库引擎调整顾问机制…139
5.2数据库引擎调整顾问实例…143
7.2.1
更新统计的好处….162
7.2.2过时统计的缺点…164
7.3在非索引列上的统计…..165
7.3.1在非索引列上统计的
7.3.2丢失非索引列上的
7.4分析统计…
7.4.1密度……
7.4.2
7.4.3过滤索引上的统计…175
7.5统计维护..
7.5.1自动维护….
7.5.3统计维护状态…..181
10.4.3使用表变量..273
索引……
好处…..
统计的缺点…..
多列索引上的统计…174
页面分割…..
页面分割…
以避免存储过程维护…252
避免重传查询字符串…253
execute sql优于
可变部分….
隐含解析……
recompile.
子句…
DML语句.
重编译….
修改SET选项..--275
CREATE INDEX语句…136
考虑数据库引擎调整
顾问-.137
负载……..146
子句重建索引……-205
REORGANIZE语句…-207
可重用性…..231
可重用性……239
可变部分….--252
业务功能….252
7.5.2人工维护….
7.6为查询分析统计的有效性…182
7.6.1解决丢失统计问题…182
7.6.2解决过时统计问题….184
7.7建议…186
7.7.1统计的向后兼容性……186
8.1.1 UPDATE语句引起的
8.1.2 INSERT语句引起的
9.8.3使用sp_cx e cute sql编程
EXECUTE-
10.3.1架构或绑定变化..--261
10.3.2统计变化…..261
10.3.3延迟对象解析.264
10.3.4SET选项变化…266
10.3.5执行计划老化.
10.3.6显式调用sp_
10.3.7显式使用RECOMPILE
10.4避免重编译……
10.4.1不要交替使用DDL和
10.4.2避免统计变化引起的
10.4.4避免在存储过程中
5.2.1调整一个查询…-143
5.2.2调整一个跟踪工作
5.3数据库引擎调整顾问的
局限性…148
5.4小结…149
第6章书签查找分析…--150
6.1书签查找的目的……150
6.2书签查找的缺点….152
6.3分析书签查找的起因..153
6.4解决书签查找…155
9.3.1查询计划……-227
7.7.2自动创建统计.186
7.7.3自动更新统计…….187
7.7.4自动异步更新统计…189
7.7.5收集统计的采样数量…189
7.8小结.190
第8章碎片分析….191
8.1碎片的成因…..191
8.2碎片开销…197
8.3分析碎片数量.200
8.4碎片解决方案…..204
9.8.4实现准备/执行模式以
9.8.5避免即席查询.
9.8.6对于动态查询sp_
9.8.7小心地参数化查询的
9.8.8不要允许查询中对象的
9.9小结.…..
第10章存储过程重编译….--256
10.1重编译的好处和缺点.--256
10.2确认导致重编译的语句…258
10.3分析重编译起因…
6.4.1使用一个聚簇索引…155
6.4.2使用一个覆盖索引…155
6.4.3使用索引连接……158
6.5小结….160
第7章统计分析…..161
7.1统计在查询优化中的角色……161
9.1执行计戈生成.218
9.5分析执行计划缓冲..228
7.2索引列上的统计..162
8.4.1卸载并重建索引….--204
8.4.2使用DROP_EXISTING
8.4.3执行ALTER INDEX
REBUILD语句…205
8.4.4执行ALTER INDEX
8.5填充因子的重要性..-209
8.6
自动维护.212
8.7
小结…-217
第9章执行计划缓冲分析…-218
9.1.1解析器….
9.1.2代数化器.
9.1.3优化…
9.2执行计划缓冲…
9.3执行计划组件…
9.4执行计划的老化..
9.3.2执行上下文.227
9.6执行计划重用…..--229
9.6.1即席工作负载.230
9.6.2预定义工作负载…..231
9.6.3即席工作负载的计划
9.6.4预定义工作负载的计划
9.7查询计划Hash和查询Hash…--248
9.8执行计划缓冲建议….251
9.8.1明确地参数化查询的
9.8.2使用存储过程实现
10.4.5使用OPTIMIZE FOR
10.4.6使用计划指南….
10.5小结…
第11章查询设计分析…
11.1查询设计建议….
信息……
13.3死锁分析…….362
14.1游标基础知识………
14.2游标开销比较..378
局部变量…….306
一致性…
隔离性…
(Serializable) . 338
索引在可序列化隔离
级别上的作用..346
比较…
批级别选项…
较大的步骤..
查询提示…
列数…
WHERE子句…
搜索条件…
11.6.6小心地命名存储过程…309
11.7减少网络传输数量……-311
11.7.1同时执行多个查询311
11.7.2使用SET NO COUNT -311
11.8降低事务开销..312
12.2.1原子性…
12.2.4持久性…
12.4.5快瓶(Snapshot) .. 343
12.5索引对锁的作用..343
12.5.1非聚簇索引的作用…344
12.5.2聚簇索引的作用…346
比较…
基线资源使用..
15.7.2分析统计有效性…..406
15.7.3分析碎片整理需求….406
内部行为..
15.8.2识别执行计划中开销
15.8.3分析处理策略的效率…412
11.8.1减少日志开销….
11.8.2减少锁开销…
11.9小结…
第12章阻塞分析……
12.1阻塞基础知识…
12.2理解阻塞……
14.3.2缺点.….384
15.3捕捉工作负载.
15.4分析工作负载..
15.6确定开销最大的查询的
15.6.1总体资源使用.402
15.6.2详细资源使用….402
15.7分析和优化外部因素……..-405
15.7.1分析应用程序使用的
15.8分析开销最大的查询的
15.8.1分析查询执行计划…410
15.9优化代价最大的查询.412
15.9.1修改现有索引…413
11.2在小结果集上操.83
11.2.1限制选择列表中的
11.2.2使用高选择性的
11.3有效地使用索引….284
11.3.1避免不可参数化的
11.3.2避免WHERE子句列
11.3.3避免WHERE子句列
11.4避免优化器提示…292
11.4.1连接提示…-293
11.5使用域和参照完整性..296
11.5.1非空约束.….-297
11.6避免资源密集型查.301
11.6.1避免数据类型转换…301
11.6.2使用EXISTS代替
11.6.3使用UNION ALL
11.6.4为聚合和排序操作
11.6.5避免在批查询中的
12.6.1使用SQL捕捉阻塞
12.6.2 Profiler跟踪和被阻塞
12.7阻塞解决方案…..351
12.7.1优化查询…..352
12.7.2降低隔离级别…….352
12.7.3分区争用的数据…--353
12.7.4争用数据上的覆盖
12.8减少阻塞的建议…..354
12.9自动化侦测和收集阻塞
12.10小结…..--359
第13章死锁分析….-360
13.1死锁基础知识…..360
13.2使用错误处理来捕捉死锁---361
12.2.2
12.2.3
12.3数据库锁…
12.3.1锁粒度…
12.3.2锁升级…
12.3.3锁模式….
12.3.4锁兼容性…
12.4隔离级别…
12.4.1未提交读…
12.4.2已提交读…
12.4.3可重复读…
12.4.4可序列化
12.5.3
12.6捕捉阻塞信息…..
14.2.1游标位置的开销比较…378
14.2.2游标并发性上的开销
14.2.3在游标类型上的开销
14.3默认结果集…
14.3.1好处…
14.4分析SQLServer游标开销…386
14.5游标建议..
14.6
小结…
第15章数据库工作负载优化..---393
15.1工作负载优化基础知识.….--393
15.2工作负载优化步骤.---394
15.5识别开销最大的查询…..400
上的算术运算符.-289
上的函数…-290
索引提示…..295
声明参照完整性….299
COUNT(*) 脸证数
据存在…303
代替UNION….304
使用索引…305
信息…..347
进程报告事件….349
索引….----354
访问资源…..368
数量….369
13.3.1收集死锁信息……..362
13.3.2分析死锁…..364
13.4避免死锁….-368
13.4.1按照相同的时间顺序
13.4.2减少被访问资源的
13.4.3最小化锁的争用…---369
13.5小结…370
第14章游标开销分析…..372
14.1.1游标位置…..
14.1.2游标并发性….--374
14.1.3游标类型…..376
15.9.2分析连接提示的应用…415
15.9.3避免聚簇索引扫描
15.94修改过程…..
15.10分析对数据库工作负载的
15.11选代各个优化阶段.--421
15.12..424
第16章SQLServer优化检查列表…425
16.1数据库设计…
16.2.9
采用重用执行计划的
最佳实践…
最佳实践…
游标开销…..
Affinity Mask….437
限制…
碎片数量…
日志文件…
AUTO_SHRINK这样的
自动化数据库功能…441
开销…
频率.
操作…..
规范化…
约束中得利….
实践…
使用sp_前缓..
命令…..
上的算术运算符…433
类型转换….435
16.2.10采用数据库事务
16.2.11消除或减少数据库
16.3.1
16.3.2内存配置选项…437
并行性开销值…438
16.3.4最大并行度………438
16.3.5优化即席工作负载-----438
16.3.7填充固子(%).439
影响…….
小结……
得利……
搜索条件…
16.3配置设置..
16.3.3
16.3.6查询调控器开销
16.3.8被阻塞过程值……439
16.3.9数据库文件布局…439
16.3.10数据库压缩…440
16.4数据库管理…440
16.4.1保持统计最新….440
16.4.2保持最小数量的索引
16.4.3循环使用SQL错误
16.4.4避免像AUTO CLOSE或
16.4.5最小化SQL跟踪
16.5数据库备份….442
16.5.1增量和事务日志备份
16.5.2备份分布.443
16.5.3备份压缩…444
16.6小结….444
16.1.1平衡不足和过多的
16.1.2从实体完整性约束中
16.1.3从域和参照完整性
16.1.4采用索引设计最佳
16.1.5避免在存储过程名称中
16.1.6最小化触发器的使用…431
16.2查询设计…432
16.2.1使用SET NO COUNT ON
16.2.2显式定义对象所有者-432
16.2.3避免不可参数化的
16.2.4避免WHERE子句列
16.2.5避免优化器提示…434
评估当前索引的有效性:
避免书签查找:
评估当前统计的有效性:
分析和解决碎片:
优化执行计划缓冲:
最小化阻塞和死锁:
16.2.6远离嵌套视图.-434
16.2.7确保没有隐含的数据
16.2.8最小化日志开销.435