動的なT-SQL
ステートメントを生成する関数があります。生成されたコードは、ストアドプロシージャで実行されます。
生成されたコードの実行時間に関する統計と、IO統計(論理的/物理的読み取りなど))をログに記録したいと思います。
これを行うために、動的なT-SQL
ステートメントを作成している関数で、最後のステートメントに次の行を追加します。
SET @A = @A + '--' + REPLACE('F2B287FD-1419-48DB-9881-4AA77B99450E', '-', '');
次に、次のクエリを使用して統計を検索しています。
SELECT *
FROM [sys].[dm_exec_query_stats] QS
CROSS APPLY [sys].[dm_exec_sql_text] (QS.[sql_handle]) ST
WHERE ST.[dbid] = DB_ID()
AND ST.[text] LIKE '%F2B287FD141948DB98814AA77B99450E%';
しかし、何も見つかりません。
コードはsp_executesql
プロシージャを介して実行されます。誰かが私のクエリの何が問題なのか、または特定のクエリのIO
を検出する別の方法を教えてもらえますか。
問題の原因は、WHERE
句のST.[dbid] = DB_ID()
です。
AdventureWorks
からあなたがやろうとしていると私が信じていることの基本的な例を取り上げました。
_USE AdventureWorks;
GO
DECLARE @sql NVARCHAR(2000);
SET @SQL = 'SELECT TOP 10 * FROM Person.Person';
SET @SQL = @SQL + '--' + REPLACE('F2B287FD-1419-48DB-9881-4AA77B99450E', '-', '');
EXEC sys.sp_executesql @sql;
_
dm_exec_sql_text()
DMVからdbid
値を取得しようとすると、実際にはこのクエリのNULL
であるため、すぐに除外されます。
ただし、dm_exec_plan_attributes()
DMV、_WHERE attribute = 'dbid'
_を使用すると、現在のデータベースの正しいDBID()値を取得できます。
これは、この情報を取得するための現在の頼りになるクエリです。
_ SELECT
deqs.plan_handle AS PlanHandle
,deqs.query_hash AS QueryHash
,dest.dbid
,DB_NAME(CAST(depa.value AS SMALLINT)) AS DatabaseName
,OBJECT_SCHEMA_NAME(dest.objectid, CAST(depa.value AS INT)) AS SchemaName
,OBJECT_NAME(dest.objectid, CAST(depa.value AS INT)) AS ObjectName
,MAX(last_execution_time) AS LastExecuted
,deqs.creation_time AS PlanCreationTime
,SUM(deqs.execution_count) AS Executions
,SUM(total_elapsed_time) AS SumDuration
,CAST(100.0 * SUM(total_elapsed_time)
/ SUM(SUM(total_elapsed_time)) OVER() AS NUMERIC(5,2)) AS PctDuration
,SUM(total_worker_time) AS SumCPU
,CAST(100.0 * SUM(total_worker_time)
/ SUM(SUM(total_worker_time)) OVER() AS NUMERIC(5,2)) AS PctCPU
,SUM(total_logical_reads + total_logical_writes + total_physical_reads) AS [SumIO]
,CAST(100.0 * SUM(total_logical_reads + total_logical_writes + total_physical_reads)
/ SUM(SUM(total_logical_reads + total_logical_writes + total_physical_reads)) OVER() AS NUMERIC(5,2)) AS PctIO
,Q.statementtext
,deqs.query_plan_hash AS QueryPlanHash
,SUM(total_rows) AS RowsAffected
,MAX(statement_start_offset) statement_start_offset
,MAX(statement_end_offset) statement_end_offset
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
CROSS APPLY sys.dm_exec_plan_attributes(plan_handle) AS depa
CROSS APPLY (VALUES (SUBSTRING(dest.text, (deqs.statement_start_offset/2)+1,
((CASE deqs.statement_end_offset WHEN -1 THEN DATALENGTH(dest.text)
ELSE deqs.statement_end_offset
END - deqs.statement_start_offset)/2)+1))) AS Q(statementtext)
WHERE deqs.last_execution_time > DATEADD(dd, -1, GETDATE())
AND depa.attribute = 'dbid'
AND Q.statementtext LIKE '%F2B287FD141948DB98814AA77B99450E%'
GROUP BY
dest.text, Q.statementtext, deqs.plan_handle, deqs.creation_time,
dest.objectid, deqs.query_hash, deqs.query_plan_hash, depa.value, dest.dbid;
_