如何在 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数据库被标记为“可疑”的解决办法
WiX 引导程序的示例应用程序(检查 .NET Framework 和 SQL Server 2005/2008)
SQL Server 2005/2008/2012中应用分布式分区视图
SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思 sql server 2005 2008