我正在调整存储过程。它是一个巨大的存储过程并连接有大约6-7百万条记录的表。
我的问题是如何确定在proc组件中花费的时间。 proc有一个大的选择,有很多临时表创建的临时表(读取子查询)。
我尝试使用SET STATISTICS TIME ON,SET SHOWPLAN_ALL ON。
我希望隔离一大块需要花费大量时间而不确定如何操作的代码。
请帮忙。
PS:我确实尝试谷歌搜索,在Stackoverflow上搜索..........没有运气。这是我看过的一个问题 How to improve SQL Server query containing nested sub query非常感谢任何帮助。提前致谢。
答案 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 - 在返回当前时间的部分之间添加PRINT
或RAISERROR
命令,以帮助确定哪些步骤花费的时间最长。
3 - 单独分解查询。我通常自己运行部分(省略JOIN
条件)以查看方差是什么。如果它是一个非常长时间运行的查询,您可以向任何TOP
添加SELECT
子句以限制返回。只要你保持一致,这仍然会给你一个好主意。
4 - 调整步骤3中花费最多时间的组件。如果您有复杂的子查询,可能会为它们编制索引#temp
表以查看是否有帮助。 CTE
通常不会帮助提高性能,因此您可能也需要实现这些功能。