SQL2005性能分析一些细节功能你是否有用到?(三)

原文:SQL2005性能分析一些细节功能你是否有用到?(三)

     继上篇: SQL2005性能分析一些细节功能你是否有用到?(二)

     第一: SET STATISTICS PROFILE ON

          当我们比较查询计划中那一个最好时,事实上我们更愿意用SET STATISTICS PROFILE ON,而不是SET SHOWPLAN_TEXT ON。它可以告诉你每种选择的或多或少的查询消耗情况;你还可以同时运行两个或更多查询来看哪个执行的最好。

          运行SET STATISTICS PROFILE ON 后,发出现很多信息,这里以stmtText来说明下:

         StmtText:
select * from
         (
            select *,
               row_number() over (order by card_no desc) as RowNum
              from tblName
          ) as tbl

where RowNum between 1 and 20

 

|--Filter(WHERE:([Expr1003]>=(1) AND [Expr1003]<=(20)))    
  |--Top(TOP EXPRESSION:(CASE WHEN (20) IS NULL OR (20)<(0) THEN (0) ELSE (20) END))    
    |--Sequence Project(DEFINE:([Expr1003]=row_number))
     |--Compute Scalar(DEFINE:([Expr1007]=(1)))
       |--Segment   
        |--Nested Loops(Inner Join, OUTER REFERENCES:([bdg_retail].[dbo].[Card_Ext].[Id], [Expr1005]) WITH ORDERED PREFETCH)
         |--Index Scan(OBJECT:([bdg_retail].[dbo].[Card_Ext].[IX_Card_ext_Card_No]), ORDERED BACKWARD)
          |--Clustered Index Seek(OBJECT:([bdg_retail].[dbo].[Card_Ext].[PK_CARD_EXT]), SEEK:([bdg_retail].[dbo].[Card_Ext].
            [Id]=[bdg_retail].[dbo].[Card_Ext].[Id]) LOOKUP ORDERED FORWARD)

           除了显示出当前SQL语句外,还详细的给出了实际运行的情况,怎样查找索引,怎样扫描表,又是怎样排序等等.

              Nested Loops:嵌套查询; 

              Index Scan:索引查找;

              Clustered Index Seek:聚集索引查找

      第二:sp_spaceused

         作用:获得表大小的统计信息以供我们分析:

         案例:

         sp_spaceused employees
         Results:
         name rows reserved data index_size unused
         -------------- -------- --------- ------- -------------- ---------

         Employees 2977 2008KB 1504KB 448KB 56KB

         效果图:

         返回内容说明:     

                Name     为其请求空间使用信息的表名。
                Rows  表中现有的行数。
                reserved  表保留的空间总量。
                Data 表中的数据所使用的空间量。
                index_size 表中的索引所使用的空间量。
                Unused 表中未用的空间量。

          备注: sp_spaceused 计算数据和索引使用的磁盘空间量以及当前数据库中的表所使用的磁盘空间量。如果没有给定 objname,sp_spaceused 则报告整个当前数据库所使用的空间。

          权限:执行权限默认授予 public 角色。

      第三:SQL2005 中的排名函数row_number()

           分页算法有很多种,这里我想说一下我一直在用的分页方法,SQL2005的新特性:排名函数中的row_number()
ROW_NUMBER (Transact-SQL)

           定义: 返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

           语法:ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )

           参数:1:<partition_by_clause>:将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

                  2:<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。当在排名函数中使用 <order_by_clause> 时,不能用整数表示列。

           返回类型:bigint 

           备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

           本节意图:以前我一直有一个误区,就是认为只要是分页时按需所取(查询第几页就取第只取几页的数据),效率就会特别高,后来用上了IO分析,才知道并不像我想像中的那样完美(取任何一页速度都是一样快).

           案例:

--取第一页
(20 row(s) affected)

Table 'Card_Ext'. Scan count 1, logical reads 92, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

--取第一百页
(20 row(s) affected)

Table 'Card_Ext'. Scan count 1, logical reads 8157, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

 --取第一万页  
(20 row(s) affected)

Table 'Card_Ext'. Scan count 1, logical reads 81322, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

               解决方案:大数据分页中,无论你采用什么样的分页算法,都会出现性能瓶颈,所以可以采用top n的方法来折中一下:当实际查询结果特别多时,只选取前n条.

              本节结论: 上面的结果都是在已经有数据缓存的情况下运行的结果,所以只看到了逻辑读,并没有出现物理读取的记录.记录显示,逻辑读数量在不断变化,根据用户取的页数大小成倍增加,也就是说与页数大小成正比.原因是row_number()的产生是在数据全部查询出来后再按照排序顺序从一开始生成的,所以它要把页数之前的所有数据都先装成内存,才能生成.
这样就非常直接的回答了为什么取数据越到最后速度越慢的原因了.

       顺便说下在运用sp_help命令时,是不能同时运行执行计划的.否则会报这样的错:Msg 262, Level 14, State 4, Procedure sp_help, Line 88 SHOWPLAN permission denied in database 'master'.

      总结:性能调优是一项特别细的工作,往往更改一个小小的语句性能就会发生翻天覆地的变化;要在不断的实践中总结经验。

