如何在 SQL Server 2005/2008 中清除查询执行统计信息

Posted

技术标签:

【中文标题】如何在 SQL Server 2005/2008 中清除查询执行统计信息【英文标题】:How to Clear down Query Execution Statistics in SQL Server 2005/2008 【发布时间】:2011-01-15 15:52:02 【问题描述】:

基于使用从这篇帖子Most Executed Stored Procedure - Stack Overflow 获得的这条非常有用的 SQL 获取查询执行统计信息:

SELECT TOP 100
   qt.TEXT AS 'SP Name',
   SUBSTRING(qt.text, qs.statement_start_offset/2, CASE WHEN (qs.statement_end_offset = -1) THEN LEN(qt.text) ELSE (qs.statement_end_offset - qs.statement_start_offset)/2 END) AS actual_query,
   qs.execution_count AS 'Execution Count',
   qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',
   qs.total_worker_time AS 'TotalWorkerTime',
   qs.total_physical_reads AS 'PhysicalReads',
   qs.creation_time 'CreationTime',
   qs.execution_count/DATEDIFF(Second, qs.creation_time, GETDATE()) AS 'Calls/Second'
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE qt.dbid = (SELECT dbid
                FROM sys.sysdatabases
               WHERE name = 'BSP')
ORDER BY qs.total_worker_time/qs.execution_count DESC

如何彻底清除这些执行统计数据并从头开始?

这将特别有用,因为开发错误和测试已导致例程通常被大量调用,从而使真正的使用级别无效。

【问题讨论】:

【参考方案1】:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

【讨论】:

这在测试环境中有效 - 在生产环境中这样做有任何风险吗? 是的,虽然它被列为开发错误和测试,所以除非他们针对产品​​进行测试/开发,否则应该没问题。在生产环境中,它会严重占用 CPU,但会恢复。 SQL Server 2012 我刚刚使用了DBCC FREEPROCCACHE。为什么我们还要清除buffer 如果您不删除缓冲区,则查询的后续运行将使用缓存到内存中的数据 - 扭曲结果,因为整个过程现在很有可能使用逻辑 IO,不是物理的。 msdn.microsoft.com/en-us/library/ms187762.aspx re “在生产中要小心” - 因为这会清除执行计划缓存,服务器必须从头开始创建和编译它们。在我们的(相对较大的)应用程序中,需要半天时间才能将所有计划恢复到缓存中。

以上是关于如何在 SQL Server 2005/2008 中清除查询执行统计信息的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2005/2008 中获取星期几

Sql Server 2005/2008数据库被标记为“可疑”/“质疑”的问题

Sql Server 2005/2008数据库被标记为“可疑”的解决办法

WiX 引导程序的示例应用程序(检查 .NET Framework 和 SQL Server 2005/2008)

SQL Server 2005/2008/2012中应用分布式分区视图

SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思 sql server 2005 2008