Sql性能优化之检查问题sql的方法

来源:互联网 发布:js设置标签隐藏 编辑:程序博客网 时间:2024/06/05 23:01

Sql性能优化之检查问题sql的方法

 

出现查询性能问题时,首先要做的是确定问题点是什么,只有正确的找到问题后才能有针对性的解决问题。

下面简单介绍我们一般从哪些角度入手,来确定问题所在:

首先,从业务上理解该处功能,理解用户的真正意图,用户真正关注的是什么,想要的是什么数据,是否有变通简洁的方法达到用户要求。而非使用复杂sql查询。其实有些时候进行变通的修改,同样能达到目的,但是采用的sql语句已经极大地简化了。这是解决效能问题的优先要考虑的。

其次,对固定的sql进行优化时,一定要关注查询相关的数据量,关注数据量的大小,有些时候用户进行一个查询,若没有处理好查询条件的话,返回的记录集合太大,这对用户来说,其实意义不大,关键是这样必然会导致较多的磁盘IO,效能问题是必然的。除非是用户真的需要这么多数据,但事实证明,多数都不是的,所以着眼点是怎样限制返回的记录集的大小或查询中使用的临时中间数据集合的大小。这样才能使你的优化达到效果,起到作用。

 

下面简单介绍几种常用的检查问题sql的方法:

1)setstatistics io on

使用 set statistics io on 检查实际的磁盘IO信息,物理读、逻辑读等信息,这个是一个简单有效的参考数据,也是主要的参考数据。

例如:

set statisticsioon

select *from patientinfo;

 

除了使用 setstatistics io on的命令,也可以在空白处点击右键,选择<查询选项>,如下图所示:

 

在右图中,选择<高级>,并勾选SetStatistics Io 。

 

运行查询,除了得到结果集合以外,还可以得到本次查询相关的IO信息,如下图:


我们一般关注逻辑读的次数,当多个表联合查询时,这里会现时每一个表的IO信息,当某个表的逻辑读的次数很大时,就要重点关注和分析这个表了,是不是查询时涉及到这个表中的记录条数过多,是不是没有合理使用到Index,是不是可以增加其它的过滤条件来减少相关的记录集合等等。

输出项含义:

Table              表的名称。

Scancount         执行的索引或表扫描数。

logicalreads          从数据缓存读取的页数。

physicalreads     从磁盘读取的页数。

read-aheadreads   为进行查询而放入缓存的页数。

lob logicalreads   从数据缓存读取的 text、ntext、image 或大值类型(varchar(max)、nvarchar(max)、varbinary(max)) 页的数目。

lobphysical reads        从磁盘读取的text、ntext、image或大值类型页的数目。

lobread-ahead reads   为进行查询而放入缓存的 text、ntext、image 或大值类型页的数目。

 

2)setstatistics time on

使用 set statistics time on 参考显示分析、编译和执行语句所需的毫秒数。具体的使用方法同setstatistics io on 基本相同,只不过显示的是本次查询所使用的分析编译、执行等的时间信息。

 

set statisticstimeon

select *from patientinfo;

跟上述一样,除了命令,也可以在<查询选项>页面勾选。

运行查询后,可以查看相关的时间信息:


3)setstatistics profile on

使用 set statistics profile on 参考显示当前语句执行的配置文件信息,执行步骤等信息,使用方法同上。

set statisticsprofileon

select *from patientinfo;

执行查询后,除了显示所执行的结果集合外,还另外显示本次sql语句执行的相关配置信息,采用记录树的形式显示,对应执行计划中的各个步骤,比如某个步骤使用的索引类型,评估行数,IO信息,时间信息等。这些信息都可以用来参考,以确定该段sql语句的问题在哪里。

 

 

4)执行计划

参考当前语句的估计的执行计划或实际的执行计划,分析当前语句执行时SQLServer 查询优化器所选择的数据检索方法。

实际的执行计划显示了本次执行所使用的执行计划。该图应该从右向左看,由下向上看,如果是多个表连接查询的话,这里也会显示多个执行步骤,可以检查每一个步骤相关的操作相关信息,如IO开销,CPU开销,估计的行数,有没有使用到Index,以及使用的何种Index等信息。行数过多则需要留意了。所使用的Indexl类型也是需要关注的信息之一。

其具体内容如下:


综合以上介绍的几种参考信息的方法,一般都可以确定问题sql的问题所在,然后对症下药,剩下的就是进行针对性的修改了。

 

 

 

0 0
原创粉丝点击