注:

    本文引用:MSDN

   

 

时间: 2024-09-28 04:28:30

SQL2005性能分析一些细节功能你是否有用到?(三)的相关文章

SQL2005性能分析一些细节功能你是否有用到?(二)

原文:SQL2005性能分析一些细节功能你是否有用到?(二)        上一篇:SQL2005性能分析一些细节功能你是否有用到? 我简单的提到了些关于SQL性能分析最基本的一些方法,下面的文章我会陆续补充.前面提到了根据SQL的执行IO和执行计划来分析,还有一个特别重要的参数,就是SET STATISTICS TIME.        第一: SET STATISTICS TIME                定义:SET STATISTICS TIME (Transact-SQL)  显

SQL2005性能分析一些细节功能你是否有用到?

原文:SQL2005性能分析一些细节功能你是否有用到?      我相信很多朋友对现在越来越大的数据量而感到苦恼,可是总要面对现实啊,包括本人在内的数据库菜鸟们在开发B/S程序时,往往只会关心自己的数据是否正确的查询出来,一旦自己写的程序哪天要花上十秒或者是一分种才会出来,此时就技穷了.如何优化成为菜鸟们的难题.本人不才,最近看了些园友关于数据库优化的文章,觉的有必要总结下,让更多像我一样只关心结果,并不关心质量的朋友少走些弯路.     本文主旨:本文并非大谈高深技术(也没这本事),只是想总结

如何进行 Python性能分析,你才能如鱼得水?

[编者按]本文作者为 Bryan Helmig,主要介绍 Python 应用性能分析的三种进阶方案.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 我们应该忽略一些微小的效率提升,几乎在 97% 的情况下,都是如此:过早的优化是万恶之源.-- Donald Knuth 如果不先想想Knuth的这句名言,就开始进行优化工作,是不明智的.然而,有时你为了获得某些特性不假思索就写下了O(N^2) 这样的代码,虽然你很快就忘记它们了,它们却可能反咬你一口,给你带来麻烦:本文就是为这种情况而准备

PHP 性能分析(三): 性能调优实战

在本系列的 第一篇 中,我们介绍了 XHProf .而在 第二篇 中,我们深入研究了 XHGui UI, 现在最后一篇,让我们把 XHProf /XHGui 的知识用到工作中! 性能调优 不用运行的代码才是绝好的代码.其他只是好的代码.所以,性能调优时,最好的选择是首先确保运行尽可能少的代码. OpCode 缓存 首先,最快且最简单的选择是启用 OpCode 缓存.OpCode 缓存的更多信息可以在 这里 找到. 在上图,我们看到启用 Zend OpCache 后发生的情况.最后一行是我们的基准

WEB前端性能分析--工具篇

在线网站类: WebPageTest 说明: 在线的站点性能评测网站,地址http://www.webpagetest.org/ 补充: 其实这网站也是个开源项目,所以支持自己搭建一个内部的测试站点 ShowSlow 说明: showslow是yslow的数据收集与展示平台http://www.showslow.com/,它是一个开源的php项目,可以用来与firefox的yslow插件.page speed插件或者dynatrace通信,收集插件或程序所发送过来的信息并集中展示.只需要在dyn

Linux性能分析工具汇总合集

出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具,是不可能完全掌握的,另外对系统性能分析和优化是一个长期的系列. 本文档主要是结合Linux 大牛,Netflix 高级性能架构师 Brendan Gregg 更新 Linux 性能调优工具的博文,搜集Linux系统性能优化相关文章整理后的一篇综合性文章,主要是结合博文对涉及到的原理和性

SQL查询性能分析

原文:SQL查询性能分析 原文出处:http://blog.csdn.net/dba_huangzj/article/details/7623926 SQL查询性能的好坏直接影响到整个数据库的价值,对此,必须郑重对待. SQL Server提供了多种工具,下面做一个简单的介绍:   一.SQL Profiler工具 SQL Profiler可用于: l  图形化监视SQLServer查询: l  在后台收集查询信息: l  分析性能: l  诊断像死锁这样的问题: l  调试Transact-S

性能分析工具的使用

 性能规划器的使用     性能规划器(Capacity Planner)是集成在Oracle 企业管理包(Oracle Enterprise Management Packs)中用来对反映系统性能的参数进行收集的工具,可以指定要收集的数据.收集数据的频率和数据装载到Oracle Capacity Planner历史记录数据库的时间.这样便于管理员对一定时间范围内的系统性能参数进行比较分析.    1. 性能规划器的设置    (1)在服务器的桌面选择[开始]/[程序]/[Oracle-OraH

MySQL性能分析系统

对于MySQL慢查询日志的分析,现已由多种工具来提供:最原始的mysqldumpslow,功能比较齐全的 mysqlsla和percona的 pt-query-digest:以上工具大大提高了DBA来分析数据库的性能效率,减少了过多的猜测过程: 如果能实现定时分析SQL并且进行可视化展示呢? 适用过Query-Digest-UI-master 这个UI插件,在配合 percona的 pt-query-digest工具,只是简单做到一个可视化的结果:如果对于多个服务器的分析,这个表现的就很吃力: