是否有替代 SET STATISTICS TIME 也显示语句的替代方法?
Posted
技术标签:
【中文标题】是否有替代 SET STATISTICS TIME 也显示语句的替代方法?【英文标题】:Is there an alternative to SET STATISTICS TIME which also shows the statements? 【发布时间】:2018-05-25 08:08:51 【问题描述】:SET STATISTICS TIME 语句仅在开发时有用,因为它可以对添加到查询或正在处理的 UDF/SP 的附加语句进行性能调整。但是,当必须对现有代码进行性能调整时,例如一个有成百上千行代码的 SP,这个语句的输出是完全没有用的,因为不清楚记录的时间属于哪个 SQL 语句。
是否有任何替代 SET STATISTICS TIME 也显示记录时间所属的语句?
【问题讨论】:
【参考方案1】:我建议使用高级工具。这是一次调用 sp 的示例,其中包含所有内部细节。在右侧,您有不同的运行历史记录,以后可以对其进行评论和分析。统计/索引使用/io/等待所需的一切 - 不同选项卡上的所有内容。实用工具:SentryOne Plan Explorer(免费)。
【讨论】:
【参考方案2】:如果您的存储过程是细粒度的,那么您可以使用此 DMV 来了解时间。
SELECT
DB_NAME(qs.database_id) AS DBName
,qs.database_id
,qs.object_id
,OBJECT_NAME(qs.object_id,qs.database_id) AS ObjectName
,qs.cached_time
,qs.last_execution_time
,qs.plan_handle
,qs.execution_count
,total_worker_time
,last_worker_time
,min_worker_time
,max_worker_time
,total_physical_reads
,last_physical_reads
,min_physical_reads
,max_physical_reads
,total_logical_writes
,last_logical_writes
,min_logical_writes
,max_logical_writes
,total_logical_reads
,last_logical_reads
,min_logical_reads
,max_logical_reads
,total_elapsed_time
,last_elapsed_time
,min_elapsed_time
,max_elapsed_time
FROM
sys.dm_exec_procedure_stats qs
【讨论】:
【参考方案3】:我将创建一个类似于以下的扩展事件会话:
CREATE EVENT SESSION [proc_statments] ON SERVER
ADD EVENT sqlserver.module_end(
WHERE ([object_name]=N'usp_foobar')
),
ADD EVENT sqlserver.sp_statement_completed(
SET collect_object_name=(1),collect_statement=(1)
WHERE ([object_name]=N'usp_foobar'))
ADD TARGET package0.event_file(SET filename=N'proc_statments')
WITH (TRACK_CAUSALITY=ON)
GO
这会跟踪名为usp_foobar
的过程的存储过程和存储过程语句的完成情况。在事件本身中,有一个标识符可以帮助您将执行特定过程(这就是 TRACK_CAUSALITY
的用途)所执行的语句联系在一起。
【讨论】:
以上是关于是否有替代 SET STATISTICS TIME 也显示语句的替代方法?的主要内容,如果未能解决你的问题,请参考以下文章
sql查询性能调试,用SET STATISTICS IO和SET STATISTICS TIME---解释比较详细
SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON