捕获SQL Server查询中子组件所花费的时间

时间:2011-12-16 21:10:54

标签: sql performance sql-server-2008

我正在调整存储过程。它是一个巨大的存储过程并连接有大约6-7百万条记录的表。

我的问题是如何确定在proc组件中花费的时间。 proc有一个大的选择,有很多临时表创建的临时表(读取子查询)。

我尝试使用SET STATISTICS TIME ON,SET SHOWPLAN_ALL ON。

我希望隔离一大块需要花费大量时间而不确定如何操作的代码。

请帮忙。

PS:我确实尝试谷歌搜索,在Stackoverflow上搜索..........没有运气。这是我看过的一个问题 How to improve SQL Server query containing nested sub query

非常感谢任何帮助。提前致谢。

3 个答案:

答案 0 :(得分:2)

我会试用SQL Sentry的SQL Plan Explorer。它为您提供了查找问题的视觉帮助。它也是一个免费工具。它突出显示了占用大量I / O或CPU的比特,而不是通用百分比。

您可以在这里查看: http://www.sqlsentry.net/plan-explorer/sql-server-query-view.asp

埃里克

答案 1 :(得分:0)

我意识到你要求“时间”(多长时间),但也许你应该专注于“什么”。我的意思是,调整执行计划的结果。理想情况下,使用“显示执行计划”将为您带来最大的轰动。它会通过百分比来告诉你,它花费的资源最多。 如果您在SSMS 2008中,可以右键单击查询窗口并单击“包含执行计划”。

答案 2 :(得分:0)

在您的方案中,执行此操作的最佳方法是单独运行组件。请记住,以下内容主要与调优执行时间相关(在低意外/并发环境中)。在繁重的并发负载下,您可能还有其他优先级。

我必须定期对我必须调整的不同程序进行非常类似的分解。作为一项规则,我遵循的一般方法是:

1 - 进行基线运行

2 - 在返回当前时间的部分之间添加PRINTRAISERROR命令,以帮助确定哪些步骤花费的时间最长。

3 - 单独分解查询。我通常自己运行部分(省略JOIN条件)以查看方差是什么。如果它是一个非常长时间运行的查询,您可以向任何TOP添加SELECT子句以限制返回。只要你保持一致,这仍然会给你一个好主意。

4 - 调整步骤3中花费最多时间的组件。如果您有复杂的子查询,可能会为它们编制索引#temp表以查看是否有帮助。 CTE通常不会帮助提高性能,因此您可能也需要实现这些功能。