SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

拡張イベントのクエリ/プランハッシュを DMV と対応付けられるように変換

leave a comment

拡張イベントでクエリの情報を取得した際にクエリやプランのハッシュを取得できるのですが、取得できる値は UINT64 の値となっているようで、DMV から取得できるハッシュの値と対応することができません。

この時に変換する方法として、以下の情報が参考になります。
Correlating XE query_hash and query_plan_hash to sys.dm_exec_query_stats in order to retrieve Execution plans for high Resource statements.
Query hash and plan hash conversions

シンプルに変換するなら、以下のようなクエリになるのでしょうかね。

-- xEvent to DMV
DECLARE @query_hash decimal(20,0) = 9974222887417559106

DECLARE @msb BIGINT = 0x8000000000000000 -- @msb = -9223372036854775808

SELECT
	CASE WHEN @query_hash < CONVERT(DECIMAL(20,0), @msb)*-1
	THEN CONVERT(BINARY(8), CONVERT(BIGINT, @query_hash))
	ELSE CONVERT(BINARY(8), CONVERT(BIGINT, @query_hash - CONVERT(DECIMAL(20,0), @msb) * -1) | @msb)
	END AS dmv_query_hash
GO

-- DMV to xEvent
DECLARE @query_hash BINARY(8) = 0x8A6B8EDED3183842
DECLARE @msb BIGINT = 0x8000000000000000

SELECT
	CASE WHEN @query_hash < 0x8000000000000000
	THEN CONVERT(bigint, @query_hash)
	ELSE (((CONVERT(bigint, @query_hash) * -1) | @msb) * -1) + (CONVERT(DECIMAL(20,0), @msb) * -1)
	END AS xEvent_query_hash
GO

Written by masayuki.ozawa

8月 12th, 2016 at 12:03 am

Posted in SQL Server

Tagged with

Leave a Reply

*