正确统计SQLServer的慢日志

RDS的一个富有吸引力的服务是为用户提供慢日志的运行状况报告。报告从不同的维度(总执行时间,总执行次数,总逻辑读,总物理读)为用户提供TOP20的SQL。RDS希望在为用户提供稳定,快速服务的同时,用户可以从RDS得到更有个性化的优化建议。

这些信息很重要,用户可以有针对性地采取一些措施提高系统的性能。比如:对于那些总执行次数很多的SQL,用户可以在涉及到这些SQL的业务中加入缓存;如果某个SQL的总逻辑读很多,那么,用户极有必要为这些SQL涉及的字段添加缓存(从RDS缺失索引推荐服务的结果看,这类总逻辑读很多的SQL得到索引推荐的可能性很大)。

下面是一个报表的例子:

我们需要得到某一个时间段的SQL统计信息,比如某一天的运行状况。为了得到SQLServer的SQL统计信息,我们做了一些非常有意思的工作,原因在于SQLServer没有直接提供“某个时间段”的SQL运行信息。但是,SQLServer的sys.dm_exec_query_stats视图提供了SQL即时的运行统计信息(我们主要关注execution_count,total_elapsed_time,total_logical_reads,total_physical_reads这四个指标),这些统计信息是不断增长的,并且这些统计信息极有可能从缓存中换出。也就是说,如果某个SQL的统计信息不从缓存中换出,那么这些统计项的值是不断累加的,比如,昨天你看到execution_count是120,今天你会看到execution_count是230,到了明天,execution_count的值可能就是512。

为了得到“某个时间段的统计信息”,我们需要采取一些措施才行。核心的算法由 @鹿久 同学提供,其思想就是定期为sys.dm_exec_query_stats打快照(snapshot),然后根据快照计算快照的差值,从而得到某个时间段的运行状况统计信息。

例如,在1:00时,我们打了一次快照,此时某个SQL的execution_count的值是100, 在6:00时,我们再次打了一次快照,此时execution_count的值是120,在23:00时,我们又打了一次快照,此时execution_count的值是900。通过快照的信息,我们可以得知a) 1:00到6:00之间,该SQL执行了20次,b) 在1:00到23:00之间,该SQL执行了800次。我们可以大约得知,该SQL当天执行了800次。

RDS目前每一小时打一次快照,每8小时对当前的快照进行汇总,生成报表。下面是RDS大快照的一段记录:

此外,RDS重点对这些慢日志进行分析,提供了缺失索引推荐服务。

时间: 2024-12-31 19:44:14

正确统计SQLServer的慢日志的相关文章

PHP 中如何正确统计中文字数

PHP 中如何正确统计中文字数?这个是困扰我很久的问题,PHP 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了 strlen,mb_strlen,mb_strwidth 这个三个函数去测试统计字符串的长度,看看把中文算成几个字节: echo strlen("你好ABC") . ""; # 输出 9 echo mb_strlen("你好ABC", 'UTF-8') . ""; # 输出 5 echo mb_strw

(转)对SQLSERVER数据库事务日志的疑问

本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/06/10/3130856.html 对SQLSERVER数据库事务日志的疑问 摸不透SQLSERVER了 实验环境:SQLSERVER2005 SP4,Windows7 本来没什么心情写文章,反正没人看,关于我文章中提到的问题,有些可以从文章结尾的MSDN补充那里找到答案,而有些还没有答案 根据CSDN博客的这篇文章介绍,大家可以先看一下,然后再继续往下看,因为下面会引用到CSDN博客里的

sqlserver 删掉日志文件ldf以后 救命语句

sqlserver 删掉日志文件ldf以后  救命步骤: 先新建一个新数据库, 删掉新建的 .mdb 用想要还原的mdb覆盖 执行下面的语句 ALTER DATABASE 'DB_Core' SET RECOVERY SIMPLE; alter database DB_Core set emergency alter database DB_Core set single_user dbcc checkdb('DB_Core',REPAIR_ALLOW_DATA_LOSS) dbcc check

SQLServer存储引擎——日志

3. SQLServer存储引擎之日志篇 (3.1)日志结构 (3.1.1)物理日志 (0)物理日志即数据库的.ldf文件, 当然后缀名是可以自定义的,默认是.ldf (1)一个SqlServer数据库,可以定义多个物理日志文件,SQL Server逻辑上把他们当作一个整体,顺序写入日志记录,用完第一个,再用下一个:即第一个日志文件的当前空间,如果没有可分配的VLF时,就会使用下一个日志文件的VLF,直到最后一个日志文件也没有可分配的VLF时,会重新回到第一个日志开始增长:VLF的使用如下图:

91. 正确统计中文字数

PHP 中如何正确统计中文字数?这个是困扰我很久的问题,php 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了 strlen,mb_strlen,mb_strwidth 这个三个函数去测试统计字符串的长度,看看把中文算成几个字节: echo strlen("你好ABC") . ""; //输出 9 echo mb_strlen("你好ABC", 'UTF-8') . ""; // 输出 5 echo mb_str

python 统计时间,写日志

python 统计时间使用time模块,写日志使用logging模块,这两个都是标准模板. 测试socket使用socket模块 # 统计时间 ---------------------- import time start = time.time() end = time.time() stamp = end - start print "耗时", stamp # 日志 ----------------------- import loggingimport datetime cur

数据统计以及商城运营日志在电子商务中的重要性(转)

最近遇到了很多麻烦,其中之二就是标题中提到的数据统计和商城运营日志出了很大的问题. 第一个问题是,在之前的网站后台建设中忽略了数据统计的重要性,这倒不是说连个统计工具都没有使用,反而我们还特地定制了一个统计统计工具,并放在了自己的服务器上运行.但是问题出在:统计工具定制的功能不足,随着商城的发展,需要实现越来越多的统计功能以支持商城决策,但是这些新出现的需求都是当时没有预计到的: 统计工具的基本功能,商城pv.uv.ip以及以上三种数据的趋势图:分页面的pv.uv.ip等常见功能,这些大的功能模

sql数据库还原,出现媒体簇的结构不正确,SQLServer无法处理此媒体簇的解决方法

问题: sql数据库还原,出现媒体簇的结构不正确,SQL Server无法处理此媒体簇. 异常如下图. 造成问题的原因: 我的电脑上安装了sql2005和sql2008,问题就在于我用sql2008的SQL Server Management Studio工具打开的是sql2005的实例.用SELECT @@VERSION语句即可查看当前的实例版本.如下图. 所以最终的解决方案就是,只要保证连接实例所在的版本号大于等于要还原的数据库的版本号,即可还原成功.

SQLServer (2005/2008) 日志清理方法

--数据库日志名称查询 USE DBNAME GO SELECT file_id, name,* FROM sys.database_files; GO------------------------------------------------------------------------------------------------------- --SQL SERVER 2005 清理方法 USE [master] BACKUP LOG DBNAME WITH no_log USE