2016-05-22 7 views
0

私は数日前にいくつかのDMV/DMFと.sysテーブル(主にsys.dm_exec_query_statsのもの)を使用してCPU集中クエリを見つけるために書いたSQLスクリプトを持っています。しかし、私のSELECT文で(BOL、様々なブログで見つかった)私は、次を使用していた時点で実行された正確なSQL文を決定する : ,SUBSTRING(t.text,s.statement_start_offset/2 +1, (CASE WHEN s.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), t.text)) * 2 ELSE s.statement_end_offset END - s.statement_start_offset)/2) AS 'TSQL-Query'sys.dm_exec_sql_textからSQLステートメントを特定します。

「s.statement_start_offsetは」最初である理由誰かが説明してもらえ2で割った後、1で足したか? LEN()ス​​テートメントに2を掛けたのはなぜですか?

私はこれらの例を多くのブログやMSDNでも見ていますが、これらの詳細を見つけることはできません。

さらに大きな画像を得るために私の下のスクリプト全体を含めました。

SELECT TOP 20 
    COALESCE(DB_NAME(t.dbid), 
       DB_NAME(CAST(a.value as int))) AS DBNAME         
    ,SUBSTRING(t.text,s.statement_start_offset/2 +1,          
       (CASE WHEN s.statement_end_offset = -1 
         THEN LEN(CONVERT(NVARCHAR(MAX), t.text)) * 2 
         ELSE s.statement_end_offset END - 
         s.statement_start_offset)/2)          
         AS 'TSQL-Query' 
    ,s.execution_count AS 'Execution Count' 
    ,s.total_worker_time AS 'Total CPU' 
    ,s.total_worker_time/s.execution_count AS 'Avg CPU (ms)'  
    ,s.total_physical_reads AS 'Total Physical Reads' 
    ,s.total_physical_reads/s.execution_count AS 'Avg Physical Reads' 
    ,s.total_logical_reads AS 'Total Logical Reads' 
    ,s.total_logical_reads/s.execution_count AS 'Avg Logical Reads' 
    ,s.total_logical_writes AS 'Total Logical Writes' 
    ,s.total_logical_writes/s.execution_count AS 'Avg Logical Writes' 
    ,s.total_elapsed_time AS 'Total Duration (ms)' 
    ,s.total_elapsed_time/s.execution_count AS 'Avg Duration/execution (ms)' 
    ,p.query_plan AS 'ExecutionPlan' 
    ,(SELECT sqlserver_start_time FROM sys.dm_os_sys_info) as 'Last Reboot' 
    ,GETDATE() AS 'TimeStamp' 
FROM sys.dm_exec_query_stats AS s              
CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) AS t          
CROSS APPLY sys.dm_exec_query_plan(s.plan_handle) AS p         
OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS a         
WHERE attribute = 'dbid' 
ORDER BY s.total_worker_time DESC 

答えて

0

sys.dm_exec_sql_text関数から返されるデータがUnicodeであるためです。 1文字は2バイト必要です。 SUBSTRINGは、文字データ型(バイトではない)で機能します。だから、textの中にあるSQLクエリの最初の文字の位置を持つために、バイト数を2 + 1で割る必要があります。

関連する問題