[SQL Azure] 頻繁に実行されるクエリのパフォーマンスを監視する便利なスクリプト


こんにちは、Windows Azure サポートチームです。今回は SQL Azure の頻繁に実行されるクエリのパフォーマンスを監視する便利なスクリプトについてご案内します。

SQL Azureに限らず SQL Server でも使えるスクリプトですが、プロファイラを現在使うことのできない SQL Azureでは下記のスクリプトが便利です。このスクリプトを使うと、頻繁に実行されるクエリをその頻度の順番で最大10個まで出力させることができます。(ただし、データベースごとの出力内容となります。)

パフォーマンスを監視するクエリ

 SQL Azureに限らず SQL Server でも使えるスクリプトですが、プロファイラを現在使うことのできない SQL Azureでは下記のスクリプトが便利です。このスクリプトを使うと、頻繁に実行されるクエリをその頻度の順番で最大10個まで出力させることができます。(ただし、データベースごとの出力内容となります。)

create table #t 
( 
  query_hash varbinary(64), 
  query_plan_hash varbinary(64), 
  num_cache_entries bigint, 
  execution_count bigint, 
  min_creation_time datetime, 
  max_last_execution_time datetime, 
  total_worker_time bigint, 
  min_worker_time bigint, 
  max_worker_time bigint, 
  avg_worker_time float 
) 
go 


insert into #t 
select top 10 
  query_hash, 
  query_plan_hash, 
  count(*) as num_cache_entries, 
  sum(execution_count) as execution_count, 
  min(creation_time) as min_creation_time, 
  max(last_execution_time) as max_last_execution_time, 
  sum(total_worker_time) as total_worker_time, 
  min(min_worker_time) as min_worker_time, 
  max(max_worker_time) as max_worker_time, 
  sum(total_worker_time) / sum(execution_count) as avg_worker_time 
from sys.dm_exec_query_stats 
group by query_hash, query_plan_hash 
order by total_worker_time desc; 

declare @query_hash varbinary(64), @query_plan_hash varbinary(64) 
declare @query_num int = 1 
declare c1 cursor for select query_hash, query_plan_hash from #t 
open c1 
fetch next from c1 into @query_hash, @query_plan_hash; 
while @@fetch_status = 0 

begin 
  select top 1 
    @query_num as query_rank, 
    s.*, 
    p.*, 
    replace (replace (substring (st.[text], s.statement_start_offset/2 + 1, 
  case when s.statement_end_offset = -1 then len (convert(nvarchar(max), st.[text])) 
  else s.statement_end_offset/2 - s.statement_start_offset/2 + 1 
  end), char(13), ' '), char(10), ' ') as sample_statement_text 
  from sys.dm_exec_query_stats s 
    cross apply sys.dm_exec_query_plan(s.plan_handle) as p 
    cross apply sys.dm_exec_sql_text(s.sql_handle) as st 
  where s.query_hash = @query_hash 
    and s.query_plan_hash = @query_plan_hash; 

  fetch next from c1 into @query_hash, @query_plan_hash; 
  select @query_num = @query_num + 1; 
end 
deallocate c1 
go 

drop table #t 
go 

参考情報

出力される各列の詳細については以下を参照ください。

また、Windows Azure / SQL Azure のサポートについては、以下を参照ください。


Sr. Support Escalation Engineer
Kayoko Gray

Comments (0)

Skip to main content