sys.dm_exec_query_memory_grants (Transact-SQL)
適用対象:SQL Server Analytics Platform System (PDW)
Azure SQL Database Azure Synapse Analytics (すべてのサポートされているバージョン)
要求され、メモリ許可を待機している、またはメモリ許可が与えられたすべてのクエリに関する情報を返します。 メモリ許可を必要としないクエリは、このビューには表示されません。 たとえば、並べ替え操作とハッシュ ORDER BY
結合操作にはクエリ実行用のメモリ許可があります。一方、 句のないクエリにはメモリ許可は与えされません。
このAzure SQL Database、動的管理ビューでは、データベースの格納に影響を与える情報を公開したり、ユーザーがアクセスできる他のデータベースに関する情報を公開したりすることはできません。 この情報が公開されるのを避けるために、接続されているテナントに属していないデータを含むすべての行がフィルター処理されます。さらに、列 、 の値scheduler_id
wait_order
pool_id
group_id
はフィルター処理され、列の値は NULL に設定されます。
Note
このコマンドを Azure Synapse Analytics または Analytics Platform System (PDW) から呼び出す場合は、 という名前を使用します sys.dm_pdw_nodes_exec_query_memory_grants
。 この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。
列名 | データの種類 | 説明 |
---|---|---|
session_id | smallint | このクエリを実行中のセッションの ID (SPID)。 |
request_id | int | 要求の ID。 セッションのコンテキスト内で一意です。 |
scheduler_id | int | このクエリのスケジュールを設定しているスケジューラの ID。 |
Dop | smallint | このクエリの並行処理の程度。 |
request_time | datetime | このクエリがメモリ許可を要求した日付と時刻。 |
grant_time | datetime | このクエリにメモリが許可された日付と時刻。 メモリがまだ許可されていない場合は NULL です。 |
requested_memory_kb | bigint | メモリの要求量の合計 (KB 単位)。 |
granted_memory_kb | bigint | 実際に許可されたメモリの総量 (KB 単位)。 メモリがまだ許可されていない場合、NULL になることがあります。 一般的な状況では、この値は と同じになります requested_memory_kb 。 インデックス作成では、最初に許可されたメモリ量を超えて、追加のオンデマンド メモリが許可される場合があります。 |
required_memory_kb | bigint | このクエリを実行するために必要な最小メモリ (KB 単位)。 requested_memory_kb は、この量と同じかそれより大きい値です。 |
used_memory_kb | bigint | この時点で使用されている物理メモリ (KB 単位)。 |
max_used_memory_kb | bigint | この時点までに使用された最大物理メモリ (KB 単位)。 |
query_cost | float | 推定クエリ コスト。 |
timeout_sec | int | このクエリがメモリ許可要求をやめるまでのタイムアウト (秒単位)。 |
resource_semaphore_id | smallint | このクエリが待機しているリソース セマフォの非一意の ID。 メモ:この ID は、2008 年より前のバージョンSQL Serverバージョンで一意SQL Serverです。 この変更は、クエリの実行のトラブルシューティングに影響する可能性があります。 詳細については、この記事の後半の「解説」セクションを参照してください。 |
queue_id | smallint | このクエリがメモリ許可を待機している待機キューの ID。 メモリが既に許可されている場合は NULL です。 |
wait_order | int | 指定した 内の待機中のクエリの順番 queue_id 。 この値は、他のクエリがメモリ許可またはタイム アウトを取得した場合に、特定のクエリに対して変更される可能性があります。メモリが既に許可されている場合は NULL。 |
is_next_candidate | bit | 次のメモリ許可の候補。 1 = はい 0 = いいえ NULL = メモリが既に許可されている |
wait_time_ms | bigint | 待機時間 (ミリ秒単位)。 メモリが既に許可されている場合は NULL です。 |
plan_handle | varbinary(64) | このクエリ プランの識別子。 を使用 sys.dm_exec_query_plan して、実際の XML プランを抽出します。 |
sql_handle | varbinary(64) | このクエリの Transact-SQLテキストの識別子。 をsys.dm_exec_sql_text 使用して、実際の Transact-SQL取得します。 |
group_id | int | このクエリが実行されているワークロード グループの ID。 |
pool_id | int | このワークロード グループが属するリソース プールの ID。 |
is_small | tinyint | 1 に設定すると、この許可で小さなリソース セマフォが使用されます。 0 に設定すると、通常のセマフォが使用されます。 |
ideal_memory_kb | bigint | 物理メモリ内にすべてを収めるために必要なメモリ許可のサイズ (KB 単位)。 これはカーディナリティの推定値に基づいています。 |
pdw_node_id | int | このディストリビューションが含まれるノードの識別子。 適用対象: Azure Synapse Analytics Analytics Platform System (PDW) |
reserved_worker_count | bigint | 予約済み ワーカー スレッドの数。 適用対象: SQL Server (SQL Server 2016 (13.x)) および Azure SQL Database |
used_worker_count | bigint | 現時点で 使用されている ワーカー スレッドの数。 適用対象: SQL Server (SQL Server 2016 (13.x)) および Azure SQL Database |
max_used_worker_count | bigint | この時点 まで使用された ワーカー スレッドの最大数。 適用対象: SQL Server (SQL Server 2016 (13.x)) および Azure SQL Database |
reserved_node_bitmap | bigint | ワーカー スレッドが予約されている NUMA ノード のビットマップ。 適用対象: SQL Server (SQL Server 2016 (13.x)) および Azure SQL Database |
アクセス許可
このSQL Serverアクセス許可がVIEW SERVER STATE
必要です。
このAzure SQL Database、データベースの 権限VIEW DATABASE STATE
が必要です。
注釈
または集計を含む動的管理ビュー ORDER BY
を使用するクエリは、メモリ消費量を増やし、トラブルシューティング中の問題の原因になります。
データベース管理者は、リソース ガバナー機能を使用することで、サーバー リソースを最大 64 個までのリソース プールに分散できます。 2008 SQL Server、各プールは小さな独立したサーバー インスタンスのように動作し、2 つのセマフォが必要です。 から返されるsys.dm_exec_query_resource_semaphores
行の数は、SQL Server 2005 (9.x) で返される行の 20 倍までになります。
例
クエリのタイム アウトの一般的なデバッグ シナリオでは、次の情報が調査される場合があります。
sys.dm_os_memory_clerks、sys.dm_os_sys_info、およびさまざまなパフォーマンス カウンターを使用して、全体的なシステム メモリ状態を調べます。
でクエリ実行メモリ予約を確認
sys.dm_os_memory_clerks
しますtype = 'MEMORYCLERK_SQLQERESERVATIONS'
。を使用して、許可を待機しているクエリ 1 を確認します 。
--Find all queries waiting in the memory queue SELECT * FROM sys.dm_exec_query_memory_grants WHERE grant_time IS NULL;
1 このシナリオの場合、待機の種類は一般的に RESOURCE_SEMAPHORE になります。 詳しくは「sys.dm_os_wait_stats (Transact-SQL)」をご覧ください。
sys.dm_exec_cached_plans (Transact-SQL) と sys.dm_exec_query_plan (Transact-SQL) を使用してクエリを検索する
-- retrieve every query plan from the plan cache USE master; GO SELECT * FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle); GO
ランナウェイ クエリが疑われる場合は、 列の Showplan
query_plan
query_plan
text
を sys.dm_exec_query_planから調べ、クエリ バッチを実行text
。 現在実行中のメモリを集中的に消費するクエリをさらに調べるには、次の sys.dm_exec_requests。--Active requests with memory grants SELECT --Session data s.[session_id], s.open_transaction_count --Memory usage , r.granted_query_memory, mg.grant_time, mg.requested_memory_kb, mg.granted_memory_kb, mg.required_memory_kb, mg.used_memory_kb, mg.max_used_memory_kb --Query , query_text = t.text, input_buffer = ib.event_info, query_plan_xml = qp.query_plan, request_row_count = r.row_count, session_row_count = s.row_count --Session history and status , s.last_request_start_time, s.last_request_end_time, s.reads, s.writes, s.logical_reads, session_status = s.[status], request_status = r.status --Session connection information , s.host_name, s.program_name, s.login_name, s.client_interface_name, s.is_user_process FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_requests AS r ON r.[session_id] = s.[session_id] LEFT OUTER JOIN sys.dm_exec_query_memory_grants AS mg ON mg.[session_id] = s.[session_id] OUTER APPLY sys.dm_exec_sql_text (r.[sql_handle]) AS t OUTER APPLY sys.dm_exec_input_buffer(s.[session_id], NULL) AS ib OUTER APPLY sys.dm_exec_query_plan (r.[plan_handle]) AS qp WHERE mg.granted_memory_kb > 0 ORDER BY mg.granted_memory_kb desc, mg.requested_memory_kb desc; GO