本日(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で設定します。オブジェクトエクスプローラーから、データベースメールを右クリックし、データベースメールの設定をクリックします。
赤枠の部分を選択し、Next をクリックします。
プロファイルを設定し、Add をクリックします。
今回は hotmail を使って、メールを送信します。下図のように設定します。
Next をクリックします。
Next をクリックします。
Finish をクリックします。
Close をクリックします。
テストメールを送信してみましょう。データベースメールを右クリックし、テストメールの送信をクリックします。
送信先アドレスを設定し、テストメール送信をクリックします。
私が愛用している、Outlook.com で送信されたメールを参照してみましょう。メールが届いていますね。
次にクエリの結果を送信してみたいと思います。クエリの結果をそのまま送信するには、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 ;
再度、私が愛用している、Outlook.com で送信されたメールを参照してみましょう。メールが届いています。何やら、添付ファイルがありますね。開いてみましょう。
クエリの結果ですね。
このようなプレッシャーのかかるメールを定期的に受信しなくてもいいように、パフォーマンスを意識したクエリを書きましょう。