動的管理ビューを使用した 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 データベース)
ページのトップへ