sql运行速度慢怎么办
最近使用ASP.NET写的一个页面,用户反映页面加载很慢,需要几十秒钟,需要分析优化一下。这是一个ASP.NET网站,从数据库里读取的商品数据,然后显示在前端页面中。简单描述一下查找问题的过程,以及其中学到的经验。
首先,要分析一下到底是哪里慢。一般第一反应都是SQL语句是不是慢,需不需要加索引优化一下。使用SQL 监听的方式,找到了运行的SQL语句,拷贝出来,然后在SQL 中运行,发现2秒就执行完毕。所以排除了SQL慢的问题。
其次,既然SQL不慢,那可能是网站的某个方法慢了。接下来就是记录下来每个方法的具体执行时间,使用了的方式,在等方法开始执行的时候加一个.Start, 然后结束的时候加一个.Stop,然后算一下时间。通过观察日志,发现这些方法执行都很快,毫秒级别就执行完毕了。
那么就奇怪了,怎么页面加载会慢呢?然后又访问了一下页面,更奇怪了,页面不慢了。待了一会,又慢了。总结就是,第一次很慢,然后快了,然后多一段时间又慢了,又快了。
难道是跟IIS有关?这个网站部署在IIS中, pool对应的 设置,是Idle空闲20分钟后就退出。所以考虑到这种空闲一会就变慢的现象,难道是因为空闲了一段时间后,w3wp.exe( )对应的进程退出了,然后再次访问的时候,需要重新创建w3wp.exe进程,难道会变慢?接下来就是重启网站,然后把这个网站的 pool对应的w3wp.exe进程杀掉,然后再次访问。这次它确实有了重新创建w3wp.exe进程的过程,但是速度依然很快,毫秒级别就完成了,网页也很快就刷出来了。这不是这个网页偶尔很慢的原因。
后来想到是不是数据库缓存的原因。发现确实是这个原因。第一次我们执行SQL的时候,由于SQL比较耗费时间,所以很慢,需要30秒左右,导致第一次刷页面的时候很慢。但是SQL 在第一次运行这段SQL之后,会缓存这个结果,第二次IIS服务器或者我们打开的SQL 再次向服务器运行同样的SQL的时候,SQL 会从它自己的缓存中找到结果,然后返回给调用者,这次速度就很快。但是一段时间以后,SQL 缓存的结果会过期,这就是为什么过一段时间又慢了。
注意,SQL 不仅仅会对存储过程进行缓存,对通过网络传过来的SQL进行查询的结果,也会进行缓存。
既然找到了是SQL的运行速度慢,那么就需要优化一下。现在问题来了,我们怎么调这个SQL呢?我们第一次运行的时候,它会缓存,我们稍微改了改,它第二次运行的时候,如果大的结构没有变化,它依然能从缓存中找到结果,速度会非常快,给我们一种SQL运行很快的假象。为了能够真正查看SQL的运行速度,我们在运行SQL之前,可以执行以下命令,来清除对于SQL查询结果的缓存。
CHECKPOINT
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
这时候就能真正的拿到SQL查询运行的速度,进行优化。问题就解决了。