動的管理ビューを使用した SQL Azure の監視

Windows Azure Platform

Microsoft SQL Azure データベースでは、動的管理ビューの一部を使用してパフォーマンスの問題を診断することができます。パフォーマンスの問題の原因としては、クエリのブロック、時間がかかるクエリの実行、リソースのボトルネック、非効率的なクエリ プランなどがあります。このトピックでは、SQL Azure で動的管理ビューを使用して、一般的なパフォーマンスの問題を検出する方法について説明します。

SQL Azure は、3 つのカテゴリの動的管理ビューを部分的にサポートします。

  • データベース関連の動的管理ビュー。
  • 実行関連の動的管理ビュー。
  • トランザクション関連の動的管理ビュー。

SQL Azure で完全にサポートされている動的管理ビューについては、「システム ビュー (SQL Azure データベース)」を参照してください。動的管理ビューの詳細については、SQL Server オンライン ブックの「動的管理ビューおよび関数 (Transact-SQL)」を参照してください。

アクセス許可

SQL Azure で動的管理ビューをクエリするには、VIEW DATABASE STATE アクセス許可が必要です。VIEW DATABASE STATE アクセス許可は、現在のデータベース内のすべてのオブジェクトに関する情報を返します。

VIEW DATABASE STATE アクセス許可を特定のデータベース ユーザーに付与するには、次のクエリを実行します。

GRANT VIEW DATABASE STATE TO database_user;

オンプレミス SQL Server の場合、動的管理ビューはサーバーの状態情報を返します。SQL Azure の動的管理ビューは、現在の論理データベースに関する情報だけを返します。

注意

データベースに対して VIEW DATABASE STATE アクセス許可を持つ場合は、sys.dm_exec_requests ビューと sys.dm_exec_sessions ビューを実行すると、データベースのすべての実行中のセッションが表示されます。このアクセス許可を持たない場合は、現在のセッションのみが表示されます。

 

データベース サイズの計算

SQL Azure データベースは、エディションと容量に対して課金されます。データベースのサイズが MAXSIZE に達すると、エラー コード 40544 が発生します。その場合は、データベースの MAXSIZE を更新するか、データを削除しない限り、データを挿入または更新したり、新しいオブジェクト (テーブル、ストアド プロシージャ、ビュー、関数など) を作成することはできません。詳細については、「SQL Azure の課金情報」を参照してください。sys.dm_db_partition_stats ビューは、データベース内のパーティションごとにページおよび行カウント情報を返します。この情報を使用して、データベース サイズを計算できます。

次のクエリは、データベースのサイズ (メガバイト単位) を返します。

-- Calculates the size of the database. 



SELECT SUM(reserved_page_count)*8.0/1024



FROM sys.dm_db_partition_stats; 



GO

次のクエリは、データベース内の個々のオブジェクトのサイズ (メガバイト単位) を返します。

-- Calculates the size of individual database objects. 



SELECT sys.objects.name, SUM(reserved_page_count) * 8.0 / 1024



FROM sys.dm_db_partition_stats, sys.objects 



WHERE sys.dm_db_partition_stats.object_id = sys.objects.object_id 



GROUP BY sys.objects.name; 



GO

接続の監視

sys.dm_exec_connections (SQL Azure データベース) ビューを使用して、特定の SQL Azure サーバーに対して確立された接続に関する情報と、各接続の詳細を取得できます。また、すべてのアクティブ ユーザー接続および内部タスクに関する情報を取得するには、sys.dm_exec_sessions ビューが役立ちます。

次のクエリは、現在の接続に関する情報を取得します。

-- monitor connections

SELECT

      e.connection_id,

      s.session_id,

      s.login_name,

      s.last_request_end_time,

      s.cpu_time

FROM

      sys.dm_exec_sessions s

      INNER JOIN sys.dm_exec_connections e

      ON s.session_id = e.session_id

GO

クエリ パフォーマンスの監視

低速のクエリまたは時間がかかるクエリは、かなり多くのシステム リソースを消費します。このセクションでは、動的管理ビューを使用して、いくつかの一般的なクエリ パフォーマンスの問題を検出する方法について説明します。詳細については、Microsoft TechNet の「SQL Server 2005 のパフォーマンスの問題のトラブルシューティング」の記事を参照してください。

上位 N クエリの検出

次の例は、平均 CPU 時間に基づいてクエリを順位付けし、その上位 5 つに関する情報を返します。この例は、クエリ ハッシュに基づいてクエリを集計します。このため、論理的に同じクエリがグループ化されて累積リソース消費量が求められます。

-- Find top 5queries

SELECT TOP 5 query_stats.query_hash AS "Query Hash", 

    SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",

    MIN(query_stats.statement_text) AS "Statement Text"

FROM 

    (SELECT QS.*, 

    SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,

    ((CASE statement_end_offset 

        WHEN -1 THEN DATALENGTH(st.text)

        ELSE QS.statement_end_offset END 

            - QS.statement_start_offset)/2) + 1) AS statement_text

     FROM sys.dm_exec_query_stats AS QS

     CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats

GROUP BY query_stats.query_hash

ORDER BY 2 DESC;

GO

クエリのブロックの監視

低速のクエリまたは時間がかかるクエリは、過度にリソースを消費するため、ブロックされてしまう可能性があります。ブロックの原因としては、アプリケーション設計の貧弱さ、クエリ プランの不良、有効なインデックスの欠如などがあります。sys.dm_tran_locks ビューを使用すると、SQL Azure データベースの現在のロック アクティビティに関する情報を取得できます。サンプル コードについては、SQL Server オンライン ブックの「sys.dm_tran_locks (Transact-SQL)」を参照してください。

クエリ プランの監視

非効率的なクエリ プランも CPU 消費量の増加につながることがあります。次の例は、sys.dm_exec_query_stats ビューを使用して、累積 CPU 使用量が最も多いクエリを特定します。

-- Monitor query plans

SELECT

    highest_cpu_queries.plan_handle,  

    highest_cpu_queries.total_worker_time, 

    q.dbid, 

    q.objectid, 

    q.number, 

    q.encrypted, 

    q.[text] 

FROM 

    (SELECT TOP 50  

        qs.plan_handle,  

        qs.total_worker_time 

     FROM 

        sys.dm_exec_query_stats qs 

     ORDER BY qs.total_worker_time desc) AS highest_cpu_queries 

     CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS q 

ORDER BY highest_cpu_queries.total_worker_time desc

参照

概念

Administration (SQL Azure データベース)

SQL Azure データベースの概念

ページのトップへ