SE の雑記

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

拡張イベントを使用した SQL Database の簡易 SQL Server Profiler

one comment

で知ったのですが、SQL Database で拡張イベントがサポートされました。
Public preview: Extended Events for Azure SQL Database
Extended events in SQL Database
永続化ファイルとしては、Azure ストレージを使用できるようですので、情報のロギングも可能となっています。

現状、SQL Database では、SQL Server Profiler を使用することはできませんが、拡張イベントを使用することでクエリを取得することができますので、軽くまとめてみたいと思います。

今のところ SSMS の GUI は使えないようなのでクエリベースで拡張イベントを管理する必要があります。
※ SQL Server 2016 CTP 2.4 の SSMS であれば GUI を使うことはできました。ただし削除やプロパティの表示ができなかったので、今のところは、クエリベースで操作した方がよさそうです。

SQL Server 2012 / 2014 の GUI の設定をスクリプト化すれば基本構文は流用はできますので、それほど難易度は高くないかと。

最初に、以下のようなクエリで、クエリの完了を取得する拡張イベントを作成します。

IF EXISTS(SELECT * from sys.database_event_sessions WHERE name = 'eventsession_gm_azuresqldb51')
	DROP EVENT SESSION eventsession_gm_azuresqldb51 ON DATABASE;

CREATE EVENT SESSION eventsession_gm_azuresqldb51 ON DATABASE
ADD EVENT 
sqlserver.sql_batch_starting (ACTION (sqlserver.sql_text))
ADD TARGET
package0.ring_buffer (SET max_memory = 500)   -- Units of KB
GO

 

上記のクエリではリングバッファーに出力をしていますので、ファイルとしては出力されておらず、情報はメモリ上に一時的に格納されています。

次に以下のクエリを実行して作成した拡張イベントを開始します。

ALTER EVENT SESSION eventsession_gm_azuresqldb51 ON DATABASE
STATE = START;
GO

 

これで、SQL Database に対して実行されたクエリが拡張イベントに取得されますので、冒頭で紹介したドキュメントに記載されている以下のクエリを実行します。

SELECT
        se.name  AS [session-name],
        ev.event_name,
        ac.action_name,
        st.target_name,
        se.session_source,
        st.target_data,
        CAST(st.target_data AS XML)  AS [target_data_XML]
    FROM
                   sys.dm_xe_database_session_event_actions  AS ac
        INNER JOIN sys.dm_xe_database_session_events         AS ev  ON ev.event_name            = ac.event_name
                                                                   AND ev.event_session_address = ac.event_session_address
        INNER JOIN sys.dm_xe_database_session_object_columns AS oc  ON oc.event_session_address = ac.event_session_address
        INNER JOIN sys.dm_xe_database_session_targets        AS st  ON st.event_session_address = ac.event_session_address
        INNER JOIN sys.dm_xe_database_sessions               AS se  ON ac.event_session_address = se.address
    WHERE
        oc.column_name = 'occurrence_number'
        AND
        se.name        = 'eventsession_gm_azuresqldb51'
        AND
        ac.action_name = 'sql_text'
    ORDER BY
        se.name,
        ev.event_name,
        ac.action_name,
        st.target_name,
        se.session_source;
GO

 

実行結果の XML 部分がリンクになっていますので、クリックします。

image

そうすると、拡張イベントを開始してから実行されたクエリで、リングバッファーにログが取得されているものを確認することができます。

image

確認が終わったら以下のクエリで拡張イベントを停止します。

ALTER EVENT SESSION eventsession_gm_azuresqldb51 ON DATABASE
STATE = STOP;
GO

 

リングバッファーの場合、取得されたデータはメモリ上のデータとなりますので、停止をするとそれまでに取得されていた情報は破棄される形になります。

後でもう一度確認したい場合には Azure ストレージを使用した設定にする必要があるかと。

どのようなイベントが使用できるかは後程調べてみたいと思います。

Written by masayuki.ozawa

10月 13th, 2015 at 12:50 pm

Posted in SQL Database

Tagged with

One Response to '拡張イベントを使用した SQL Database の簡易 SQL Server Profiler'

Subscribe to comments with RSS or TrackBack to '拡張イベントを使用した SQL Database の簡易 SQL Server Profiler'.

  1. […] 拡張イベントを使用した SQL Database の簡易 SQL Server Profiler […]

Leave a Reply

*