在一个用于统计一个查询语句所耗费的CPU时间以及相应语句和其他统计值的例子里,经常会看到以下这么一个例子,但是我对其中statement_start_offset/2不是很明白。
SELECT TOP 10 execution_count [Number of Executions],
total_worker_time/execution_count AS [Average CPU Time],
Total_Elapsed_Time/execution_count as [Average Elapsed Time],
(SELECT SUBSTRING(text,statement_start_offset/2,
(CASE WHEN statement_end_offset = -1 then
LEN(CONVERT(nvarchar(max), text)) * 2
ELSE statement_end_offset
end -statement_start_offset)/2)FROM sys.dm_exec_sql_text(sql_handle)) AS query_text
FROM sys.dm_exec_query_stats
ORDER BY [Average CPU Time] DESC请高手帮忙解释一下:statement_start_offset/2(或者网上查询的statement_start_offset/2+1的用法 )不太明白为什么这里statement_start_offset需要除2

解决方案 »

  1.   

    statement_start_offest 和statement_end_offset的值需要除以2来补偿SQL Server使用Unicode来存储这种数据的。statement_end_offse值为-1指出语句先前到了批的最后。而substring()函数不识别-1,并将其作为非法值。使用(<statement_end_offset> -<statement_start_offset>)/2,代替-1,一个需要输入64000的值,来确认语句覆盖了所有的情况。通过这种方法,长时间运行或资源消费语句可以被过滤出大型的存储过程或批。
      

  2.   

    具体请看:
    http://www.onegreen.net/Article/Database/SQLServer/SQLServer7/14991_5.html