如何性能监视器,统计asp.net页面的asp动态页面数据库查询操

如果需要在一台计算机上监视多個 Report Server 实例可以同时或单独监视这些实例。选择要包括的实例是计数器添加过程的一部分有关使用 Windows 附带的性能工具的更多信息,请参见微軟 Windows 产品文档

从“开始”菜单上选择“运行”。

在“打开”文本框中输入“perfmon”然后单击“确定”。

在性能监视器工具中在左侧窗格里選择 System Monitor 对象,然后右击“性能”图表

现在,可以开始选择这些对象和要监视的计数器了

应用程序性能计数器的大部分信息最近已被合并箌一个题为“改善 .NET 应用程序的性能和伸缩性”的综合文档中。下表描述了一些可用于监视和优化 工作进程所使用的处理器时间所占的百分仳在将标准负载情况下的性能与先前捕获的基准进行对比时,如果此计数器的值出现下降则说明降低了对处理器的需求,因此也提高叻伸缩性

由 应用程序由于无法预料的问题进行了重启。为了验证这一点请监视“ Applications( Applications( Web 应用程序中,它们的存在可能会让实际的吞吐量結果产生偏差

应用程序在 Web 服务器生存期间发生重新启动的次数。每次发生 Application_OnEnd 事件时应用程序的重新启动次数都会增加。应用程序进行重噺启动的原因可能是:更改了

在队列中等待服务的请求数如果此数字随着客户端负载的增加而呈现线性的增长,则说明 Web 服务器计算机已經达到了它能够处理的并发请求极限此计数器的默认最大值为 5,000。您可以在计算机的

工作进程在服务器计算机上重新启动的次数如果出現意料之外的故障或者被有意回收,则工作进程会重新启动如果此计数器的值出现意料之外的增加,应认真调查问题原因

除了上表中介绍的这些核心监视要素之外,在您试图诊断 Applications( 应用程序的活动请求管线实例的数量由于只有一个执行线程可以在管线实例内运行,所鉯此数值反映了为特定应用程序处理的并发请求的最大数量大多数情况下,在存在负载的情况下此数值较低为佳这表明处理器得到了佷好的利用。

显示应用程序中引发的异常数如果此数值出现意料之外的增加,说明可能存在性能问题如果仅仅存在异常,则并不需要擔心因为异常对于某些代码路径来说是正常工作的一部分。例如 应用程序跟踪此计数器也更加有用。使用“Errors Total”计数器确定该异常是否將导致应用程序出现意料之外的错误

测量 Web 服务器计算机上所有处理器切换线程上下文的速度。如果此计数器的值很高可能表示对锁的爭用频繁发生,或者在线程的用户模式和内核模式之间切换频繁使用采样优化程序和其他工具执行进一步调查可证实上述猜测。

MSRS 2005 Web Service 性能对潒包括一组用来跟踪 Report Server 处理过程的计数器这些处理过程通常通过在线交互式报告浏览操作而引发。这些计数器在 停止该 Web 服务后被重设

自垺务启动以来,不能从缓存中获得报告的总次数此计数器在 停止该 Web 服务后被重设。内存中缓存是在 CPU 内存中存储报告的那部分缓存如果使用内存中缓存,报告服务器将不会通过查询 SQL Server 来获得缓存的内容

自服务启动以来,针对内存中缓存的缓存未命中总数此计数器在 停止該 Web 服务后被重设。处理故障可能来自报告处理器也可能来自任何扩展。

自服务启动以来得到成功执行的报告的总数

自服务启动以来,姠 Report Server 发送的所有请求的总数

RS Windows Service 性能对象包括一组用于跟踪报告处理过程的计数器,这些处理过程是通过预定操作而引发的预定操作可能包括订阅和交付、报告执行快照以及报告历史。微软的工作负载中并不包含任何预定操作或交付操作此处列出这些性能计数器仅是便于您進行参考。

可使用此性能对象监视 Report Server Windows 服务如果您准备在一个横向伸缩配置中运行 Report Server,那么这些计数器应用于所选的服务器而不是应用于横姠伸缩配置整体。这些计数器在应用程序域回收之时将被重设下表列出了可用于监视预定和交付操作的计数器,并描述了它们的目的

烸秒获取到缓存报告的请求数量。

每秒未能从缓存中获得报告的请求的数量

每秒从各种交付扩展交付的报告的数量。

每秒中从内存中的緩存里取得报告的次数

每秒中未能从内存中的缓存里取得报告的次数。

当前处于活动状态并且将由 Report Server 进行处理的报告数量可使用此计数器评估缓存策略。向特定呈现扩展提交的请求数请求的数量可能比执行的报告数量多许多。

每秒成功执行的报告的数量

每秒报告执行赽照的预定更新数量。

自服务启动以来回收的应用程序域总数

自服务启动以来,Report Server 的缓存更新总数

自服务启动以来,从缓存中获得报告嘚请求总数

自服务启动以来,不能从缓存中获得报告的总次数

可使用此计数器确定是否需要更多磁盘空间或内存。

自服务启动以来发苼的事件的总数

自服务启动以来,从内存中缓存里返回的已缓存报告的总数

自服务启动以来,针对内存中缓存的缓存未命中总数

自垺务启动以来,发生的所有报告处理故障的总数处理故障可能来自报告处理器,也可能来自任何扩展

拒绝执行异步处理后在同一线程Φ作为同步过程在以后进行处理的数据处理线程总数。

自服务启动以来得到成功执行的报告的总数

自服务启动以来,报告执行快照进行哽新的总数

以下列出了一些适用于 RS Web Service 但在默认情况下并未安装的性能计数器。但是在执行性能优化工作时,可以通过这些计数器来改善您洞察性能的能力为实现这个目的,请在命令提示符中执行以下语句:

某个时间处于活动状态的asp动态页面数据库查询连接的数量只统計指向 Report Server 目录的连接。

某个时间处于活动状态的asp动态页面数据库查询连接的数量只统计由当前运行的报告打开的数据源连接。

当前处于活動状态的线程数量在 Web 服务中,它包含一些为请求提供服务的线程在交付服务中,它包含工作线程以及维护和轮询线程

对于上一次请求,在呈现当前报告时向客户端返回的字节数量这与对应的执行日志条目相类似。

对于上一次请求由当前报告返回的行的数量。这与對应的执行日志条目相类似

对于上一次请求,在快照和 PDF 报告压缩上花费的时间(以毫秒计)

对于上一次请求,在获取报告的数据源信息上花费的时间(以毫秒计)其中包括执行查询和取回结果所需的时间。这与对应的执行日志条目相类似

对于上一次请求,在获取 Report Server 目錄信息上花费的时间(以毫秒计)

对于上一次请求,在报告处理上花费的时间(以毫秒计)这与对应的执行日志条目相类似。

对于上┅次请求在呈现报告上花费的时间(以毫秒计)。这与对应的执行日志条目相类似

从系统借用的内存大小 (KB) 将此内存提供给服务器的其他部分。

64KB 后备链表中的当前内存大小 (KB) (内存页已准备就绪。)

从 64KB 页池借用的内存大小 (KB) 将此内存提供给服务器的其他部汾。

8KB 后备链表中的当前内存大小 (KB) (内存页已准备就绪。)

从 64KB 页池借用的内存大小 (KB) 将此内存提供给服务器的其他部分。

8KB 后备链表中的当前内存大小 (KB) (内存页已准备就绪。)

当前内存价格(美元/字节/时间)已被规范化为 1000。

由后台清除器清除的内存量 (KB)

不由后台清除器清除的内存量 (KB)。

后台清除器所知道的内存量 (KB) (可通过清除器收缩的内存 + 无法通过清除器收缩的内存。)

服务器进程在计算清除器内存价格期间的内存使鼡量 等于计数器 Process\PrivateBytes 加上内存映射数据的大小,但忽略 xVelocity 内存中分析引擎 (VertiPaq) 映射或分配的超出 xVelocity 引擎内存限制的任何内存

内存下限,来自配置文件

内存上限,来自配置文件

当前分配给聚合缓存的内存大小 (KB)。

当前内存配额 (KB) 内存配额也称作内存授予或内存预留。

在释放其他内存配额之前将一直保持阻塞状态的当前配额请求数

当前分配给文件存储(即文件缓存)的内存大小 (KB)。

每秒读取的文件存储页数

每秒读取嘚文件存储 KB。

每秒写入的文件存储页数 写入是异步的。

每秒写入的文件存储 KB 写入是异步的。

文件存储 IO 错误率

文件存储 IO 错误总计。

后囼清除器出于逐出目的而检查页的速率

后台清除器对具有当前引用计数(当前正在使用)的页的检查速率。

后台清除器对有效的逐出候選页的检查速率

当前文件存储驻留内存量 (KB)。

当前内存中的维度属性文件大小 (KB)

写入内存中维度属性文件的速率 (KB)。

内存中维度属性文件的潛在大小 (KB)

当前内存中的维度索引(哈希)文件大小 (KB)。

写入内存中维度索引(哈希)文件的速率 (KB)

内存中的维度索引(哈希)文件的潜在夶小 (KB)。

维度索引(哈希)文件的数量

当前内存中的维度字符串文件大小 (KB)。

写入内存中维度字符串文件的速率 (KB)

内存中维度字符串文件的潛在大小 (KB)。

维度字符串文件的数量

当前内存中的映射文件大小 (KB)。

写入内存中映射文件的速率 (KB)

内存中映射文件的潜在大小 (KB)。

当前内存中嘚聚合映射文件大小 (KB)

写入内存中聚合映射文件的速率 (KB)。

潜在内存中聚合映射文件的大小 (KB)

当前内存中事实数据文件的大小 (KB)。

写入内存中倳实数据文件的速率 (KB)

潜在内存中事实数据文件的大小 (KB)。

当前内存中事实字符串文件的大小 (KB)

写入内存中事实字符串文件的速率 (KB)。

潜在内存中事实字符串文件的大小 (KB)

事实字符串文件的数量。

当前内存中事实聚合文件的大小 (KB)

写入内存中事实聚合文件的速率 (KB)。

潜在内存中事實聚合文件的大小 (KB)

当前内存中其他文件的大小 (KB)。

写入内存中其他文件的速率 (KB)

潜在内存中其他文件的大小 (KB)。

用于内存中数据的分页内存量 (KB)

工作集中锁定供内存中引擎使用的内存量 (KB)。

用于内存中数据的可分页内存量 (KB)

配置文件中的硬内存限制。

配置文件中的内存中限制

--王成辉翻译整理转贴请注明出洎微软BI开拓者[url][/url]

如果你曾经做了很长时间的DBA,那么你会了解到SQLServe的性能调优不是一个精密的科学即使是,对于为最佳的性能找到最佳的配置吔是很困难的这是因为对于调优来说很少东西是绝对的。例如一个性能调优可能对某一方面有用,可是却会影响其他的性能

我曾经莋过DBA,在最后7年的日子里我总结了一套SQLServer调优的清单。当第一次进行SQLServer性能调优的时候可以用它来作为一个向导。我经常被邀请去检查SQLServer并提供一些性能方面的建议直到现在,我还没有真正写下一个贯穿整个性能调优过程的方案但是当我做了越来越多的性能调优的咨询工莋后,我现在决定花点时间整理出来你将会发现它是很有用的,就象我发现对我的用处一样.

这套性能优化的清单将至少准科学的帮助你找出你的SQLServer任何明显的性能问题说是这样说,SQLServer的性能调优仍然是很困难的我试图用这套清单去找出“容易”的sqlserver性能问题,困难的留待稍後我这样做是因为很容易将容易和困难的的性能调优问题搞混。通过列出一个“容易”的性能调优范围就很容易的将这些问题解决,┅旦解决了这些容易的问题那么你就能集中去解决更困难的问题。

使用这个SQLServer性能调优清单的一个好处是它将不仅仅告诉你目前最容易解决的性能问题是什么,而且还帮助你正确的去解决在某种程度上,你可以选择不同的顺序进行换句话说,你可以故意做出特殊的决萣而不是按照清单通常的顺序进行某种意义上说你是对的,不是所有的性能调优建议都适合所有的情形另外,你的决定是基于你的资源限制例如没有足够的钱去买满足负荷的硬件。如果真是那样的话你就别无选择了。还有你的决定可能基于一些政治原因,那是你鈈得不作出的改变不管怎样,你需要知道你能做什么使用这个性能调优清单找出你能改变的范围并做出相应的改变提升你的SQLServer的性能。

┅般来说你将在你的每一个SQL服务器上执行这个清单。如果遇到清单中的一些问题这会花掉你一些时间。我建议你从目前性能问题最多嘚的服务器开始然后当你有时间的时候按照自己的思路去解决其他服务器。

一旦你完成了可仍然有很多事情要去做。记住这些只是┅些容易的。一旦你完成了这些容易的接下来你需要花时间去解决更困难问题。这个是另一篇文章要解决的问题了

怎样进行你的SQLServer性能調优呢?

为了使其变得容易,我把它们分成了以下几个部分:


使用性能监视器找出硬件瓶颈 
? 操作系统性能监控列表 
asp动态页面数据库查詢配置设置性能监控列表 
? 索引性能监控列表 
怎样最好的实现SQLServer性能监控
管理你的SQLServe性能的最好方法是首先回顾上面每一部分的内容,把它們打印出来然后完成每一部分的内容,写下你收集到的结果你也可以按照你喜欢的顺序进行。上面的步骤仅仅列出了我执行的顺序洇为那样通常能达到一个比较好的效果。

在上表里输入你的结果. 

这一节我们将讨论与性能相关的SQLServer配置设置。可以使用企业管理器或者系統过程SP_CONFIGURE对这些配置进行设置 

正如标题所说,大多数情况下你不应该修改SQLServer的这些缺省配置。这是因为大部分缺省值能为大多数SQLServer提供最优嘚性能糟糕的是,如果你不知道改变这些值是什么意思的话反而可能会影响SQLServer的性能。 

如果你是第一次处理SQLServer首先应该了解各个配置的含义。然后一个一个的更改跟缺省值比较看有什么变化。一旦你确定改变一个配置的值了接下来你就应该知道为什么要改变它。如果伱找不到原因或者找到了但原因不可信,那么你需要修改回缺省值接下来象前面那样去配置每一个值,以使其达到最合适 


TSQL代码返回叻不必要的数据吗? 
在不必要的地方使用了游标吗 
在不必要的时候使用了临时表吗? 
查询里的提示使用得当吗 
使用了不必要的视图吗? 
只要可能就用存储过程了吗 
你的任何一个存储过程是以sp_开头的吗? 
所有的存储过程的拥有者是DBO吗引用的形式是? 
应用程序利用了连接池吗 
应用程序是适当的打开、重用、关闭连接的吗? 
应用程序从SQLServer返回了不必要的数据吗 
当用户正修改数据时应用程序保持事务打开嗎? 

在上面的表里输入你的结果 

在所有能影响SQLServer性能中被用来访问SQLServer数据的应用程序代码,包括TSQL代码是潜在最影响性能的但不幸的是,这些是很多DBA都不能直接控制的因此,当对基于SQLServer的应用程序调优时通常都忽略了这些

和这一系列文章前面的那些文章一样,本监控的目的吔是找出访问SQLServer数据的应用程序和TSQL代码里容易的性能相关的问题除了这里列出的提示,还有大量更多的影响SQLServer性能的因素但这里列出的是┅个好的开端。

当然如果你在使用第三方软件,那么这部分性能监控不影响你因为你没有做太多关于代码的事但如果你开发了自己的應用程序或应用程序事内部开发的,那么你应该采用这部分SQLServer的性能监控

当你回顾下面监控项目的讨论时,你很快会发现分辨它们中的一些问题甚至纠正它们不是一件小的任务。因此更好的方法是心里带着这些性能提示来开发应用程序而不是在应用程序开发完后去纠正。当开发新的应用程序的时候你可以把这篇文章放在左右以便开发应用程序时能第一时间看到相关的性能提示

TSQL代码返回了不必要的数据嗎? 

SQLServer返回的数据越少操作需要的资源也越少,可以帮助全面提升SQLServer性能这听起来是显而易见的,但这种情形引起的性能问题我一而再再洏三的看到

开发人员在从SQLServer返回数据时结果返回更多不必要的数据,下面是他们常犯的一些错误: 


缺少WHERE子句,除非你要返回表里所有的數据而这种情况几乎很少,在减少返回行的数量时使用WHERE子句是必要的 
? 作为上面建议的补充WHERE子句应尽可能的具有可选性。例如如果你仅需返回特定日期的记录,而不是返回月或年的所有记录设计WHERE语句以便能正好仅仅返回需要的那些行,而不要有额外的行 
? 在SELECT语呴里仅仅包括需要的那些列,而不是所有列同样,当最可能要返回需要的更多的行时不是使用SELECT *。 
我将在这页的后面再次提及该条目,但这里它也适用不要对视图执行SELECT,相反绕过视图直接从需要的表里获取数据。原因是许多视图(当然不是全部)返回比SELECT语句所需哽多的数据而SELECT语句终止返回比需要更多的数据。
万一你不了解它们下面一些性能问题是由返回不必要的数据引起的:有时,返回太多嘚数据会强迫查询优化器执行表扫描而不是索引查找;读数据需要额外的I/O开销;缓存空间也浪费了本来可以被SQLServer为其他目的更好使用的;產生不必要的网络流量;在客户端,内存不得不存储这些额外的数据而这部分内存可以被其他应用更好的使用;等等。

在不必要的地方使用了游标吗 

任何一种游标都会降低SQLServer性能。有些情况不能避免大多数情况可以避免。所以如果你的应用程序目前正在使用TSQL游标看看這些代码是否能够重写以避免它们。

如果你需要一行一行的执行操作考虑下边这些选项中的一个或多个来代替游标的使用: 


? 使用相关孓查询 
上面每一个都能取代游标并且执行更快 如果你不能避免使用游标,至少试着提高它们的速度找出加速游标的方法在其他文章会囿介绍。 

许多人没完全理解UNION和UNION SELECT是怎样工作的因此,结果浪费了大量不必要的SQLServer资源.当使用UNION时它相当于在结果集上执行SELECT DISTINCT。换句话说UNION将联匼两个相类似的记录集,然后搜索潜在的重复的记录并排重如果这是你的目的,那么使用UNION是正确的

但如果你使用UNION联合的两个记录集没囿重复记录,那么使用UNION会浪费资源因为它要寻找重复记录,即使它们不存在所以如果你知道你要联合的记录集里没有重复,那么你要使用UNION ALL而不是UNION。UNION ALL联合记录集但不搜索重复记录,这样减少SQLServer资源的使用从而全面提升性能。 

我曾经注意到一些开发人员机械地在SELECT语句里添加DISTINCT而不论需要与否。从才能的角度看DISTINCT子句仅在特定功能的时候使用,即从记录集中排除重复记录的时候这是因为DISTINCT子句要求存储结果集然后去重,这样增加SQLServer有用资源的使用当然,如果你需要去做那就只有去做了。当如果你知道SELECT语句将从不返回重复记录那么使用DISTINCT語句对SQLServer资源不必要的浪费。

ARGument"(搜索参数)的首字母拼成的"SARG"它是指WHERE子句里列和常量的比较。如果WHERE子句是sargable(可SARG的)这意味着它能利用索引加速查询的完成。如果WHERE子句不是可SARG的这意味着WHERE子句不能利用索引(或至少部分不能利用),相反执行的是表或索引扫描这会引起查询嘚性能下降。

'%500'"通常(但不总是)会阻止查询优化器使用索引执行搜索另外在列上使用包括函数的表达式,两边都使用相同列的表达式戓和一个列(不是常量)比较的表达式,都是不可SARG的

并不是每一个不可SARG的WHERE子句都注定要表扫描。如果WHERE子句包括两个可SARG和一个不可SARG的子句那么至少可SARG的子句能使用索引(如果存在的话)帮助快速访问数据。

大多数情况下如果表上有包括查询里所有SELECT、JOIN、WHERE子句用到的列的覆蓋索引,那么覆盖索引能够代替表扫描去返回查询的数据即使它有不可SARG的WHERE子句。但请记住覆盖索引尤其自身的缺陷如此经常产生宽索引会增加读时的磁盘I/O。

某些情况下可以把不可SARG的WHERE子句重写成可SARG的子句。例如: 

这两个WHERE子句有相同的结果但第一个是不可SARG的(因为使用叻函数)将运行得慢些,而第二个是可SARG的将运行得快些。 

如果你不知道特定的WHERE子句是不是可SARG的在查询分析器里检查查询执行计划。这樣做你能很快的知道查询是使用了索引还是表扫描来返回的数据。

仔细分析机灵思考,许多不可SARG的查询能写成可SARG的查询 

在不必要的時候使用了临时表吗? 

临时表有很多特殊的用途象用来替代游标,不过它们仍能引起性能问题如果这个问题能消除,SQLServer将执行得更快唎如,有几种消除临时表、减少开销、提升性能得方法消除临时表的方法如下: 


? 重写代码以便你要完成的操作能使用标准的查询或存儲过程去做 
使用SQLServer2000的表数据类型。这些不一定更快需要测试 
? 考虑使用关联的子查询 
使用永久表代替 
? 使用UNION语句模仿临时表
每一个选項都常常能用来帮助消除你TSQL代码里的临时表 

查询里的提示使用得当吗? 

通常说来SQLServer查询优化器能很好的完成优化查询的工作。但很少的凊况下查询优化器会失败,为了得到查询最好的性能需要使用查询提示来代替查询优化器

提示在某些情况下是有用的,不过它们也是危险的因此使用提示要特别小心。 

最大的问题之一是遇到大量使用提示的一些代码尤其是这些代码是在? 

为了和SQLServer通信所以的应用程序都需要使用数据访问库(MDAC组件),有几个库可供选择为了最优的性能,.NET是首选如果还没有使用.NET工具,那么接下来最好的选择是ADO在所有的环境下,避免使用DB-LIB(停用但仍支持)和DAO两个都很慢。

如果你在访问SQLServerasp动态页面数据库查询时要在ODBC和OLEDB之间选择那么选择OLEDB,通常它更赽另外,使用OLEDB允许使用很少的DSN连接 这样连接维护比基于ODBC、DSN的连接更快。

应用程序利用了连接池吗 

尝试使用连接池去减少SQLServer的连接开销。连接池是指客户端应用程序在连接SQLServer时不必在有连接需求时每次都建立建立新的连接 而使用以前存在的连接的术语这会减少SQLServer的开销,加速连接

微软提供了两种类型的连接池。通过ODBC的连接池可以使用ODBC数据源管理器配置、注册或调用应用程序。通过OLEDB的资源池可以使用应鼡程序连接字符串配置OLDB API或注册。

要么连接池要么资源池运行相同的连接相同的连接不能两种池都使用。同样连接池要工作得有效率,那么连接要重用而安全实现又很麻烦。对于重用的连接须使用相同的安全环境,否则会自动打开另一个连接连接池会不起作用。本質上这意味着所有从应用程序连接到SQLServer的用户必须共享相同的用户帐号。如果不是当它们需要通过应用程序访问SQLServer时,每个用户将自动打開一个新连接

为了最大化性能,当连接到SQLServer时将几乎总是要利用一个或另一个池的方法 

应用程序是适当的打开、重用、关闭连接的吗? 

┅般说来SQLServer的连接仅在需要的时候打开、使用、然后立即由应用程序关掉。假定你正在使用连接池和适当的安全模型如果连接目前不可鼡会怎样呢?它将被创建一旦连接被应用程序关闭,它将继续打开(尽管应用程序认为它是关闭的)当需要重用时连接是可用的。

减尐实际连接打开和关闭的频率能减少SQLServer的开销同样,应用程序快速的打开和关闭连接这些都允许形成连接池来更有效的重用,也帮助减尐开销提升性能。

一些应用程序由于设计成使用多个asp动态页面数据库查询就使用ANSI SQL替代TSQL访问SQLServer数据。虽然这样做能更容易的连接到各种不哃的asp动态页面数据库查询但也影响了性能。TSQL提供了ANSI SQL里没有的一些特殊的代码这些为性能提供了好处。理论上为了更好的性能,应该使用TSQL来访问SQLServer而不是普通的ANSI SQL

应用程序从SQLServer返回了不必要的数据吗? 

这和TSQL审核建议里的一个是相同的一些应用程序,特别是那些允许用户浏覽数据的程序给用户返回太多的数据常会引起应用程序放宽对用户有利的那些数据的限制。例如我曾经看到应用程序实质上返回了表戓视图的所有行,对应用程序而言还要排序数据以便用户的浏览。如果行数量不大那没问题。但如果行数量巨大例如100000行或更多,那麼SQLServer在返回这些数据时不得不进行巨大数量的操作(通常是表扫描)网络也阻塞了。没有用户会使用所有的数据应用程序应该设计成仅返回用户当时真正需要的数据,而不要多一个字节

另一个返回太多数据的例子是应用程序允许用户执行标准的查询。如果你必须允许用戶选择它们自己的标准重要的一点是禁止偶然返回太多的数据。例如可以在SELECT语句里使用TOP子句,或者在WHERE子句里包括一些缺省的参数来禁圵用户返回表里的所有行

返回不必要的数据是非常浪费资源的,也是很容易避免的问题只需稍微计划计划 

当用户正修改数据时应用程序保持事务打开吗? 

这和TSQL审核建议里的一个是相同的大多数应用程序有一个建议:允许用户查找数据,然后更新这样做成功的关键是尣许用户这样做的时候,确保没有保持连接打开--更新的时候记录会被锁住如果你打开了连接,你会创建不必要的长时间的阻塞锁從而影响性能。

理论上从应用程序的观点来看,一旦用户执行了记录更新应用程序将打开连接,选择记录然后关闭连接。现在记录絀现在应用程序屏幕上一旦用户更新了,那么应用程序需要重新打开连接查看修改过的记录(假定它是更新了),然后关闭连接事務保持尽可能的短是很重要的。

--王成辉翻译整理转贴请注明出自微软BI开拓者[url][/url]


运行了任何不必要的作业吗? 
作业调度是在服务器不忙的时候吗 
作业运行的TSQL是最优化的吗? 
检查作业运行了多长时间吗 
目前的作业有替代方法吗? 

在上表输入你的结果 

如果你不仔细,SQLServer作业有鈳能影响性能 

事实上每个SQLServer都运行一个或更多日常的作业更可能运行很多每周一次的作业。不幸的是大多数DBA创建了作业,然后就忘掉了咜们当然除非作业出了问题。但如果作业没出现问题一天一天的运行下去的话,大多数作业都会被忘掉

就像任何应用程序可能影响SQLServer性能一样,作业也有可能那些有设计得不好的代码的作业,或者在糟糕的时间运行的作业能引起SQLServer重大的损伤。因此将SQLServer作业作为性能監控的一部分指很重要的。 

本节将着眼于如何分辨纠正潜在的与作业相关的性能问题。 

运行了任何不必要的作业吗 

创建一个完成特定任务的作业是很容易的,然而当任务不再需要时忘掉移除它们也是经常发生的事例如,你也许需要创建一个作业去从几个表里每晚移动數据到另一个表里用来产生报表。但如果报表不再有用也就不再有任何需要运行的作业,所以应该移除它们以减少开销问题是在作業和报表之间没有直接连接,所以如果报表不再有用很容易忘记移除作业。

作为监控的一部分检查运行在服务器上的每一个作业,看看作业是否真的需要如果不需要就移除它。 

沿着这个思路看看有重复的作业没有。例如我曾经看到DBA新手使用维护向导在SQLServer里创建了作業,而没有真正意识到它们做了什么然后他们又手工添加了一些与维护向导创建的一个或更多作业相同的作业。同样的事情做了两次大量的浪费了SQLServer的资源 

作业调度是在服务器不忙的时候吗? 

当你检查SQLServer里的每一个作业时看看它们的运行时间。要是作业不必要运行在特定嘚时间尽量在SQLServer不忙的时候调度,如晚上或周末取决于你的环境。

如果你不能确认SQLServer什么时候是空闲的用性能监视器做一个超过一周的監控日志。这将提供给足够的数据以分辨出能运行非时间敏感的作业的空闲时间 

这个问题比大多数DBA意识到的要大得多,特别是当SQLServer有很多佷多的作业时当SQLServer上有很多活动时,如果作业能尽可能的随时间分布则是理想的不要所有的作业都在同一刻运行。例如如果你的SQLServer有10个asp動态页面数据库查询,你要为每个asp动态页面数据库查询创建备份的作业更好的方法是一次运行一个,而不是在同一时间运行所有的作业

虽然你能通过企业管理器查看作业运行的时长,但没有一个容易的方法来一个接一个(给每一个作业足够的时间去完成)的手工调度作業以便它们不产生交迭。这也能做到但对于有大量作业的服务器来说,你也许需要一个表格来列出所有的作业作为一个选择你可以栲虑使用第三方工具如SQL Sentry([url][/url]),它允许你可视化地管理和查看你所有的作业以确保这些作业没有交迭。

所以当你进行作业监控的时候检查看看作业交迭情况,假定这是可能的如果它们的确交迭了,尽量重新调度它们以禁止交迭尽可能分散负载到大量空闲的时间。 

除了SQLServer莋业外你的服务器上也许有一些非SQLServer的作业。有些例子包括碎片整理或磁带备份作业而不是使用SQLServer调度既然这些不使用SQLServer调度,它们也容易被忘记你也许同时终止了一些作业的运行,就像终止SQLServer作业的运行一样和SQLServer作业一样,如果你能在不同时间调度这些作业而不是在SQLServer作业运荇的时候则是理想的如果你需要这样做,在上面讨论的表格里加入这些作业 

作业运行的TSQL是最优化的吗? 

就像应用程序、脚本里的代码┅样运行在作业里的TSQL也是需要优化的一部分。TSQL代码的优化将在其他地方做介绍任何有关的索引也应该被添加以便帮助作业代码更有效率的运行。

所以对于每一个有TSQL代码的作业来说你应该通过查询分析器运行它来查看执行计划,查找潜在的问题也可以通过索引向导,查找潜在的索引以提升性能 

检查作业运行了多长时间吗? 

我已经提过你能使用企业管理器来查看任何作业运行的时长但我没有提及的昰最好随时检查看看这个时长是否有大量的变化。例如一个特定的作业正常情况下运行2分钟,但你发现一周有一次在星期天,同样的莋业花费了15分钟作业时长发生了重大的改变是一个好的迹象表明作业和其他在SQLServer上运行的进程有冲突。如果你发现有这类问题你需要更仔细的调查并分辨出出了什么问题,然后纠正它 

目前的作业有替代方法吗? 

仅仅因为有作业要运行并不意味着它是手边完成任务的最好方法评估每一个作业,然后决定是否有更好的方法来完成同样的工作例如,或许写TSQL代码每晚执行导入比使用目前的DTS包更有效率或者吔许你正运行的作业,使用另外的调度程序去脱离SQLServer运行能更好但记住关键的是,你目前的作业常常不是唯一的解决方法有更好的可用嘚能减少服务器开销的解决方法,如果你花时间考虑一下的话

使用Profiler找出低效的查询

--王成辉翻译整理,转贴请注明出自微软BI开拓者[url][/url]

监控列表 你的答案 


你分辨过所有长时间运行的查询吗 
对这些查询你区分优先次序了吗? 
你重新查看过上面区分优先次序的查询的执行计划了吗 

在上表输入你的结果 

第一步是分辨出长时间运行的查询 

到SQLServer性能监控的这一步止,你应该已经能分辨出所有容易纠正的性能问题了现在昰着手处理更差的查询(包括存储过程)的时候了,那些比预期运行时间更长的占用大量SQLServer共享资源的查询和存储过程

运行慢的查询执行偠花费太长的时间。那么究竟多长才算长呢这得由你决定。通常说来我用5秒作为一个坎儿。换句话说任何一个查询运行5秒或更少通瑺就算足够快了,而查询超过5秒就算长了这是一个你不得不做出的武断的决定。在我工作的公司报表开发人员要写大量的和我有不同標准的征对asp动态页面数据库查询的查询。他们考虑的时长为30秒所以,第一步就是决定多长时间的查询才算长然后在你的服务器性能监控期间使用这个作为你的标准。

我们不能无限制的调优查询我们所能做的就是分辨出那些需要更多工作的查询,然后征对它们进行调优如果有时间的话,为了全面提升SQLServer的性能可以着眼于那些稍慢但仍然讨厌的查询。记住有些时候无论你怎么努力调优一个特殊的查询,可能仅有一点或根本没有性能上的改善

对于这部分性能监控,你将使用SQLServer自带的事件探查器本篇文章仅着眼于怎样进行性能监控,而鈈是工具的使用所以假定你知道怎样使用事件探查器。如果你以前没有用过它查看BOL以获得一些基本的帮助。

在你使用事件探查器捕捉伱的SQLServer查询活动之前记住下面的:


? 不要在你要监控的同一台服务器上运行事件探查器这对服务器性能有一个明显的影响。相反在另┅个服务器或工作站上运行,然后在那儿收集数据 
? 当运行事件探查器时不要选择比需要收集更多的数据。你收集的数据越多用来收集它们而使用的资源就越多,这会降低性能仅仅选择那些你真正需要的事件和数据列。我的建议是所收集的真正的要简短 
? 在一段典型的服务器运行时间内收集数据即典型的3-4小时的时间。这也可以改变依赖于你服务器繁忙的程度。如果你没有这样的时间你可以通过一个典型的生产日的几个不同时间段来收集你需要的所有数据。
当你使用事件探查器时你有两个选项去启动它。一个是使用GUI界面戓者如果你喜欢的话,可以使用内建的事件探查器系统存储过程虽然使用GUI有点简单,但使用系统存储过程收集数据的开销稍微的少一些本文将使用GUI界面。 

事件探查器允许你指定哪些事件需要捕捉那些事件的哪些数据列需要捕捉。另外你可以使用筛选来减少数据而仅偠哪些分析需要的社会局。下面是我的建议:

需要捕捉的数据列 


不要收集系统事件 
? 通过单独的asp动态页面数据库查询ID而不是一次所有的asp動态页面数据库查询都收集数据 
筛选被用来收集数据的数量使用筛选越多,你能筛选掉的不重要的数据就越多一般说来,我使用3个筛選但其他的也能根据你的情形适当的使用 。其中最重要的是duration我仅收集那些对我来说很重要的有足够duration的信息,正如已经讨论的那样 

依賴于使用的筛选、运行事件探查器收集数据的时间、服务器繁忙程度,你可以收集大量的数据行虽然你有几个选择,我建议你配置事件探查器保存数据到本地计算机的文件上(而不是你跟踪的服务器上)并且不设置文件的最大尺寸相反,让文件按需增长你要查看文件嘚增长量,万一它无法控制大多数情况下,如果你使用了正确的筛选文件大小会便于处理的。我建议使用一个大的文件因为如果你那樣做的话很容易分辨出长时间运行的查询

正如前面所述,在一个典型的生产期间收集你的跟踪文件大约3-4小时为一期限。当收集数据后可使用duration来分类,运行时间最长的查询出现在跟踪窗口的底部当你收集数据的时候有兴趣的话可以看一会儿窗口。如果你喜欢可以配置在适当的时候自动关闭事件探查器,也可以手动关闭 

一旦时间到跟踪停止了, 事件探查器的跟踪现在存在本地计算机的内存和磁盘上现在你准备去分辨那些长时间运行的查询了。 

我猜你已经能分辨出所有在跟踪收集期间运行的超过你指定的duration的所有查询不管是不是。所以如果你指定duration为5秒那么你将只看到那些运行超过5秒的查询。根据定义你捕捉的所有查询都需要调优。"什么!但捕捉到了500多个查询啊! 那鈳是一项大工程!"那并不是你想象的那么糟大多数情况下,你捕捉的很多查询是重复的换句话说,你可能在你的跟踪里一再地捕捉了同樣的查询所以,那些500多个捕捉到的查询也许仅仅只有10个或50个或100不重复的查询另一方面,也许捕捉到的只是少数的查询如果你够幸运嘚话。 

无论是少数查询还是大量运行慢的查询你接下来的工作是首先决定哪一个查询对你的分析和调优来说是最重要的。这需要你设置優先级因为你可能没有足够的时间去分析所有的查询。 

为了设置这些长时间运行的查询的优先级你可能首先要着眼于那些运行最长的查询。但当你这么做时要记住每个查询运行的频率。

例如如果你指定一个特定的查询仅仅是为了生成报表而一个月只运行一次(碰巧茬它运行的时候你捕捉到了),这个查询运行花了60秒它可能没有那些运行花了10秒但1分钟运行了10次的查询的优先级高。换句话说你需要岼衡查询运行的时长和频率。谨记这一条:你需要分辨并设置那些花费最多SQLServer物理资源的查询的优先级一旦你做完这件事,就可以准备分析和调优了 

通过查看执行计划分析查询 

为了分析你捕捉到的已经设置优先级的查询,你需要把代码移到查询分析器里以便能查看执行计劃分析查询。本篇文章着重在监控而不是分析,我们不会在这里花费时间去向你展示怎样分析特定的查询这本身是一个很大的课题,将在其他地方做介绍 

为了分析你怎样移到代码到查询分析器里依赖于代码。如果你捕捉到的代码是TSQL你可以剪切,然后直接在查询分析器里粘贴但如果代码是在存储过程里,你不得不稍微多做一点工作因为事件探查器不会显示存储过程里的代码,而仅显示存储过程嘚名称包括传给它的所有参数。这样为了在查询分析器里分析查询,你必须考虑到存储过程里将代码复制粘贴到查询分析器里。然後假定那儿也有一些参数了,你不得不手工更改代码以便它能带着参数运行而被事件探查器捕获 

现在耗时的杂事开始了,分析每一个查询的执行计划看看有没有能改善性能的查询需要调优但是因为你已经分辨和设置这些查询的优先级可,所以你的时间将更有效率

--王荿辉翻译整理,转贴请注明出自微软BI开拓者[url][/url]

到目前为止你已经进行了大量的阅读。在最后这篇关于SQLServer性能监控的文章里我们将讲一些为叻最好的实现SQLServer性能监控的最好的实践。在对你的SQLServer进行任何实际的性能监控之前你需要阅读这篇文章 

自定义性能监控 

在这一点上,我假定伱已经阅读了或者至少浏览了所有监控步骤的建议。我猜你也许读了一些但那些真正不适合于你。既然大部分的SQLServer安装稍微有点不同那么这是有意义的。因此我建议你为你特定的环境自定义这个监控添加或删除一些步骤使其更适合你的需求。 

当你对你的每一个SQLServer进行监控时你需要一个方法去记录结果。当你有大量的选项时从这一系列的文章里复制适合的监控列表到你的Word或Excel文档作为起点是比较快速的方法。你可能要为每个服务器创建一个单独的监控列表如果你决定为你的监控表格使用Excel的话,你能输入所有的监控列表项目作为行每┅个监控的服务器作为单独的列。这样你能快速的查看每个SQLServer的结果 

如果你管理大量的SQLServer和asp动态页面数据库查询,你也许不知道从哪儿开始性能监控理论上,你应该设置SQLServer和asp动态页面数据库查询的优先级一些需要立即进行最多的性能监控,而其他的则不必进行那么多的监控这会帮助你决定从哪儿开始。最可能的是你将不会立即监控全部。相反要在能监控的时候监控,按照从最重要到最不重要的顺序进荇 

谨记性能监控的关键 

当对SQLServer进行监控的时候 ,记住目的是分辨并纠正容易的问题但是,正如你所料你将可能也分辨出一些更难于解決的问题。为了帮助你更好的管理有限的时间你现在需要着眼于那些容易的问题,把困难的问题留到容易的问题先解决完之后所以在伱执行监控和分辨问题时,按照难易程度分类设置它们的优先级将困难的问题留待你有足够时间处理它们的时候。 

当你执行监控时你鈳能会急于对偶然遇到的问题进行纠正和修改。大多数情况下那样做可能不是问题。但理论上最好先执行监控,然后基于你的发现決定正式动手解决你分辨出的问题,然后系统地实现它们 

一个推荐步骤,但或许会招来很多疑问 

理想情况下如有很多的时间,在服务器上执行一个性能基准是一个好的想法然后执行监控,做任何需要的更改再执行另一个性能基准去看看有什么情况发生。这会立即让伱知道你所做的是否有帮助大多数情况下,没有做正确的事虽然这个建议被强烈的推荐,也许从时间来看不很实际但如果你有时间嘚话,应该认真考虑 

另一个推荐步骤,但或许也会招来很多疑问 

在执行监控之后你也许发现在单个的SQLServer上所有需要的更改仅只有一两个,但在其他SQLServer上也许需要做一打的更改。如果有那么的更改要做不要立刻全部实现它们,仅仅一次一个或几个的更改也许是一个明智的選择这样,你能够看看每个或每批更改对服务器产生的效果如果你一次做了很多的更改,那么遇到问题时你将不会知道是由哪个更妀引起的问题,这要求你回滚所有的更改然后一个一个的测试它们直到找到问题所在为止。 

这个建议不会有太多疑问 

如果你要做更改的垺务器是有紧要事务的生产服务器你要对你做的更改倍加小心。理论上你应该在生产服务器应用更改之前在测试用的SQLServer上测试所有的更妀。如果你不实践那么每次仅做一个更改,确信如果有任何问题你知道怎样回滚更改另外,试着选取一天中不很忙的时候做更改万┅有问题的话。 

有一个取消计划 

你因监控而做出的大多数更改应该能够很容易的回滚但一些也许不那么容易。在那些情况下你需要有┅个万一需要的取消计划。例如在你做出任何关键的更改之前备份系统和用户asp动态页面数据库查询。那样即使出现问题,你也能将你嘚服务器恢复到更改之前的状态我不是吓唬你不要做更改,但你总应该有所准备 

当你基于性能监控做出更改时,确定你对所有的更改莋了记录这样,即使后来有什么问题你也能更容易的找出错误所在。最容易记录下你的更改的方法可能就是把它们添加到你的监控表格里或者其他你用来收集监控信息的文档里。 

许多SQLServer(并非全部)随着时间而改变设置改变,打了SP补丁甚至数据也改变了。所有的这些都会影响性能确定你SQLServer最优性能的最好方法是做一个手工的性能监控。 

在完成一个监控并更改之后接下来该做什么呢? 

轻松一下哦,不是刚好相反。记住这一系列的监控是为捕捉显而易见和容易纠正的SQLServer性能问题而设计的。一旦你做完这些接下来,你要分辨和纠囸更难于纠正的问题前面所提及的性能监控,也许能分辨一些可能问题而其他的问题你不得不在它们出现的时候发现它们。无论如何你要尽可能的花费更多的时间分辨和纠正最初性能监控遇到的困难问题。但和其他事情一样着眼于那些引起最大性能问题的问题,然後尽你许可的时间用你的方法去解决它们祝你好运!

我要回帖

更多关于 asp动态页面数据库查询 的文章

 

随机推荐