都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

SQL Server のチューニングについてまとめてみる - その4 - ( クエリパフォーマンスの結果をメールで送る )

 本日(7/10)は関東地方に台風が迫ってますね。関東のみなさま、早めに帰宅しましょう。台風はさておき、クエリのパフォーマンスを DMV から取得することはよくやりますよね?今回は、毎日定期レポート的にパフォーマンスの結果をメールに送信するようなことをやってみたいと思います。( 私はこんなメール受信したくないですけどww ) クエリパフォーマンスに関してはよく使用する下記のクエリで取得することが可能です。

SELECT [平均実行時間(msec)] = total_elapsed_time / execution_count / 1000.00,
[平均CPU時間(msec)] = total_worker_time / execution_count / 1000.00,
[平均物理I/O数] = total_physical_reads / execution_count,
[平均論理I/O数] = (total_logical_reads + total_logical_writes)/ execution_count,
[SQL文] = SUBSTRING(est.text, (statement_start_offset / 2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(est.text)
ELSE statement_end_offset
END - statement_start_offset) / 2) + 1)
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS est

 SQL Server からメールを送るには、SQL Server Management Studioで設定します。オブジェクトエクスプローラーから、データベースメールを右クリックし、データベースメールの設定をクリックします。

f:id:koogucc11:20140710202257p:plain

 赤枠の部分を選択し、Next をクリックします。

f:id:koogucc11:20140710203108p:plain

 プロファイルを設定し、Add をクリックします。

f:id:koogucc11:20140710203307p:plain

 今回は hotmail を使って、メールを送信します。下図のように設定します。

f:id:koogucc11:20140710203906p:plain

 Next をクリックします。

f:id:koogucc11:20140710204057p:plain

 Next をクリックします。

f:id:koogucc11:20140710204226p:plain

 Finish をクリックします。

f:id:koogucc11:20140710204351p:plain

 Close をクリックします。

f:id:koogucc11:20140710204526p:plain

 テストメールを送信してみましょう。データベースメールを右クリックし、テストメールの送信をクリックします。

f:id:koogucc11:20140710204711p:plain

 送信先アドレスを設定し、テストメール送信をクリックします。

f:id:koogucc11:20140710204852p:plain

 私が愛用している、Outlook.com で送信されたメールを参照してみましょう。メールが届いていますね。

f:id:koogucc11:20140710205404p:plain

 次にクエリの結果を送信してみたいと思います。クエリの結果をそのまま送信するには、sp_send_dbmail を使用します。

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'dbmailtest',
@recipients = 'xxxxxxxxx@hotmail.com',
@query = 'SELECT [平均実行時間(msec)] = total_elapsed_time / execution_count / 1000.00,
[平均CPU時間(msec)] = total_worker_time / execution_count / 1000.00,
[平均物理I/O数] = total_physical_reads / execution_count,
[平均論理I/O数] = (total_logical_reads + total_logical_writes)/ execution_count,
[SQL文] = SUBSTRING(text, (statement_start_offset / 2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(text)
ELSE statement_end_offset
END - statement_start_offset) / 2) + 1)
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)' ,
@subject = 'Slow...',
@attach_query_result_as_file = 1 ;

f:id:koogucc11:20140710211047p:plain

 再度、私が愛用している、Outlook.com で送信されたメールを参照してみましょう。メールが届いています。何やら、添付ファイルがありますね。開いてみましょう。

f:id:koogucc11:20140710211643p:plain

 クエリの結果ですね。

f:id:koogucc11:20140710211915p:plain

 このようなプレッシャーのかかるメールを定期的に受信しなくてもいいように、パフォーマンスを意識したクエリを書きましょう。