Sql server 获得;将统计信息io设置为“开”;在t-sql中进行调优的结果

Sql server 获得;将统计信息io设置为“开”;在t-sql中进行调优的结果,sql-server,performance,tsql,io,statistics,Sql Server,Performance,Tsql,Io,Statistics,我想将监视功能添加到涉及许多存储过程的复杂流程中。 在某些情况下,我希望捕获单个语句生成的逻辑读取数 换句话说,我想打开设置统计io,访问(并将结果保存到日志表)SSMS中“消息”选项卡中通常显示的内容 我看到它可以在.Net中使用SqlInfoMessageEventHandler完成。我确信它也可以在T-SQL中完成,但我还没有找到它 谢谢 sys.dm_exec_请求中的逻辑_读取也没有增加 对我来说,完美的解决方案是以某种方式捕获“设置统计io on”信息: select name,

我想将监视功能添加到涉及许多存储过程的复杂流程中。 在某些情况下,我希望捕获单个语句生成的逻辑读取数

换句话说,我想打开
设置统计io,访问(并将结果保存到日志表)SSMS中“消息”选项卡中通常显示的内容

我看到它可以在.Net中使用SqlInfoMessageEventHandler完成。我确信它也可以在T-SQL中完成,但我还没有找到它

谢谢


sys.dm_exec_请求中的逻辑_读取也没有增加

对我来说,完美的解决方案是以某种方式捕获“设置统计io on”信息:

select name, id
    from   sysobjects
    union all 
    select name,id
    from   sysobjects  ;


(120 row(s) affected)
Table 'sysschobjs'. Scan count 2, logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
一种方法是使用,可在2008年及以后使用。例如,要确定查询完成的读取次数,可以:

declare @start_reads bigint
select @start_reads = reads from sys.dm_exec_requests where session_id = @@spid

-- Your query here 

select reads - @start_reads from sys.dm_exec_requests where session_id = @@spid
基本上有两种类型的计数器:

  • \u会话
    视图中的计数器在当前批处理完成后递增
  • 批处理运行时,
    \u exec\u
    计数器从0开始递增

谢谢!看起来方向正确,但我这里有两个问题:1。“读取”列未被更新。也许这里只暴露了物理读数?2.当我在两个表之间进行连接时,“set statistics io”选项显示引擎对每个表进行的逻辑读取次数。您建议的技术不会公开此类信息。是的,尤其是如果您运行两次查询,它将被缓存,并且不需要进行
读取。您可以改为检查
cpu\u time
,但要确保查询使用了可测量的cpu量。对于逻辑读取,请检查
logical\u reads
列。