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

30

根据通过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个回答

62
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

那在测试环境中是可行的 - 这样做在生产环境中有任何风险吗? - Simon Mark Smith
1
是的,尽管它被列为开发错误和测试问题,但是除非他们正在测试/开发反对实际环境,否则应该没事。在生产环境中,它会严重影响 CPU,但会恢复正常。 - Andrew
1
SQL Server 2012 上,我刚刚使用了 DBCC FREEPROCCACHE。为什么我们还应该清除 buffer 呢? - gotqn
2
如果您不删除缓冲区,则查询的后续运行将使用缓存在内存中的数据 - 这会导致结果出现偏差,因为整个过程现在很可能正在使用逻辑IO而不是物理IO。http://msdn.microsoft.com/en-us/library/ms187762.aspx - Andrew
1
“在生产环境中要小心” - 因为这会清除执行计划缓存,服务器必须从头开始创建和编译它们。在我们(相对较大的)应用程序中,需要半天时间才能将所有计划重新放回缓存中。 - Alex from Jitbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接